当需要在无需列表中寻找第k小的元素时,一个显然的方法是将所有数据进行排序,然后检索k个元素。这种方法的运行时间为O(n log(n))。

无序列表调用分区函数将自身分解成两个子表,其长度为i和n-i。第一个列表中的第一个i元素(不一定排序),当i与k进行比较时需在第一或第二个子列表中搜索元素。

使用findMinK(ArrayList<Integer>array, int k, int i, int r)实现,同时使用下面testframe代码测试。在函数中可增加全局变量cmpcnt,在列表中利用分区函数交换元素时计数。

对findMinK函数的实现,利用了快排的思想:

先从n个元素中找一个任意分界点,设为m,假设m在列表中的位置是i

先从n个元素中随便寻找一个数m作为分界点,m在列表中的位置为i

当 i = k时,m就是我们要寻找的第k小的数;

当 i > k时,我们就从1~i-1中查找;

当 i < k时,就从i+1~n中查找。

下面是代码实现:

package disorder_List;import java.util.ArrayList;
import java.util.Collections;
import java.util.Random; public class TestDisorder { static public int cmpcnt = 0; public static void main(String[] args) { testFramework(); } public static int partion(ArrayList<Integer> A,int low,int high){int pivotkey=A.get(low);while(low<high){while(low<high&&A.get(high)>=pivotkey)high--;A.set(low, A.get(high));cmpcnt++;while(low<high&& A.get(low)<pivotkey)low++;A.set(high, A.get(low));cmpcnt++;}cmpcnt++;A.set(low, pivotkey);return low;}public static int findMinK(ArrayList<Integer> array, int k, int l, int r) { // Implement here if(l<=r){int pivotloc=partion(array, l, r);if(pivotloc==k-1){return array.get(pivotloc);}else if(pivotloc<(k-1)){return findMinK(array, k,pivotloc+1,r);}else{return findMinK(array, k,l,pivotloc-1);}}else{return -1;}} public static int findMinK(ArrayList<Integer> array, int k){ Collections.sort(array); return array.get(k-1); } private static void testFramework() { ArrayList<Integer> a = new ArrayList<Integer>(); for (int j=2;j<8;j++){ a.clear(); for (int i=0;i<(int)Math.pow(10, j);i++){ a.add(i); } System.out.println("nn"+a.size()+" Elementsnn"); double slow=0; double fast=0; for (int i = 0; i < 2; i++) { cmpcnt = 0; Collections.shuffle(a); int k = (int)(Math.random()*(Math.pow(10, j)-1))+1; System.out.println("test run number: " + i + " find: " + k); long start = System.currentTimeMillis(); int resulta = findMinK(a, k, 0, a.size()-1); long end = System.currentTimeMillis(); long smarttime=(end-start); fast = fast + smarttime; System.out.println("SMART ALGO t --- time in ms: " + smarttime + " comparisons: " + cmpcnt); start = System.currentTimeMillis(); int resultb=findMinK(a, k); end = System.currentTimeMillis(); long slowtime = (end-start); System.out.println("WITH SORTING t --- time in ms: " + slowtime); slow = slow + slowtime; }            System.out.println("sorting (="+slow+"ms) is " +slow/fast + " times slower than smart algo (="+fast+"ms)"); } }
} 

View Code

以下是部分输出结果:

sorting (=3.0ms) is 3.0 times slower than smart algo (=1.0ms)

sorting (=24.0ms) is 12.0 times slower than smart algo (=2.0ms)

sorting (=41.0ms) is 8.2 times slower than smart algo (=5.0ms)

sorting (=401.0ms) is 4.773809523809524 times slower than smart algo (=84.0ms)

....

可明显看出该方法的优势。

转载于:https://www.cnblogs.com/tina-smile/p/3658946.html

查询无序列表中第K小元素相关推荐

  1. python 无序列表中第k大元素_查询无序列表中第K小元素

    当需要在无需列表中寻找第k小的元素时,一个显然的方法是将所有数据进行排序,然后检索k个元素.这种方法的运行时间为O(n log(n)). 无序列表调用分区函数将自身分解成两个子表,其长度为i和n-i. ...

  2. python 无序列表中第k大元素_Python要求O(n)复杂度求无序列表中第K的大元素实例...

    昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了...感觉应该刷一波Leecode冷静下...今天抽空看下. 题目就是要求O(n)复杂度求无序列表中第K的大元素 如果没有复杂度的限制很 ...

  3. python列表求平均值_长篇文讲解:Python要求O(n)复杂度求无序列表中第K的大元素实例...

    本文内容主要介绍了Python要求O(n)复杂度求无序列表中第K的大元素实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法 ...

  4. 求包含n(n>1)个元素的无序序列中第k小的元素。

    求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...

  5. 求列表最大元素不用max_python3实现从一个无序列表中求取连续元素之和中最大的和...

    介绍 今天遇到一个需求,要求从一个无序列表中求取连续元素之和中最大的和.使用python做了实现,后来想着可以作为一个小知识点分享出来,或许能在某时某刻给某位同学一些帮助.下面就直接上代码(图片和文字 ...

  6. 分治算法求解列表中第k小的数

    分治算法地思想就是将复杂问题分解为简单的子问题,然后寻求子问题的地归结,并组合各个子问题的解一起得到最终复杂问题的解. 针对求解列表中第k小的数,暴力拆解法可以将列表排序然后根据索引求出列表中第k小的 ...

  7. 算法导论:快速找出无序数组中第k小的数

    题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1). ...

  8. java第k小元素_java – 如何从对象列表中提取K“最小”元素?

    我会对清单进行排序.然后,我将创建一个包含这10个最小对象的列表,并更改原始列表list1以包含其余对象.就像是: Collection.sort(list1); ArrayList yourSmal ...

  9. Hoare选择算法 寻找第k小元素C实现 算法的“AWK脚手架和grap运行过程分析”

    现实生活中常有找"最大"."最小"及"中位数"等需求,解决这样的问题不用将整个序列排序.寻找"最大"."最小& ...

最新文章

  1. 是时候搁置Grunt,耍一耍gulp了
  2. Docker容器中MySQL最大连接数被限制为214的解决方案
  3. 【错误记录】未安装该应用 ( 在 Android 12 之后 组件设置 android:exported=“false“ 属性 )
  4. 基于超级账本Fabric的供应链跟踪解决方案【开源】
  5. vector容器中重写sort方法
  6. day1-Linux操作系统基础
  7. 第22篇 js中的this指针的用法
  8. Android Studio中手机能连接上ADB不过一直跑不起来(或者应用出现短暂的白屏)
  9. 用php解二元一次方程程序,编写一个程序,求二元一次方程组,编写一个程序,求二元一次方程组的解...
  10. [ASM] 基础概念
  11. 视频课程:高等数学考研辅导讲座-上
  12. excel处理几十万行数据_如何用Excel处理200万行以上数据?
  13. 三种健身妙法-每天五分钟简便易行有宏效
  14. oracle数据库中小数小于1时0不显示
  15. 今日干货:mac视频剪辑软件推荐
  16. cv2绘图 cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText() python
  17. Vue移动网页开发调试过程(第二篇)——weinre
  18. 数据库与身份认证:MySQL的基本使用
  19. JAVA中的String[] args和String args[]详解。
  20. 【渝粤题库】陕西师范大学180204市场营销学 作业(高起本)

热门文章

  1. 图像学习-验证码识别
  2. 如何使用OSQP-Eigen
  3. 复述-软考网规--云计算专题
  4. android开发板功能,Android中NFC模块PN532开发板应用/原理图/PCB等全部资料
  5. python 超参数_OpenCV python sklearn随机超参数搜索的实现
  6. 鸿蒙系统无限延期,鸿蒙系统下月到来,三款手机首批升级,华为P50系列延期发布!...
  7. android intent enum,enum类型被intent所携带时需要注意的地方
  8. 茂名2021高考成绩查询入口,茂名高考成绩查询入口
  9. linux png格式的文件,PNG文件结构分析之一(了解PNG文件存储格式)(转)
  10. 采样定理实验报告matlab,matlab验证时域采样定理试验报告