选择问题的算法

来源:互联网 发布:希捷硬盘数据恢复软件 编辑:程序博客网 时间:2024/04/26 03:51

1什么叫选择问题:

 

设有一组N个数,而要确定其中第K个最大者。 

 

 

2、问题的解法:

解法1:最容易想到的一种解法就是将这个N个数读入一个数组,然后通过某个比较简单的排序算法,如冒泡法,以递减顺序将数组排序,然后位置K上的数就是想要的第K个最大数。

总的时间复杂度为O(n*logn +k)。

 

解法2:可以先把K个元素读入数组,然后以递减的顺序排序,接着,便对剩下的元素逐一读入,每读入一个新元素,如果它小于数组中的最小者(即第K个元素)那么则忽略该元素,否则将其放在书组中正确的顺序上,必然的同时,将数组中最小的那个元素挤出数组。当算法终止时,位于第K个位置上的元素将作为答案返回。时间复杂度O(n * logk)

 

解法3利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分SaSbSa中的元素大于等于XSb中元素小于X。这时有两种情况:

           1.Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;

           2.Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

 

解法4二分[Smin,Smax]查找结果X,统计X在数组中出现,且整个数组中比X大的数目为k-1的数即为第k大数。时间复杂度平均情况为O(n*logn)

 

解法5:用O(4*n)的方法对原数组建最大堆,然后popk次即可。时间复杂度为O(4*n +k*logn)

 

解法6:利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)

 

解法7:利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)

 

 

 

3、算法孰优孰劣

 

我们知道,这7种方法都是可行的,但问题是,谁更好一些呢?哪个运行的效率更高,需要的计算时间更小?验证他们,也许我们可以通过大量的数据进行实验才得知。比如,N1000万,K300万,那么处理起来,计算机真的要好久才能出结果。

 

选择问题的根本可以归结为一般的排序问题。

原创粉丝点击