选择问题的算法
来源:互联网 发布:希捷硬盘数据恢复软件 编辑:程序博客网 时间: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,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于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)的方法对原数组建最大堆,然后pop出k次即可。时间复杂度为O(4*n +k*logn)
解法6:利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)
解法7:利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)
3、算法孰优孰劣
我们知道,这7种方法都是可行的,但问题是,谁更好一些呢?哪个运行的效率更高,需要的计算时间更小?验证他们,也许我们可以通过大量的数据进行实验才得知。比如,N为1000万,K为300万,那么处理起来,计算机真的要好久才能出结果。
选择问题的根本可以归结为一般的排序问题。
- 选择问题的算法
- 选择问题的线性期望时间算法
- 关于“语句”和“算法”的选择问题
- 贪心算法求解问题的选择准则
- 算法 活动选择问题
- 选择问题算法
- C++选择问题算法
- 双排序:从算法的选择到问题求解
- 关于DNS转发时地址选择算法的问题
- 如何为分类问题选择合适的机器学习算法
- 如何为分类问题选择合适的机器学习算法
- 贪心算法基本概念与活动选择问题的求解
- 算法之活动选择问题
- 算法:元素选择问题总结
- 贪心算法活动选择问题
- 贪心算法---活动选择问题
- 贪心算法-活动选择问题
- 贪心算法--活动选择问题
- 用HTML和JS做简单的注册验证
- java socket通信
- C# TreeView绑定 能展示xml属性
- C语言运算符优先级和口诀
- loadrunner走socket协议写发送数据脚本
- 选择问题的算法
- listfragment onlistitemclick 没有响应 没有调用
- SSH不能连接并提示REMOTE HOST IDENTIFICATION HAS CHANGED解决
- dos 批处理
- android菜鸟开发遇到的小问题
- 25年后的统计系会是什么样?
- 12045徐波:PMBOK融会贯通:几种估算类比:类比估算、参数估算、自下而上估算、三点估算
- CSS学习笔记-学习CSS布局
- 第十一周