
使用主定理#
主定理是一个强大的工具,用于解决递归关系式,通常用于分析某些递归算法的时间复杂度。当递归关系式具有以下形式时:
T(n)=aT(bn)+f(n)其中(a≥1)和b>1是常数,f(n)是一个已给出的函数,可以应用主定理。这个递归关系式表明,一个大小为n的问题的解可以通过递归地解决a个大小为bn的子问题来获得,附加上f(n)的成本。
主定理提供了三种情况来确定T(n)的渐进界限:
- 如果f(n)=O(nlogba−ϵ)对于某个常数ϵ>0,那么T(n)=Θ(nlogba)。
- 如果f(n)=Θ(nlogba),那么T(n)=Θ(nlogbalogn)。
- 如果f(n)=Ω(nlogba+ϵ)对于某个常数ϵ>0,并且对于某个常数c<1且所有足够大的n,都有af(bn)≤cf(n),那么T(n)=Θ(f(n))。
在图片中提供的示例中:
示例 1:
T(n)=9T(3n)+n
这里,a=9,b=3,f(n)=n,因为f(n)符合情况 1,我们有T(n)=Θ(n2)。
示例 2:
T(n)=2T(2n)+1
这里,a=2,b=2,f(n)=1,f(n)符合情况 2,因此T(n)=Θ(logn)。
示例 3:
T(n)=3T(4n)+nlogn
这里,a=3,b=4,f(n)=nlogn,f(n)符合情况 3,所以T(n)=Θ(nlogn)。
在应用主定理时,关键是要准确识别f(n)并确定其与nlogba的关系。一旦确定了这种关系,就可以直接应用相应的情况来找到T(n)的渐进界限。
理解如何选择使用主定理的哪一种情况#
说选择使用主定理的哪一种情况仅仅取决于a和b与 1 的比较是不完全准确的。相反,这个决策是基于f(n)与nlogba之间的关系。你可以通过比较f(n)和nlogba的增长速度来决定应用哪一种情况:
- 情况 1: 如果f(n)的增长速度慢于nlogba,即f(n)=O(nlogba−ϵ)对于某个ϵ>0,那么应用主定理的情况 1。
- 情况 2: 如果f(n)的增长速度与nlogba相同,即f(n)=Θ(nlogba),那么情况 2 适用。
- 情况 3: 如果f(n)的增长速度快于nlogba,即f(n)=Ω(nlogba+ϵ)对于某个ϵ>0,并且满足常数c<1的正则条件af(bn)≤cf(n)对所有足够大的n,那么情况 3 适用。
记住,主定理是解决以下形式递归关系式的工具:
T(n)=aT(bn)+f(n)
其中a≥1和b>1是常数,f(n)是一个已给出的函数。定理帮助确定T(n)的渐进行为,基于非递归部分f(n)的增长率与nlogba的比较。

- 有b个子问题,子问题规模是c,但是b和c和n没有关系,应该当成任意给的一个常数。
主定理的适用性分析#
给定递归关系式:
T(n) = 2T(n/2) + n log n
我们需要分析是否可以应用主定理来求解。主定理适用于以下形式的递归关系式:
T(n)=aT(n/b)+f(n)其中 a≥1 和 b>1 是常数,f(n) 是与 n 相关的函数。
对于我们的递归关系式:
- a=2,表示递归解决每个子问题的数目。
- b=2,表示每个子问题的大小是原问题大小的一半。
- f(n)=nlogn,表示在递归之外需要进行的计算。
主定理要求比较 f(n) 与 nlogba 的增长速率。在这个例子中,nlogba 等于 n。因为 f(n),即 nlogn,增长速度比 n 快,它不符合主定理第一种或第二种情况的要求。
对于主定理的第三种情况,f(n) 必须是 Ω(nlogba+ϵ),对某个正常数 ϵ>0。虽然 nlogn 增长确实比 n 快,但它不符合 n1+ϵ 的形式,因此不满足第三种情况的 Ω(nlogba+ϵ) 条件。
因此,我们无法直接使用主定理来求解给定的递归关系式,原因如下:
- f(n) 不是多项式级别低于 n,因此不满足主定理的第一种情况。
- f(n) 也不与 n 增长速率相同,因此不满足主定理的第二种情况。
- f(n) 不满足 Ω(nlogba+ϵ) 形式,因此不满足主定理的第三种情况。
这意味着我们需要寻找其他方法来分析此递归关系式的时间复杂度,比如使用递归树或者Akra-Bazzi 定理。
