两个主要任务:正确性(不变性x单调性)+复杂度
c++等高级语言的基本指令,均等效于常数条RAM的基本指令;在渐进意义下,两者大体相当
分支转向:goto //算法的灵魂,出于结构化考虑,被隐藏了
迭代循环:for() 、while() 、....//本质是“if+goto”
调用加递归(自我调用)//本质也是goto
复杂度分析的主要方法:
迭代:级数求和
递归:递归跟踪+递推方程
猜测+验证
级数:
算数级数:与末项平方同阶
T(n)=1+2+3+......+n=O(n^2)
幂方级数:比幂次高出一阶
T(n)=1^2+2^2+3^2+......+n^2=O(n^3)
T(n)=1^3+2^3+3^3+......+n^3=O(n^4)
T(n)=1^4+2^4+3^4+......+n^4=O(n^5)
.......
几何级数(a>1):与末项同阶
T(n)=a^0+a^1+a^2+......+a^n=O(a^n)
1+2+4+....+2^n=O(2^n)
收敛级数:
1/1/2 +1/2/3 +1/3/4 +......+ 1/(n-1)/n = O(1)
1+1/2^2 +......+ 1/n^2 = O(1)
1/3 +1/7 +1/8+...... = O(1)
可能未必收敛,然而长度有限:
h(n)=1 + 1/2 +1/3 +...+ 1/n =O(log n) //调和级数
log 1 + loh 2 + log 3 + ...... log n =O(nlog n) //对数级数
递归:
递归跟踪分析(直观形象,仅适用于简明的递归模式):
检查每个递归实例
累计所需时间(调用语句本身,计入对应的子实例)
其总和即为算法执行时间
递推方程:
T(n)=T(n-1) + O(1)
T(0)=O(1)
求解:
T(n)-n=T(n-1)-(n-1)=...
=T(2)-2
=T(1)-1
=T(0)
T(n)=O(1)+n=O(n)
浙公网安备 33010602011771号