基于堆排序实现的找出N个数据的前M大数据之Java实现
来源:互联网 发布:阿里云快速备案 编辑:程序博客网 时间:2024/04/29 21:51
算法思想:
当有N个数据,而N又是非常大(比如:千万或者亿),需要找出N条数据的排名最前的M条数据时,可以采用的一种策略。
先选前M个元素组成一个小根堆,然后遍历剩下的数据,如果第i个元素key大于小根堆的根结点,就删除这个根结点,并将元素key插入根结点,调整这个堆使其成为小根堆,然后继续遍历剩下的数据; 最后,小根堆中的元素就是最大的M个元素。
代码实现如下:
<span style="font-family:SimHei;"><span style="font-family:SimHei;font-size:14px;"><span style="font-size:14px;">HeapSort Class</span></span></span>
public abstract class HeapSort<E> {public abstract boolean compare(E value1, E value2);//value1小于value2则返回truepublic boolean heapSort(List<E> list){//排序return heapSort(list, list.size());}public boolean heapSort(List<E> list, int n){if(null == list || 0 == list.size()){return false;}if(!heapCreate(list, n)){return false;}for(int i = n; i > 0; --i){swap(list, 0, i - 1);heapAdjust(list, 0, i - 1);}return true;}public boolean heapCreate(List<E> list, int length){ //创建小根堆if(null == list || 0 == list.size()){return false;}for(int i = (length / 2 - 1); i >= 0; --i){if(!heapAdjust(list, i, length)){return false;}}return true;}public boolean heapAdjust(List<E> list, int middle, int length){//调整堆,使其满足小根堆的条件if(null == list || 0 == list.size()){return false;}E temp = list.get(middle);for(int i = (2 * middle + 1); i < length; i *= 2){if(i < (length - 1) && !this.compare(list.get(i), list.get(i + 1))){++i;}if(this.compare(temp,list.get(i))){break;}list.set(middle, list.get(i));middle = i;}list.set(middle, temp);return true;}public void swap(List<E> list, int i, int j){//数据交换E temp = list.get(i);list.set(i, list.get(j));list.set(j, temp);}}
FindFirstNData Class
public abstract class FindFirstNData<E> extends HeapSort<E>{public abstract boolean compare(E value1, E value2);public boolean findFirstNData(List<E> list, int n){if(!this.heapCreate(list, n)){return false;}for(int i = n; i < list.size(); ++i){if(!this.compare(list.get(0), list.get(i))){continue;}this.swap(list, 0, i);if(!this.heapAdjust(list, 0, n)){return false;}}return this.heapSort(list, n);}}
测试数据:给出10000000个Integer型的随机数据,找出前3大所用的时间如下图所示(单位:毫秒):
1 0
- 基于堆排序实现的找出N个数据的前M大数据之Java实现
- 基于堆排序实现的找出N个数据的前M大数据之Java实现
- 【数据结构】找出N个数据中最大的前k个数据(利用堆排序)
- 【数据结构】找出N个数据中最大的前k个数据(利用堆排序)
- 堆排序 海量数据求前N大的值
- 大数据处理堆实现N个数据找K个最大数据和堆排序
- 找出N个数据中的最大的K个数据---堆排序
- 从集合m个数据中选出n个无序数据集合,即数学公式C(m,n)的java实现
- 海量数据的处理1 找出前n个
- java实现打印list中重复次数最多的前n个数据
- java实现打印list中重复次数最多的前n个数据
- 从n个数中找出前m个最大的
- 排序练习——找出前m大的数字
- 排序练习——找出前m大的数字
- 排序练习——找出前m大的数字
- CDOJ 输出前m大的数据
- 算法兴趣----- 一亿数据获取前100个最大值(仅供参考,基于快速排序的实现时间不稳定,基于最小堆实现。如果我们只要求前K个最大(小)值的时候,用堆是最好的选择,因为这里不用每次都排序了)
- 大数据JAVA实现 基于皮尔逊相关系数的相似度
- spring batch(一):基础部分
- 管道 pipe 半双工/全双工
- Android Wear Preview- 归档通知(Stacking Notifications)
- 现在公开一个DHT网络爬虫网络爬虫供大家一起交流
- 编写shell脚本获取本机的网络地址。 比如:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是 192.168.100.1/255.255.255.
- 基于堆排序实现的找出N个数据的前M大数据之Java实现
- spring JdbcTemplate 的queryForObject:Incorrect result size: expected 1, actual 0
- final的使用方法
- Storm简介
- K折交叉验证
- 闲暇时间看了下DHT网络
- 基于四象限探测器的激光窃听及定位系统
- IOS----在其他视图控制器中转换根视图控制器
- 利用DHT网络原理制作bt采集蜘蛛