Quick Selection(快速选择算法)

常年见到快速排序算法,当在普林斯顿大学的网课上看到这个Quick Selection算法的时候,直接蒙住了——这个是什么,和快速排序有什么关系啊?

于是迅速查阅了维基百科,大致了解了其思想,再结合课程中的ppt,终于搞明白了。不得不说这是个很巧妙的算法,把原先要O(nlogn)复杂度的问题,简化为O(n),且数据无需有序.

想起来以前在竞赛和面试时候碰到过类似的情况,都是要找出第n大的数,当时第一个想到的就是排序,然后再通过定位来求解。这回是长记性了,哪有不用更高效算法的道理呢?!


Quick Selection原理

Quick Selection算法和Quick Sort算法是由同一个作者提出,这两者之间有很大的相似之处——分治,即将问题的规模一次次的减小,直到求出最终解。

目标:找到第n大的数

  1. 随机产生一个pivot
  2. 根据这个pivot,将小于其的数放左边,大于其的数放右边
  3. 更新第n大数的估计值的位置,选择其中一边,直到=n
  4. 重复2、3步骤

操作的情况大致如下图所示:v即为pivot

Quick Selection复杂度分析 

假设找的数以平均情况计算(被找的数每次都在中间部分),令O(N)为总的时间复杂度,N+O(N/2)为第O(N)次查找所需要的时间。按照以下公式进行递推,可以推出,最终O(N)近似等于2N,即O(N)=N。

而最坏情况时(被找的数每次都在最边上),O(N)=N^{2}。当然也不用过于担心,有很多方式,通过重新洗牌,使数据尽量的无序,达到平均情况。(Shuffle、Turkeys's ninth 等还是挺不错的)

来自算法课程 PPT,其计算得出的结果

标题

 

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值