Data structures 递归排序函数分析
关于数据结构课程中的问题,需要一些帮助: 我得到了mergesort的递归函数(伪代码): 合并排序1/3(A、p、r) 如果pData structures 递归排序函数分析,data-structures,time-complexity,pseudocode,Data Structures,Time Complexity,Pseudocode,关于数据结构课程中的问题,需要一些帮助: 我得到了mergesort的递归函数(伪代码): 合并排序1/3(A、p、r) 如果p
经典mergesort的要点是以下递归:
- 将无序列表一分为二。 它足以计算部分列表的极限偏移量
- 将合并排序应用于每个部分列表。
在此步骤之后,将对部分列表进行排序 - 通过按各自的顺序检查两个列表的元素,从列表中键入并在列表中与较小的元素一起前进,合并已排序的部分列表
TC(n)
成为经典合并排序的时间复杂性。上述步骤分别采取O(1)
(*)、2*O(TC(ceil(n/2)))
和O(n)
。这就产生了递归TC(n)=cc_0+cc_1*n+2*TC(cel(n/2))
考虑一下广义的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(
中的常量notation;a=3
用于mergesort\u 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定理要求在\sum_i=1..k(a_i*(b_i)^p)=1
中找到指数p
。那么,以下观点成立:
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
(*)严格来说,这是不正确的,因为二进制表示和内存访问的基本算法是
O(logn)
。然而,这对复杂性没有影响。经典合并排序的要点是以下递归:
- 将无序列表一分为二。 它足以计算部分列表的极限偏移量
- 将合并排序应用于每个部分列表。
在此步骤之后,将对部分列表进行排序 - 通过按各自的顺序检查两个列表的元素,从列表中键入并在列表中与较小的元素一起前进,合并已排序的部分列表
TC(n)
成为经典合并排序的时间复杂性。上述步骤分别采取O(1)
(*)、2*O(TC(ceil(n/2)))
和O(n)
。这就产生了递归TC(n)=cc_0+cc_1*n+2*TC(cel(n/2))
考虑一下广义的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(
中的常量notation;a=3
用于mergesort\u 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定理要求在\sum_i=1..k(a_i*(b_i)^p)=1
中找到指数p
。那么,以下观点成立:
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
(*)严格来说,这是不正确的,因为二进制表示和内存访问的基本算法是
O(logn)
。但是,这对Θ(n log n)
复杂性没有影响。这种合并排序将数据分成三个大小相等的块,而不是两个块。因此,您将一个大小为n的问题减少为三个大小为n/3的问题。此外,在合并时,您必须遍历所有三个n/3大小的排序块,这将导致遍历总共n个元素。因此,重现期可以写成:
- T(n)=3t(n/3)+O(n)
因此,在第二种情况下,递归将下降,T(n)=Θ(nc*Log(n))=Θ(n*Log(n))。此合并排序将数据划分为三个大小相等的块。因此,您将一个大小为n的问题减少为三个大小为n/3的问题。此外,在合并时,您必须遍历所有三个n/3大小的排序块,这将导致遍历总共n个元素。因此,重现期可以写成:
- T(n)=3t(n/3)+O(n)