目录
如何求解T(N)=aT(N/b)+f(N)
方法1:代入法(Substitution Method)
代入法求解递归式分两步:
- 猜测解的形式(猜测上界或下界)
- 用数学归纳法求出解中的常数,并证明解的正确性
以mergeSort为例,T(N)=2T(N/2) + Θ(N),我们猜测其解为T(N)=O(NlogN)。带入法要求证明,恰当选择常数c>0,可有T(N)<=cNlogN。假设此上界对所有正数K<N都成立。假设 Θ ( N ) = a N \Theta(N)=aN Θ(N)=aN。
当 K = N / 2 时 , 存 在 T ( N / 2 ) < = c ( N / 2 ) l o g ( N / 2 ) 当K=N/2时, 存在 T(N/2)<=c(N/2)log(N/2) 当K=N/2时,存在T(N/2)<=c(N/2)log(N/2)
带 入 递 归 式 可 得 带入递归式可得 带入递归式可得
T ( N ) < = 2 T ( N / 2 ) + a N T(N)<= 2T(N/2) +aN T(N)<=2T(N/2)+aN
< = 2 [ c ( N / 2 ) l o g ( N / 2 ) ] + a N <= 2[c(N/2)log(N/2)]+aN <=2[c(N/2)log(N/2)]+aN
< = c N l o g ( N / 2 ) + a N <=cNlog(N/2) +aN <=cNlog(N/2)+aN
= c N l o g ( N ) − c N l o g ( 2 ) + a N =cNlog(N)-cNlog(2)+aN =cNlog(N)−cNlog(2)+aN
= c N l o g ( N ) − c N + a N =cNlog(N)-cN+aN =cNlog(N)−cN+aN
= c N l o g ( N ) + ( a − c ) N =cNlog(N)+(a-c)N =cNlog(N)+(a−c)N
< = c N l o g ( N ) , 当 且 仅 当 c > = a <=cNlog(N) , 当且仅当c>=a <=cNlog(N),当且仅当c>=a
根 据 B i g − O 定 理 , 可 得 T ( N ) = O ( N l o g ( N ) ) 根据Big-O定理,可得T(N)=O(Nlog(N)) 根据Big−O定理,可得T(N)=O(Nlog(N))
方法2:递归树方法(Recursion Tree)
带入法虽然可以简洁的证明一个解是递归式的正确解,但猜测解的形式有时会比较困难。相比于代入法,递归树方法更加简单和直接。
在递归树中每一个节点表示一个单一子问题的代价,子问题对应某次递归函数的调用。我们将树中每层中的代价求和,得到每层的代价,然后将所有层的代价求和,得到所有递归调用的总代价。
以mergeSort为例:
- T(N)=2T(N/2) + Θ ( N ) \Theta(N) Θ(N)
- 假设 Θ ( N ) = a N \Theta(N)=aN Θ(N)=aN
- 树的高度为logN
- 每层代价为aN
- 可得总代价=aN(logN)
- 根据Big-O定理,可得T(N)=O(Nlog(N))
方法3: 迭代法(Iteration Method)
不断展开递归式。
仍以T(N)=2T(N/2) + Θ ( N ) \Theta(N) Θ(N)为例:
假 设 N = 2 k , k 是 整 数 假设 N=2^k ,k是整数 假设N=2k,k是整数
T ( 2 k ) < = 2 T ( 2 k − 1 ) + a 2 k T(2^k)<=2T(2^{k-1})+a 2^k T(2k)<=2T(2k−1)+a2k
2 T ( 2 k − 1 ) < = 4 T ( 2 k − 2 ) + 2 a 2 k − 1 2T(2^{k-1})<=4T(2^{k-2})+2 a 2^{k-1} 2T(2k−1)<=4T(2k−2)+2a2k−1
4 T ( 2 k − 2 ) < = 8 T ( 2 k − 3 ) + 4 a 2 k − 2 4T(2^{k-2})<=8T(2^{k-3})+4 a 2^{k-2} 4T(2k−2)<=8T(2k−3)+4a2k−2
. . . . . . . . . ……… .........
2 k − 1 T ( 2 1 ) < = 2 k T ( 2 0 ) + 2 k − 1 a 2 2^{k-1}T(2^1)<=2^{k}T(2^0)+2^{k-1}a 2 2k−1T(21)<=2kT(20)+2k−1a2
2 k − 1 T ( 2 ) < = 2 k T ( 1 ) + 2 k − 1 a 2 2^{k-1}T(2)<=2^{k}T(1)+2^{k-1}a 2 2k−1T(2)<=2kT(1)+2k−1a2
将 上 面 所 有 不 等 式 左 右 分 别 相 加 , 并 约 分 得 到 将上面所有不等式左右分别相加,并约分得到 将上面所有不等式左右分别相加,并约分得到
T ( 2 k ) < = 2 k + k a 2 k T(2^k)<=2^k+ka2^k T(2k)<=2k+ka2k
因 为 2 k = N , 所 以 k = l o g N , 带 入 上 式 因为2^k=N, 所以 k=logN, 带入上式 因为2k=N,所以k=logN,带入上式
T ( N ) < = N + a N l o g N T(N) <=N+aNlogN T(N)<=N+aNlogN
根 据 B i g − O 定 理 , 可 得 T ( N ) = O ( N l o g ( N ) ) 根据Big-O定理,可得T(N)=O(Nlog(N)) 根据Big−O定理,可得T(N)=O(Nlog(N))
方法4:主定理(Master Theorem)
其中a>=1,b>1是常数,f(N)是渐进正函数。为了使用主定理,需要牢记上述三种情况,可快速求解递归式。
例1:T(N)=3T(N/3)+ Θ ( 1 ) \Theta(1) Θ(1)
- a=3, b=3, logba=log33=1
- Θ ( N 1 ) \Theta(N^1) Θ(N1)大于 Θ ( 1 ) \Theta(1) Θ(1),所以分支占主导地位,选择case 1
- 得到T(N)= Θ ( N ) \Theta(N) Θ(N)
例2:T(N)=2T(N/2)+ Θ ( N ) \Theta(N) Θ(N)
- a=2, b=2, logb a=2/2=1
- 相同增长率,选择case 2
- 得到T(N)= Θ ( N l o g N ) \Theta(Nlog N) Θ(NlogN)
例3:T(N)=T(19N/20)+ Θ ( N ) \Theta(N) Θ(N)
- a=1, b=20/19, logb a=log20/19 1=0
- Θ ( N 0 ) \Theta(N^0) Θ(N0)小于 Θ ( N ) \Theta(N) Θ(N), Θ ( N ) \Theta(N) Θ(N)占主导地位,选择case 3
- 得到T(N)= Θ ( N ) \Theta(N) Θ(N)