通用形式: T(n) = aT(n/b) + f(n)
因此,我必须比较 n^logb(a)
和 f(n)
如果 n^logba
> f(n)
,则为情况1,且T(n)=Θ(n^logb(a))
如果 n^logba
< f(n)
,则为情况2,且T(n)=Θ((n^logb(a))(logb(a)))
这样正确吗?还是我误解了什么?
那么第三种情况呢?它何时适用?
通用形式: T(n) = aT(n/b) + f(n)
因此,我必须比较 n^logb(a)
和 f(n)
如果 n^logba
> f(n)
,则为情况1,且T(n)=Θ(n^logb(a))
如果 n^logba
< f(n)
,则为情况2,且T(n)=Θ((n^logb(a))(logb(a)))
这样正确吗?还是我误解了什么?
那么第三种情况呢?它何时适用?
递归关系在解决复杂问题的分治策略中经常出现。
它可以解决什么问题?
T(n) = aT(n/b) + f(n)
的递归关系。a
应大于或等于1。这意味着问题至少被减小到一个更小的子问题。至少需要一次递归。b
应大于1。这意味着每次递归时,问题的规模都会缩小。如果 b
不大于1,则说明我们的子问题不是更小的问题。f(n)
对于相对较大的 n
值必须为正数。请考虑下面的图片:
假设我们有一个大小为n
的问题需要解决。每一步,问题可以分成a
个子问题,每个子问题的大小都较小,大小减小了b
倍。n
的问题可以被分成相对较小的a
个子问题,每个子问题的大小为n/b
。log
视为以b
为底数。H
是树的高度,则H = logn
。叶子节点的数量= a^logn
。
f(n)
a * f(n/b)
a * a * f(n/b2)
叶子节点数 * θ(1)
。这等于n^loga
假设每个级别操作的成本呈显著增长,到达叶子级别时,f(n)
的值变得多项式地小于n^loga
的值。那么整体运行时间将受到最后一级成本的严重支配。因此,T(n) = θ(n^loga)
。
假设每个级别上的操作成本大致相等。在这种情况下,f(n)
大致等于n^loga
。因此,总运行时间将是f(n)
乘以总级数。
T(n) = θ(n^loga * logn)
,其中k
可以>=0
。当k >= 0
时,logn
将是树的高度。
注意:这里的logn
以k+1
为底。
假设每个级别上的操作成本都按照显著因子递减,并且到达叶级别时,f(n)
的值变得多项式比n^loga
大。那么整个运行时间将严重受到第一级别成本的影响。因此,T(n) = θ(f(n))
。
如果你想了解更详细的阅读和练习示例,请访问我的博客文章 Master Method to Solve Recurrences。