合并排序比较

时间:2013-07-13 12:28:07

标签: algorithm

我正在阅读Sedgewick和Flajolet的“算法分析”。在第7页中,理论1.1给出了:

enter image description here

以下是证明:enter image description here

有人可以解释一下O(N)的位置吗?因为它证明Cn是O(NlogN)。

2 个答案:

答案 0 :(得分:3)

你是对的;由于超出我的原因,他们提出了比实际证明更多的定理。这是填补其余部分的一种方法。

引理令整数n> = 1的T(n)由

定义
T(n) = 0,                                for n = 1;
       T(floor(n/2)) + T(ceil(n/2)) + n, for n > 1.

然后T(n)< = n lg n + n - 1 = n lg n + O(n)对于整数n> = 1。

证明通过归纳。对于n = 1,T(1)= 0 = 1 lg 1 + 1 - 1。对于n> 1。 1,有两种情况。如果n是偶数,那么

T(n)  = 2T(n/2) + n
     <= 2(n/2) lg(n/2) + 2n/2 - 2 + n
      = n (lg n - 1) + 2n - 2
     <  n lg n + n - 1.

如果n是奇数,则事情变得复杂。

T(n)  = T(n/2 - 1/2) + T(n/2 + 1/2) + n
     <=   (n/2 - 1/2) lg(n/2 - 1/2) + (n/2 - 1/2) - 1
        + (n/2 + 1/2) lg(n/2 + 1/2) + (n/2 + 1/2) - 1
        + n
      = (n/2 - 1/2) lg(n/2 - 1/2) + (n/2 + 1/2) lg(n/2 + 1/2) + 2n - 2.

这两个丑陋的术语都接近(n / 2)lg(n / 2),因此我们将每个作为该数量加上一个错误术语。

T(n) <= (n/2 - 1/2) lg(n/2 - 1/2) + (n/2 + 1/2) lg(n/2 + 1/2) + 2n - 2
      =   (n/2) lg(n/2) + ((n/2 - 1/2) lg(n/2 - 1/2) - (n/2) lg(n/2))
        + (n/2) lg(n/2) + ((n/2 + 1/2) lg(n/2 + 1/2) - (n/2) lg(n/2))
        + 2n - 2
      =   n lg(n/2) + 2n - 2
        + (n/2 - 1/2) lg(n/2 - 1/2) - (n/2) lg(n/2)
        + (n/2 + 1/2) lg(n/2 + 1/2) - (n/2) lg(n/2)
      =   n (lg n - 1) + 2n - 2
        + (n/2) (lg(n/2 - 1/2) - lg(n/2)) - (1/2) lg(n/2 - 1/2)
        + (n/2) (lg(n/2 + 1/2) - lg(n/2)) + (1/2) lg(n/2 + 1/2)
      =   n lg n + n - 2
        + (n/2) lg((n/2 - 1/2)/(n/2)) - (1/2) lg(n/2 - 1/2)
        + (n/2) lg((n/2 + 1/2)/(n/2)) + (1/2) lg(n/2 + 1/2)
      =   n lg n + n - 2
        + (n/2) lg(1 - 1/n) - (1/2) lg(n/2 - 1/2)
        + (n/2) lg(1 + 1/n) + (1/2) lg(n/2 + 1/2)
      =   n lg n + n - 2
        + (n/2) lg(1 - 1/n) + (n/2) lg(1 + 1/n)
        + (1/2) lg(n/2 + 1/2) - (1/2) lg(n/2 - 1/2)
      =   n lg n + n - 2
        + (n/2) lg((1 - 1/n) (1 + 1/n))
        + (1/2) lg((n/2 + 1/2) / (n/2 - 1/2))
      =   n lg n + n - 2
        + (n/2) lg(1 - 1/n^2)
        + (1/2) lg(1 + 2/(n - 1)).

术语(n / 2)lg(1 - 1 / n ^ 2)是负的,并且,对于n> = 3,这种情况下的最小n,术语(1/2)lg(1 + 2 /(n - 1))最多为1/2。 (实际上,我们可以回去重做证明,证明T(n)&lt; = n lg n + n / 2 - 1/2。我将把它留作练习。)因此,

T(n) <    n lg n + n - 2
        + 0
        + 1
      = n lg n + n - 1.

答案 1 :(得分:0)

我不确定你所询问的O(N)究竟在哪里是错误的或遗漏的,但他们的分析对于特殊情况N = 2^n是好的。

(1)之后的第一行数学只是重新说明特殊情况的重复。下一个很长的数学展示

C_{2^n} = (2^n) n

现在我们知道2^n = N,所以n = lg N。用这两个代替我们得到

C_N = N lg N
正如他们所说的那样。如果我没有正确看到您的问题,请发表评论。