T(n) = n + T(3n/4) + 2T(n/8)
我们如何解决这种复发?当我使用替换方法时,我得到运行时为O(n),但答案是O(nlogn)。为什么?我们怎样才能在这里使用替换方法?
答案 0 :(得分:0)
我们猜测解决方案,然后我们使用数学归纳来证明猜测是正确的还是不正确的。我们猜测解决方案为T(n) = O(nLogn)
。现在我们使用归纳法
证明我们的猜测。
我们需要证明T(n) <= cnLogn
。我们可以假设它是真的
对于小于n
的值。
T(n) = n + T(3n/4) + 2T(n/8)
<= n + cn(3/4)log(3n/4) + 2cn/8 log(n/8)
<= n + cnlogn + cnlog3- cnlog4 + cnlogn - cnlog8
<= n + cnlogn + cnlogn + c
<= cnlogn
因此
T(n) = O(n logn)
答案 1 :(得分:0)
这是T=O(n)
T(n)≤cn
显示T(n) = n + T(3n/4) + 2T(n/8)
≤ n + c3n/4 + 2cn/8
= n + cn
= (c+1)n
= c2n
的一个(不正确的)证据:
S(n) = 1 + 64 S(n/2)
问题在最后:尽管我们可以安全地忽略常量,因为这是一个很大的估计值,但是当显示上限时我们不能这样做。为了给出一个更明确的例子,让我们假设我们有了重复:S=O(1)
并通过显示S(n)≤c
显示S(n) = 1 + 64 S(n/2)
≤ 1 + 64 c
= c2
:
S=Θ(n^6)
另一方面,Master定理告诉我们n+
。 (基本上,改变证明中的常数意味着你根本不关心复发中的常数(3 / 4,2,1 / 8,64,1 / 2),而只关注不均匀的术语({{ 1}}和1+
)。)
通过显示T=O(n log n)
:
T(n)≤cnlog n
的正确证明
T(n) = n + T(3n/4) + 2T(n/8)
≤ n + c(3n/4)log(3n/4) + 2c(n/8)log(n/8)
= n + 3cn/4 log n + 3cn/4 log(3/4) + 2cn/8 log n + 2cn/8 log(1/8)
= n + cn log n - 3cn/4 log(4/3) - cn/4 log(8)
= cn log n + n [ 1 - 3c/4 log(4/3) - c/4 log(8) ]
≤ cn log n
只要1 ≤ c[3/4 log(4/3) + 1/4 log(8)]
,即c≥1/[3/4 log(4/3)+1/4 log(8)]
(其确切值取决于对数的基数)。道德是我们可以在证明开始时自由地使c
尽可能大,但我们不能在中间改变它。
不幸的是,这仍然让我们无法确定我们应该首先猜测T=O(n log n)
。如果我们不介意矫枉过正,我们可以使用Akra–Bazzi method。因为1(3/4)^p+2(1/8)^p=1
p=1
,T=Θ(x(1+∫ x/x² dx))=Θ(x(1+log x))=Θ(x log x)
。