引言:
理论上的可计算与现实上的可计算:
理论上的可计算——可计算性理论
现实上的可计算——计算复杂性理论
几个例子:
关于例2,如果采用蛮力算法—穷举法,则可能的非负整数解的个数为
根据Stirling公式
可得
对于排序算法的评价:
已有的排序算法:考察元素比较次数
插入排序、冒泡排序:最坏和平均状况下都为O(n^2)
快速排序:最坏状况为O(n^2),平均状况下为O(nlogn)
堆排序、二分归并排序:最坏和平均状况下都为 最坏和平均状况下都为O(nlogn)
问题
哪个排序算法效率最高?
是否可以找到更好的算法?排序问题的计算难度如何估计?
货郎问题:
如何在带权完全图G中寻找一条Hamilton回路?
该问题至今没有找到一种算法相比于蛮力算法在计算复杂度有着本质的改进。
好的算法,指的是计算效率高,即计算复杂度低;对储存空间的占用最少,也可以认为对存储空间的利用率高。
可计算性理论:
研究目标:确实什么问题是可计算的,即存在求解算法
合理的计算模型:
已有的:递归函数、Turing Machine、lambda演算?、post系统?
条件:计算每个函数只需要有限条指令;
每条指令可以由模型中有限个计算步骤完成;
指令的执行过程是确定的;
算法至少具有指数时间:理论上可计算: ——难解的
多项式时间的算法:现实上可计算——多项式时间可解的
对数多项式时间的算法 :高度并行可计算——高度并行可解的
问题的定义:
问题:指的是需要回答的一般性提问,通常含有若干个参数
问题所包含的的内容:指出了参数所满足的条件,以及解的范围
问题的实例:对问题的参数的一组赋值
一个问题是由它的全部实例所构成
算法的定义:
算法非形式定义:有限条指令的序列,确立了解决某个问题的运算或者操作,输入个数大雨或等于0,输出个数大于0
算法的形式定义:对于有效输入在有限时间内停机的Turing Machine
算法A解决问题P:对于问题P的任何实例输入,都能在有限时间内停机,并输出正确的结果
伪代码——算法的描述
保持程序的主要结构;
赋值语句:<-
分支语句:if...then...[else]
循环语句:while,for.repeat...until
转向语句:goto
注释语句://...
允许使用自然语言;
常忽略异常处理、数据结构和变量描述。
伪代码实例:
算法的时间复杂度:
最坏情况下的时间复杂度:对于输入规模为n的实例,算法输出所需最长的时间W(n);
平均情况下的时间复杂度:对于输入规模为n的实例,算法输出所需的平均时间A(n);
S:实例集 P:I的概率 T:I的时间
Reference:北京大学信息科学技术学院 《算法分析与复杂度理论》 课程课件