通过归纳证明计算复杂性

时间:2016-05-10 13:16:09

标签: time-complexity asymptotic-complexity recurrence

假设我有以下关系 -

T(1) = c1

T(n) = T(n/2) + n

我需要通过归纳证明这个函数受O(n)的限制。 我只是不知道如何选择C,N_{0} > 0。 如果有人能告诉我这些证明的大纲。

1 个答案:

答案 0 :(得分:1)

您不需要明确的常量来证明复杂性为O(n)。回到定义:如果T(n)渐近有界,则O(n)T(n) / n

现在建议尝试将其作为第一次探索,看看它是如何演变的:

T(n) / n = (T(n/2) + n) / n = T(n/2) / n + n / n
         = T(n/2) / n + 1

您当然可以再次将其应用于n/2n/2/2等。为简化起见,我们假设n是2的幂:n = 2^p。然后我们可以写:

T(2^p) / 2^p = T(2^(p-1)) / 2^p + 1
             = T(2^(p-2)) / ((2^p)*(2^(p-1))) + 1 / 2^p + 1
             = T(2^(p-3)) / ((2^p)*(2^(p-1))*(2^(p-2))) + 1 / (2^(p-1)*2^p) + 1/(2^p) + 1
             = ...

你可以通过T(1)这种方式回到p,但是已经很明显这是有限的:因为左侧(T(2^(p-k)))变得更加闪烁到T(1),添加到右侧侧的内容越来越小,呈指数级变化。特别是,我们知道:

1 + 1/2 + 1/(2*2) + 1/(2*2*2) + ...

Converges,所以我们的1 /(2 ^的乘积)的总和应该肯定表现。让我们直截了当地说明:

让我们看看我们是否可以找到一些C

T(n) < n * C

n==1确实如此,只要C > c1。现在,让我们假设它n是真的,我们有:

T(n*2) = T(n) + 2*n < n*C + n*2 = n*(C+2) = n*2 * (C+2)/2

因此,只要(C + 2) / 2 <= C,我们的关系就会一直存在。只要C >= 2

就很容易证明这是真的

因此,如果我们选择任何C > max(c1, 2),我们会T(1) < CT(n) < n*C隐含T(2*n) < 2*n*C,所以我们可以得出结论:

T(n) < n * C for all p  (*)

这意味着T(n) ~ O(n),因为T(n) / nC限制。

还有其他方法可以继续:扩展上述探索,您可以将T(2^p) / 2^p表达为k<=p上的系列,并表明它会收敛。但是,归纳证明通常是处理递归定义的最简单方法。

(*):从技术上讲,我们只为所有n=2^p展示了所有p。但是,通过归纳证明也很简单:

T(2) = T(1) + 1 > T(1)
T(n+1) = T((n+1)/2) + (n+1)
       = T(n/2) + n + 1     if n is even
       = T(n) + 1 
T(n+1) > T(n)               if n is even
T(n+1) = T((n+1)/2) + (n+1)
       = T(n/2 + 1) + (n+1) if n is odd
       > T(n/2) + n + 1
       > T(n) + 1
T(n+1) > T(n)               if n is odd

所以T(n)(严格地)增加。因此,我们有2^p < n < 2^(p+1)

T(n) / n < T(n) / 2^p < T(2^(p+1)) / 2^p = 2 * T(2^(p+1)) / 2^(p+1)

由于我们知道所有T(2^(p+1)) / 2^(p+1) < C的{​​{1}},所以pT(n) / n < 2 * C

会立即n