对复发和大O感到困惑

时间:2012-02-16 23:47:09

标签: algorithm big-o

我知道     T(n)= T(n / 2)+θ(1)可以得到O(Log N) 我的书说这是Binary Search的一个例子。     但是,你怎么知道的?是不是因为Binary Search每次都将问题减半,所以它是O(Log N)?

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

当算法每次分成两半时,为什么结果是O(N)而不是O(Log N)。

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

可以得到O(N Log N)?我看到O(N)来自θ(n)而O(Log N)来自T(n / 2)

我真的很困惑如何确定算法的大O,我甚至不知道如何正确地说出来。我希望我的问题有道理。

提前致谢!

3 个答案:

答案 0 :(得分:3)

这些问题的直观解决方案是在展开递归公式时看到结果:

假设Theta(1)实际为1而Theta(n)为n,为简单起见

T(n) = T(n/2) + 1 = T(n/4) + 1 + 1 = T(n/8) + 1 + 1 + 1 = ... = 
= T(0) + 1 + ... + 1 [logN times] = logn

T'(n) = 2T'(n/2) + 1 = 2(2T'(n/4) + 1) + 1 = 4T'(n/4) + 2 + 1 = 
= 8T'(n/4) + 4 + 2 + 1 = ... = 2^(logn) + 2^(logn-1) + ... + 1 = n + n/2 + ... + 1 = 
= 2n-1

T''(n) = 2T(n/2) + n = 2(2T''(n/2) + n/2) + n = 4T''(n/4) + 2* (n/2) + n = 
= 8T''(n/8) + 4*n/4 + 2*n/2 + n = .... = n + n + .. + n [logn times] = nlogn

要正式证明这些方程式,您应该使用induction。假设T(n/2) = X并使用它 - 按预期证明T(n) = Y

例如,对于第一个公式[T(n) = T(n/2) + 1] - 并假设基数为T(1) = 0
基数通常适用于n = 1
为任何T(n) <= logn假设k <= n-1,并为k = n证明
T(n) = T(n/2) + 1 <= (induction hypothesis) log(n/2) + 1 = log(n/2) + log(2) = log(n/2*2) = log(n)

答案 1 :(得分:1)

我发现一种简单的方法来理解这些是考虑算法在重复的每个步骤上花费的时间,然后将它们相加以找到总时间。首先,让我们考虑一下

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

其中n = 64。让我们总结算法在每一步所花费的数量:

T(64) = T(32) + 1 ... 1 so far
T(32) = T(16) + 1 ... 2 so far
T(16) = T(08) + 1 ... 3 so far
T(08) = T(04) + 1 ... 4 so far
T(04) = T(02) + 1 ... 5 so far
T(02) = T(01) + 1 ... 6 so far
T(01) = 1         ... 7 total

因此,我们可以看到算法在每一步都花了'1'时间。并且,由于每个步骤将输入分成两半,所以总工作量是算法必须将输入分成两个的次数...即log2 n。

接下来,让我们考虑

的情况
T(n)  = 2T(n/2) + O(1)

然而,为了使事情变得更简单,我们将从基础案例T(1)= 1构建。

T(01) = 1           ... 1 so far 

现在我们必须做两次T(01),然后加一个,所以

T(02) = 2T(01) + 1  ... (1*2)+1 = 3

现在我们必须做两次T(02),然后加一个,所以

T(04) = 2T(02) + 1 ... (3*2)+1  = 7
T(08) = 2T(04) + 1 ... (7*2)+1  = 15
T(16) = 2T(08) + 1 ... (15*2)+1 = 31
T(32) = 2T(16) + 1 ... (32*2)+1 = 63
T(64) = 2T(32) + 1 ... (65*2)+1 = 127

所以我们可以看到这里算法完成了127次工作 - 它等于输入乘以常数(2)并加上常数(-1),即O(n)。基本上这个递归对应于无限序列(1 + 1/2 + 1/4 + 1/8 + 1/16),它总和为2.

尝试在T(n)= 2T(n / 2)+ n上使用此方法,看看它是否对你更有意义。

答案 2 :(得分:0)

找到递归方程的T(n)的一个直观解决方案是用树绘制它然后:
T(n) = number of nodes * time specified on each node.

在您的情况下T(n) = 2T(n/2) + 1
我在节点本身写the one并将其展开为两个节点T(n/2)
注意T(n/2) = 2T(n/4) + 1,我也是这样做的。

            T(n) + 1
           /         \     
       T(n/2)+1      T(n/2)+1
      /     \           /     \
 T(n/4)+1  T(n/4)+1   T(n/4)+1  T(n/4)+1
 ...   ...  ..  ..      ..  ..   ..    ..
T(1)  T(1) ..........   ............T(1)

在此树中,节点数等于

2*height of tree = 2*log(n) = n

然后T(n) = n * 1 = n = O(n)