你如何解决这种复发问题?

时间:2015-06-05 03:16:32

标签: algorithm recurrence

T(n) = n + T(3n/4) + 2T(n/8)

我们如何解决这种复发?当我使用替换方法时,我得到运行时为O(n),但答案是O(nlogn)。为什么?我们怎样才能在这里使用替换方法?

2 个答案:

答案 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=1T=Θ(x(1+∫ x/x² dx))=Θ(x(1+log x))=Θ(x log x)