递归mergesort函数分析

时间:2016-04-26 12:06:33

标签: data-structures time-complexity pseudocode

在数据结构课程中需要一些帮助: 我得到了mergesort(伪代码)的这个递归函数:

Mergesort_1/3(A, p, r)
if p < r 
    then q = (p+(r-p)/3) // round the result down
        Mergesort_1/3 (A,p,q)            
                Mergesort_1/3 (A,q+1,r)
                Merge(A,p,q,r)  

这些是问题:

  1. 设T(n)是Mergesort _1 / 3的最差运行时间。写T(n)的递归函数。给一个简短的解释。
  2. 证明T(n)=Ω(nlogn)

2 个答案:

答案 0 :(得分:0)

经典mergesort的要点是以下递归:

  • 将无序列表分成两半。 计算部分列表的限制偏移量就足够了。
  • 将mergesort应用于每个部分列表 完成此步骤后,将对部分列表进行排序。
  • 合并已排序的部分列表,方法是按照各自的顺序检查两个列表的元素,使用较小的元素从列表中进行压缩和进行。

TC(n)成为经典mergesort的时间复杂度。上述步骤分别采用O(1)(*),2*O(TC(ceil(n/2)))O(n)。这有助于递归TC(n) = cc_0 + cc_1 * n + 2 * TC(ceil(n/2))

考虑一般化的mergesort,其中列表不均匀地分割,但总是具有相同的比率。拆分和合并的复杂性保持不变,为广义mergesort提供递归TG(n) = ca_0 + ca_1 * n + TG(1/a * n + 1) + TG((a-1)/a * n + 1))(使用TG(x+1)而不是TG(ceil(x)); ca_0ca_1O(_)符号中隐藏的常量; a=3的{​​{1}}。

可以使用Akra-Bazzi-Method解决此重现问题。 为此,需要将重复记录为

mergesort_1/3


TG(x) = g(x) + \sum_i=1..k ( a_i * TG(b_i * x + h_i(x) ) ; x >= x_0.

可以通过设置...

来完成
a_i, b_i const.
a_i > 0
0 < b_i < 1
|g(x)| = O(x^c); c const.
|h(x)| = O(x / (log(x))^2)

Akra-Bazzi定理要求在k = 2 a_1 = 1 a_2 = 1 b_1 = 1/a b_2 = (a-1)/a g(x) = ca_0 + ca_1 * x h_1(x) = 1 h_2(x) = 1 x_0 = 2 -> TG(x) = ca_0 + ca_1 * n + 1 * TG(1/a * x + 1 ) + 1 * TG((a-1)/a * x + 1 ) ; x >= x_0. 中找到指数p。以下是:

\sum_i=1..k ( a_i * (b_i)^p ) = 1

具体地,

TG(x) = Θ ( x^p \integral_(1, x) ( g(u) / (u^(p+1)) du ) )

......因而......

    a_1 * b_1^p + a_2 * b_2^p = 1
 => (1/a)^p + ((a-1)/a)^p     = 1
<=> p = 1

(*)严格来说这是不正确的,因为二进制表示和内存访问的基本算术是TG(x) = Θ ( x \integral_(1, x) ( (ca_0 + ca_1 * u) / u^2 du ) ) = Θ ( x [ - ca_0/u + ca_1 * log(u) ]_(1,x) ) = Θ ( - ca_0 + ca_1 * x * log(x) + ca_0 * x - ca_1 * x * log(1) ) = Θ (x * log(x)) 。但是,这对于O(log n)复杂性没有任何差别。

答案 1 :(得分:0)

这个mergesort不是两个,而是将数据分成三个大小相等的块。所以你正在减少n到3个大小为n / 3的问题。此外,在合并时,您将必须遍历所有三个n / 3大小的排序块,这将导致遍历总共n个元素。因此,重复可以写成:

  • T(n)= 3T(n / 3)+ O(n)

Using Master Theorem:这里a = 3,b = 3且c = 1.Log b a = Log 3 3 = 1 = c。

因此复发将在第二种情况下出现,T(n)=Θ(n c * Log(n))=Θ(n * Log(n))。