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

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

使用findMinK(ArrayListarray, 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中查找。

下面是代码实现:

packagedisorder_List;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Random;public classTestDisorder {static public int cmpcnt = 0;public static voidmain(String[] args) {

testFramework();

}public static int partion(ArrayList A,int low,inthigh){int pivotkey=A.get(low);while(low=pivotkey)

high--;

A.set(low, A.get(high));

cmpcnt++;while(low

low++;

A.set(high, A.get(low));

cmpcnt++;

}

cmpcnt++;

A.set(low, pivotkey);returnlow;

}public static int findMinK(ArrayList array, int k, int l, intr) {//Implement here

if(l<=r){int pivotloc=partion(array, l, r);if(pivotloc==k-1){returnarray.get(pivotloc);

}else if(pivotloc

}else{return findMinK(array, k,l,pivotloc-1);

}

}else{return -1;

}

}public static int findMinK(ArrayList array, intk){

Collections.sort(array);return array.get(k-1);

}private static voidtestFramework() {

ArrayList a = new ArrayList();for (int j=2;j<8;j++){

a.clear();for (int i=0;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)

....

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

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

  1. mysql查询表中名字包含某个字符_查询当前数据库中所有用户表中哪些字段包含某个字符串...

    展开全部 CREATE PROCEDURE FindString(@Value VARCHAR(1024)) AS BEGIN SET NOCOUNT ON; DECLARE @SQL VARCHAR ...

  2. 二叉搜索树中第k大元素_二叉搜索树中第K个最小元素

    二叉搜索树中第k大元素 Problem statement: 问题陈述: Find the k-th smallest element in a given binary search tree (B ...

  3. 二叉搜索树的第 k 大节点(递归,反中序遍历 + 提前返回)

    题意: 给定一棵二叉搜索树,请找出其中第k大的节点. 基于此性质:二叉搜索树的中序遍历为 递增序列 根据以上性质,易得二叉搜索树的 中序遍历倒序 为 递减序列 . 因此,求 "二叉搜索树第 ...

  4. python取出矩阵中的某一元素_将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例...

    在神经网络计算过程中,经常会遇到需要将矩阵中的某些元素取出并且单独进行计算的步骤(例如MLE,Attention等操作).那么在 tensorflow 的 Variable 类型中如何做到这一点呢? ...

  5. python矩阵中找满足条件的元素_从numpy数组中取出满足条件的元素示例

    例如问题:从 arr 数组中提取所有奇数元素. input:arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) output: #> array([1, ...

  6. java 查找链表中间元素_如何在Java中一次性查找Java中链表的中间元素

    如何在一次传递中找到LinkedList的中间元素?这是一个 Java 和非Java程序员面试时经常被问到的编程问题.这个问题类似于检查回文或计算阶乘,有时也会要求编写代码.为了回答这个问题,候选人必 ...

  7. python怎么从数组中提取连续的数字_从numpy数组中删除连续的数字

    我是python新手,但我对我要做的这个项目真的很困惑.我看到了一张图片here.我要做的是找出图像中像素范围从0到255的所有方块的平均值.下面的代码显示了我用来计算图片值的方法.出现的问题是像素/ ...

  8. java数组删除数组元素_如何在Java中删除数组元素

    java数组删除数组元素 When we create an array in Java, we specify its data type and size. This is used by JVM ...

  9. python读取视频里面爱豆出现的时间_计算任意视频中各人物的出镜时间(附Python实现)...

    编译:Bing编者按:本文作者Pulkit Sharma分享了一篇有趣的项目,以<猫和老鼠>为例,计算任意视频中汤姆猫和杰瑞鼠的出镜时长.这一模型也可以用于其他电影,轻松统计各演员的上镜时 ...

最新文章

  1. Confluence 6 指派和撤销空间权限
  2. [ACM_几何] Wall
  3. nginx-URL重写
  4. 怎么拦截触摸事件IOS
  5. RxJs 操作符 withLatestFrom 在 SAP 电商云 Spartacus UI 中的应用
  6. Sharepoint学习笔记—Ribbon系列
  7. Linux加密框架中的算法和算法模式
  8. burp爆破线程设置多少_你知道线程池创建多少线程比较合理吗?
  9. 英国python工资_在伦敦金融城当数据分析师-Python篇
  10. JavaScript的类型转换
  11. ArcGIS操作小技巧(六)之Network Analyst工具条不能使用的解决方法
  12. Navicat premium11 一键破解 无需注册码
  13. Win10 wifi、蓝牙打不开
  14. iOS及Android消息推送方案安装使用入门
  15. 黄金矿工java_欢乐黄金矿工游戏
  16. 5.Transformation(转换算子)
  17. window10下的VS2019环境变量配置教程
  18. Pytorch每日一练——预测泰坦尼克号船上的生存乘客
  19. 小白学react之页面BaseLayout框架及微信的坑
  20. windows生成App Store上架所需的各尺寸截图的方法

热门文章

  1. Windows XP下Service的编程入门[1]
  2. 如何成为一名优秀的高级C/C++程序员
  3. 经典面试题(40):以下代码将输出的结果是什么?
  4. 经典面试题(36):以下代码将输出的结果是什么?
  5. android自定义dialog 例子,android dialog自定义实例详解
  6. python bytes查找位置_Python进阶5---StringIO和BytesIO、路径操作、OS模块、shutil模块
  7. django开发中安装包时遇到的 关于 read timed out的问题的解决
  8. Cytoscape可视化物种分类树结构
  9. R语言学习 - 非参数法生存分析
  10. Laravel配置自带组件实现各类型邮件发送功能的代码实例