Skip to content

Lesson7:分治法

想必之前其实就有思考过类似的问题,这节课是总结与提升。

T(N) = aT(N/b) + f(N) 是基本分治的公式,其中a、b分别为划分出的子问题数量与子问题的收缩,f(N)为merge合并子问题的复杂度。

代入法

意思就是根据经验来猜出时间复杂度,然后代入验证。

先猜测上界再用数学归纳法证明

T(N) = 2T(⌊N/2⌋)+N

猜测一:T(N)=O(NlogN)

猜测二:T(N)=O(N)

T(N)=2T(m)+N≤2c⌊N/2⌋+N≤cN+N=(c+1)N

可以发现T(N)对应的N常数并没有保持,所以猜测二不成立,但是可以利用之来猜正确的猜测一。

alt text

换元法:T(n)=2T(sqrt(n))+logn

那我们就令logn=m,因此T(2m) = 2T(2m/2) + m

S(m) = T()(2m) = 2S(m/2) + m

因此S(m) = mlogm

代入就有T(n) = O(logn*loglogn)

递归树法

完全递归树

alt text

叶子节点总是有nlogba个,时间复杂度就是O(Nlogba),层数无其他限制就为logbN-1层(去除叶子的那层)

不完全递归树

alt text

主定理法

alt text

其实关键都在于比较 nlogba 和 f(n) 之间的关联,如果前者大,则前者 “掌控了” 整个时间复杂度,所以时间复杂度就是 T(n) = aT(n/b) 对应的复杂度,这也很符合直观,因为此时 a 比较大,分叉比较多,树比较大(结合前面递归树的例子),所以更大的复杂度会落在叶子上;反之后者大则每一层的复杂度 “掌控了” 整个时间复杂度,故整体时间就是 f(n) 级别的。这就是主定理的含义,谁主持(master)了整个时间复杂度。

alt text

不能用主定理的原因是对于任意a>0,我们知道na > logn,因此我们找不到情况1中的a,此方法无效,这就是所谓的"间隙"。

alt text

alt text

这甚至还有更强的表达。

alt text