确定性RS算法-D-RS算法

本文探讨了D-RS算法,一种改进版的快速排序,通过优化pivot选择来达到线性平均复杂度。通过分组、中位数确定和递归调用,算法在n/5次常数时间内操作,最终证明了其复杂度为O(n log n)。关键在于输入规模每次下降30%,展示了如何用数学归纳法证明这一复杂度。
摘要由CSDN通过智能技术生成

上篇博客我们分析了RS算法的复杂度。我们发现只要我们选择的pivot足够好,该算法的平均复杂度是线性的。那么我们就会考虑,我们有没有办法改进一下RS呢,让我们的算法的复杂度就是\mathcal{O}(n)。于是就有了今天要讨论的这个算法D-RS。

其实D-RS算法核心就是改进了RS算法的pivot的选择方式,保证了我们每一次都能选择到足够好的一个pivot。

老规矩,我们先给出D-RS算法的流程:

1. 先将数组分成5个元素一组,共计n/5个小组。

2. 对这n/5个小组进行排序,并求出其对应的中位数,m_{k}, k代表第k个小组

3. 选出上述n/5 个中位数的中位数,这一步可以迭代使用RS(  \{m_{k},1\leq k\leq \frac{n}{5}\} ,n/5, median)算法,为了方便我们用m_{f}代表,作为我们的最终的pivot

4. 将原数组根据m_{f}分成两部分,一部分都比m_{f}小,另一部分都比m_{f}大,同时假设第一部分得元素个数为j-1。

5. if j>i, return RS(1st part of A, j-1, i);

6 if j<i, return RS(2nd part of A, n-j, i-j);

7. if j=i, return p

 可以看到,相较于RS算法,D-RS算法就是多了1-3步,主要就是给出了一种确定性方法挑选pivot。 首先第2步中,我们对长度为5得数组排序等操作都能再常数时间内完成,因此复杂都为\mathcal{O}(1),由于有n/5个这样得组,因此消耗得复杂度都为\mathcal{O}(n)。和第4步得复杂度都保持一致。

而第3步由于递归调用RS算法,因此复杂度为T(\frac{n}{5})。关键是第5步或者第6步得复杂度都为多少。

lemma 1:使用m_{f}为pivot,第5或6步得输入规模至少下降30%,小于\frac{7n}{10}

Proof: 我们可以将数组按如下方式排列:

 

 我们可以看到,红色部分得元素都比m_{f}要小,而蓝色部分得元素都比m_{f}大,注意这里得中位数们都是按照升序排列过的。

绿色椭圆内元素得个数必然为\frac{3n}{5},而红色部分,或者蓝色部分至少也有绿色部分得一半,即\frac{3n}{10}。因此,至少输入规模下降30%。

所以整体算法得复杂都为

T(n) = T(\frac{n}{5}) + T(\frac{7n}{10})+ \mathcal{O}(n)

这个复杂度得式子没办法直接使用master method,因此子任务规模不一样。因此,我们证明该复杂度式子是\mathcal{O}(n),数学归纳法。

n=1时,显然T(1)必然时常数。

设,n=k>1时, T(n) = cn。

T(n) = c_{1}\frac{n}{5} +c_{2} \frac{7n}{10} + c_{3}n=\mathcal{O}(n),证毕。

到这里,我们也填上了快速排序那里得一个坑,即中位数能够再线性时间复杂度内找到,快速排序可以一定得到\mathcal{O}(n\log n)得复杂度。

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值