引理
∑i=0log2n2i=n(注意这里的等于只是量级上面的等于)
时间复杂度的渐进符号
大 Θ 符号
存在 c1,c2,n0>0,使得:
∀n≥n0,0≤c1⋅g(n)≤f(n)≤c2⋅g(n)
则称:
f(n)=Θ(g(n))
简单来说,就是保留对于每个字母来说增长最快的项,增长速度我们有比较直观的感受:
1≤logn≤logαn≤n≤n
∀α,β>0,∃n0,∀n≥n0,s.t.logα(n)<nβ
大 O 符号
只关心上界。
大 Ω 符号
只关心下界。
小 o 符号
O 符号相当于小于等于号,那么 o 符号就相当于小于号。
小 ω 符号
Ω 相当于大于等于号,那么 ω 就相当于大于号。
推算时间复杂度的方法
画长方形法
例题 1
归并排序时间复杂度 T(n)=2T(n/2)+O(n)。
可以画图分析,显然每层都是n,有 logn 层,所以是 O(nlogn)。
例题2
T(n)=4T(2n)+n
可以看出只有logn层,但是每层相比于上层都乘了2。
总共 n∑i=0logn2i=n2。
主定理
T(n)=aT(bn)+f(n)∀n>b
T(n)=⎩⎪⎨⎪⎧Θ(nlogba)Θ(f(n))Θ(nlogbalogk+1n)f(n)=O(nlogba−ϵ)f(n)=Ω(nlogba+ϵ)f(n)=Θ(nlogbalogkn),k≥0
势能分析
我们设研究对象的状态为 D,定义势能函数 Φ(D),研究一次时间开销(Ti)和势能变化(ΔΦ=Φ(D′)−Φ(D))总和的上界 Ai:
Ti−ΔΦ≤Ai
两边求和,得到
∑Ti+Φ0−Φn≤∑Ai
则 :
∑Ti≤∑Ai+Φn−Φ0≤∑Ai+max{Φn−Φ0}
例题 3
模拟二进制数的加法。
我们令势能函数 Φ(n) 代表 n 二进制表示中 1 的个数,令 l(n) 代表 n 末尾 1 的个数。
显然 Ti=l(n)+1,Φ(n)=l(n)−1,则 Ai 可以取 2。
而 Φ(n)−Φ(0)∼logn≤n,则 O(∑Ti)=n。
例题 4
KMP 算法。
令 Φ(n) 代表当前所代表的的节点在 next 树中的深度。
则 Ti−ΔΦ=1,O(∑Ti)=n。
均摊复杂度
我们可以这样计算快速排序的时间复杂度:
T(1)=1T(n)=T(c)+T(n−c)+n,c∈rand[1,n−1]
假设 T(n)=nαlogβn,则我们可以采用积分的方式,这里我们验证 T(n)=nlogn 的正确性
O(nlogn)=O(n2∫nlogndn+n2)=O(nn2logn−2n2+n2)
成立。