如何从T(n)= 2T(n / 2)+ O(n)得到O(nlogn)

时间:2012-04-25 22:38:51

标签: algorithm big-o

您好我正在研究算法,我在不使用主定理的情况下得到关于得到O(nlogn)的问题。

我很难得到O(nlogn)..

有没有人知道从T(n)= 2T(n / 2)+ O(n)得到O(nlogn)的数学方法?

感谢

3 个答案:

答案 0 :(得分:18)

注意模式(简化一点,更好的是保留O(n)而不是n):

T(n) = 2T(n/2) + n
     = 2(2T(n/4) + n/2) + n  = 4T(n/4) + n + n  = 4T(n/4) + 2n
     = 4(2T(n/8) + n/4) + 2n = 8T(n/8) + n + 2n = 8T(n/8) + 3n
     = 8(2T(n/16) + n/8)+ 3n = 8T(n/16)+ n + 3n = 16T(n/16) + 4n
     ...                                        = 32T(n/32) + 5n
     ...
                                                = n*T(1) + log2(n)*n
                                                = O(n*log2(n))

答案 1 :(得分:4)

绘制递归树:

树的高度为log n

每个级别的成本将是恒定的时间n

因此总成本将为O(nlogn)。 http://homepages.ius.edu/rwisman/C455/html/notes/Chapter4/RecursionTree.htm

如果你愿意,你可以随时通过归纳来证明这一点。

答案 2 :(得分:0)

对于仍然想知道如何绘制递归树的任何人:

图片:T(n)= 2T(n / 2)+ O(n)算法的递归树

按如下所示绘制一棵树,我们可以看到每次除以2直到叶子等于1

n / 2 ** k = 1 ==> 2 ** k = n             ==> k = log(n)

这意味着我们的树的深度为 log(n)

在每个级别,我们都要进行一次操作,费用为O(n)。

即使我们每次都除以2,我们仍然在两个部分上都进行运算,因此在每个级别上都有 n 个迭代。

由于我们执行它的次数等于深度,因此产生的复杂度为 O(nlog(n))

enter image description here

另外,请观看此视频教程https://youtu.be/1K9ebQJosvo