用两个递归调用解决递归关系


10

我正在研究quicksort的最坏情况下的运行时,条件是它不会为very的各种定义进行非常不平衡的分区。

为了做到这一点,我问自己一个问题如果快速排序总是发生在分区的情况下那么运行时间将是什么,使得元素在左分区中,而在右分区中(在中间保留元素,即枢轴)。T(n,p)0<p12p(n1)(1p)(n1)1

不难看出,为最坏的情况给出了上限,在最坏的情况下,是允许的最大不平衡分区,因为任何分数分区都将更加平衡,运行时更短,并且不允许任何分数。T(n,p)p>p<p

很明显,在快速排序中是最好的情况,而是最差的情况。两者都具有在任何教育资源中都能找到的容易复发的关系。但是我不知道一般如何学习。明显的关系是:T(n,12)T(n,0)T(n,p)

T(n,p)=n+T(p(n1),p)+T((1p)(n1),p)

在这里我被卡住了。我尝试过搜索,但是我能理解的有关分而治之算法的所有文献都按字面意义进行了“除法”,并利用分区总是相等的事实“欺骗”了分析,将术语合并为一个不变。

我不知道如何处理两个递归调用,也不知道删除舍入是否安全。这可以解析地解决吗?如果可以,怎么解决?

PS:我对渐近不感兴趣(对于任何常数,它很容易显示)。我对随着变小而使quicksort变慢多少感兴趣,例如,我对的比率感兴趣。p p T n 0.25 Θ(nlogn)ppT(n,0.25)T(n,0.5)

PPS:作为一名本科生,如果我发现明显的事情过于冗长或无法解释的琐事,我深表歉意。而且,尽管我不知道是否像其他SE网站一样受到人们的关注,但我会注意到这是个人兴趣,而不是作业。

Answers:


9

如您所述,Akra–Bazzi定理表明,对于所有递归都是。但是,这并没有揭示对的依赖的性质。为了确定后者,我们可以使用递归树方法。ø Ñ 登录Ñ p 0 1 pT(n,p)O(nlogn)p(0,1)p

递归树的根是间隔。它的两个子元素是间隔和,它们的总长度再次为。这些节点中的每个节点都有两个子节点(假设足够大),依此类推。为了简单起见,我们忽略了舍入误差,也就是说,我们假设是一个整数。这只是技术问题,我不会为此担心。只要节点的长度最大为我们就会停止该过程。算法的复杂度与树中间隔的总长度成正比。当,叶子{ 1 p n } { p n + 1 n } n n p n 1 p 1 / 2{1,n}{1,,pn}{pn+1,,n}nnpn1p1/2 (停止过程的节点)的深度不同,这使得确定整体复杂性变得更加困难。

通过注意到树最多具有级别,我们可以获得一个简单的上限:每个节点至少比其父节点小倍。就像在分析,间隔中的任何级别的总长度为至多,我们获得上界的上运行时间。由于和对于小,我们可以写成。1 - p p = 1 / 2 Ñ ø Ñ 日志1 - p1 / Ñ 日志1 - p1 / Ñ = 日志ñ /日志1 - p 1 log 1 p 1log1p(1/n)1pp=1/2nO(nlog1p(1/n))log1p(1/n)=logn/log(1p)1p O n log n / p log(1p)1=log(1p)=p±O(p2)pO(nlogn/p)

这是一个更准确的计算。考虑等级。假设我们在达到很小的间隔时就不会停止该过程。我们可以通过采取步来生成随机顶点,在每个步中,我们以概率左(说),以概率右(说)。每次我们向左走时,间隔长度的对数减少,而每次我们向右走时,它的间隔减少。顶点在实际log的树中,其长度最多减少。级别上间隔的总权重ttp1plogplog(1p)lognt树的精确度恰好是根据此过程生成的顶点对应于最多减少的概率。即,如果是其等于分配的概率为,并的概率为,和是独立的,则级别总权重为。对于超常数,随机变量大致呈正态分布,均值且方差为线性lognDlogpplog(1p)1pX1,,XtDtPr[X1++Xtlogn]tX1++Xt[plogp(1p)log(1p)]tt,因此对于满足来说,概率将非常接近,而对于满足,也就是说,它将非常接近零。定义(称为二进制熵函数),我们得出结论,运行时间为(统一形式,如)。当我们有,因此我们之前的估计并不严格。t[plogp(1p)log(1p)]t(logn)/21t[plogp(1p)log(1p)]t2lognh(p)=plogp(1p)log(1p)Θ(nlogn/h(p))pnp0h(p)plogp

查看同一分析的另一种方法是,像以前一样,使无限随机变量无限,并将停止时间定义为第一次这样。然后,运行时间与成正比。然后,基本更新定理指出,这意味着间隔的总大小等于。更准确地说,对于每个常数,间隔的总大小为,其中X1,X2,TtX1++XtlognnE[T]limnE[T]/logn=1/E[D]=1/h(p)(1+o(1))nlogn/h(p)p(1+αp(n))nlogn/h(p)αp(n)=o(n)。基本更新定理的收敛性在时间参数(在本例中为中呈指数关系,因此在应为多项式,即。对于任何,的收敛也可能是均匀的。lognnαp(n)=O(nCp)p(δ,1δ)δ>0


总而言之,递归树中间隔的总长度与运行时间成正比,每个形式如下:其中和取相同的底,而是一个函数,取决于并且随着趋于。p

T(n,p)=(1+o(1))nlognh(p),
lognh(p)=plogp(1p)log(1p)o(1)p0n

此外,对于任何和任何,间隔的总长度的形式为其中且隐藏的大O常数仅取决于。特别是对于所有常数, 收敛速度很快。δ>0p(δ,1δ)

T(n,p)=(1+O(nCδ))nlognh(p),
Cδ>0δp1,p2
limnT(n,p1)T(n,p2)=h(p2)h(p1),

感谢您的快速回答Yuval。我对摘要中使用感到困惑。是一个常数,并不表示在下它是不相关的吗?我决定编写一个小测试程序,该程序显示,对于将分析方法与计算方法之间的进行比较,得出的误差为0.03。这似乎很大,还是可以预期?Θh(p)Θn=100000000000000T(n,0.1)/T(n,0.5)
orlp

的常数在是均匀的。更准确地说,对于某些常数,情况是每个存在,从而对于,。对于每个固定的,您可能都可以得到形式更强的语句,其中o相对于(但可能取决于); 应该依赖于。Θpc,CpNpnNpcnlogn/h(p)T(n,p)Cnlogn/h(p)T(n,p)=(1+o(1))Cnlogn/h(p)pnpCp
Yuval Filmus 2014年

收敛到极限取决于,因此您可能需要较大才能获得非常好的近似值。另一方面,0.03的相对误差听起来并不那么大。您可以尝试修复并将运行时间绘制为的函数,并将其与进行比较。lognlognnp1/h(p)
Yuval Filmus 2014年

抱歉,我的意思不是相对误差0.03,而是绝对误差(2.13222与2.10339)。将绘制为的函数,相对于的相对差为4%,其中是 96%。T(n,p)p1/h(p)T(1011,0.05)h(0.05)T(1011,0.4)h(0.4)
orlp 2014年

1
超常数是相对于相关变量(在本例中为)趋于无穷大的函数。与。nω(1)
Yuval Filmus 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.