Quick Selection(快速选择算法)
常年见到快速排序算法,当在普林斯顿大学的网课上看到这个Quick Selection算法的时候,直接蒙住了——这个是什么,和快速排序有什么关系啊?
于是迅速查阅了维基百科,大致了解了其思想,再结合课程中的ppt,终于搞明白了。不得不说这是个很巧妙的算法,把原先要nlogn复杂度的问题,简化为logn.
想起来以前在竞赛和面试时候碰到过类似的情况,都是要找出第n大的数,当时第一个想到的就是排序,然后再通过定位来求解。这回是长记性了,哪有不用更高效算法的道理呢?!
Quick Selection原理
Quick Selection算法和Quick Sort算法是由同一个作者提出,这两者之间有很大的相似之处——分治,即将问题的规模一次次的减小,直到求出最终解。
目标:找到第n大的数
- 随机产生一个pivot
- 根据这个pivot,将小于其的数放左边,大于其的数放右边
- 更新第n大数的估计值的位置,选择其中一边,直到=n
- 重复2、3步骤
操作的情况大致如下图所示:v即为pivot
Quick Selection复杂度分析
假设找的数以平均情况计算(被找的数每次都在中间部分),令O(N)为总的时间复杂度,N+O(N/2)为第O(N)次查找所需要的时间。按照以下公式进行递推,可以推出,最终O(N)近似等于2N,即O(N)=N。
而最坏情况时(被找的数每次都在最边上),。当然也不用过于担心,有很多方式,通过重新洗牌,使数据尽量的无序,达到平均情况。(Shuffle、Turkeys's ninth 等还是挺不错的)
来自算法课程 PPT,其计算得出的结果