在数据结构课程中需要一些帮助: 我得到了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)
这些是问题:
答案 0 :(得分:0)
经典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_0
,ca_1
为O(_)
符号中隐藏的常量; 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个元素。因此,重复可以写成:
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))。