假设我有以下关系 -
T(1) = c1
T(n) = T(n/2) + n
我需要通过归纳证明这个函数受O(n)
的限制。
我只是不知道如何选择C,N_{0} > 0
。
如果有人能告诉我这些证明的大纲。
答案 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/2
,n/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) < C
,T(n) < n*C
隐含T(2*n) < 2*n*C
,所以我们可以得出结论:
T(n) < n * C for all p (*)
这意味着T(n) ~ O(n)
,因为T(n) / n
受C
限制。
还有其他方法可以继续:扩展上述探索,您可以将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}},所以p
和T(n) / n < 2 * C
n