求海量数据的topK问题
来源:互联网 发布:人工智能有关英语作文 编辑:程序博客网 时间:2024/06/05 04:03
问题描述:
取给定List中的前TopK个最大的元素并输出。
关键点:
1. topK个最大的元素
2. 我们并不需要顺序,因此一切涉及到sort的工作都是不必要的。
3. 要且只要topK个元素,no more needed!!
因此,我们虽然用堆,但并不需要将整个list都建成堆,只需要维护一个K个元素的堆即可。
其次,我们的堆并不用来排序,这点很重要!!!
具体步骤如下:——求最大的TopK个元素
1. 建一个K个元素的空堆 HP,即一个K个元素的数组
2. 遍历原List,将元素依次压入HP中,在压入过程中:
2.1 如果压入的个数还不到K个,则直接压入,
2.2 如果压入之后的个数达到K个,则将该K个元素维护成一个堆结构
2.3 在压入每个元素之前,如果HP中已经有K个元素,则将新元素与HP的第一个元素比较
2.3.1 如果新元素大于HP的第一个元素,则将新元素放在HP的第一个位置,并调整HP堆。
2.3.2 如果新元素小于HP的第一个元素,则continue 到 2.
遍历完后HP中的K个元素即为List中的前TopK大的元素。
package sortNumbers;public class SortNumbers {/* * */public static void adjustMinHeap(int[] a,int pos,int len){int temp;int child;for(temp = a[pos];2*pos+1<=len;pos=child){child = 2*pos + 1;if(child < len&&a[child]>a[child+1]){child++;}if(a[child]<temp){a[pos] = a[child];}elsebreak;}a[pos] = temp;}public static void myMinHeapSort(int[] array){int i;int len = array.length;int k = 3;// 查找最大的3个数for(i = k/2-1;i >= 0;i--){adjustMinHeap(array,i,k - 1);}int tmp = 0;for(int j = k;j < len;j++ ){if(array[j] > array[0]){tmp = array[j];array[j] = array[0];array[0] = tmp;adjustMinHeap(array,0,k -1);}}}public static void main(String[] args) {// TODO Auto-generated method stubint i = 0;int a[] = {15,5,13,4,9,11,10,8,7,6,0,12,1,3,2,14};int len = a.length;myMinHeapSort(a);for(i = 0;i < len;i++){System.out.print(a[i]+" ");}}}
0 0
- 求海量数据的topK问题
- 海量数据的topK问题
- 海量数据的TopK问题
- # 海量数据下的TopK问题
- 海量数据Topk及重复问题
- 海量数据topK算法
- 海量数据取topk
- 海量处理topk问题
- 关于海量数据TopK问题的一个具体实现(java)
- TopK问题,在海量数据中寻找最大的K项
- 海量数据中找出前k大数(topk问题)
- 海量数据中找出前k大数(topk问题)
- 海量数据中找出前k大数(topk问题)
- 海量数据求中位数的问题_world
- 海量数据中,找出出现次数TOPK的记录
- 求topK问题
- 求TopK问题
- 如何在海量数据中查找最相似的topk样本
- Swift 滑块 UISlider
- matlab读取avi视频问题总结(结合别人的解决方法)
- Junit 单元测试 @Before @After。。。
- 关于内存管理思考方式的一些学习总结
- 将eclipse变得更加漂亮
- 求海量数据的topK问题
- STM32F100X RCC_APB2Periph_AFIO--复用IO时钟的使用
- 51nodoj 1135 (原根)
- scala 运行计时 App scala.time
- Filter过滤器学习总结
- stm32学习笔记 系统时钟
- lightoj 1042 Secret Origins(位运算符号的应用)
- 判断二叉树是否平衡 java
- tes