java 代码实现 Top N 问题
来源:互联网 发布:网易人工智能事业部 编辑:程序博客网 时间:2024/05/22 02:02
思路:用小根堆来实现,时间复杂度是O(nlgK),而且内存消耗是 K。时间复杂度消耗在代码中aaa 处
如果用海量数据排序,内存放不下,得用归并排序,最好最坏平均都是 O(nlgn)
代码如下:
package AlgorithmTopK;public class TopK {public int[] createHeapOther(int a[], int k) {int[] result = new int[k]; for (int i = 0; i < k; i++) { result[i] = a[i]; } for (int i = 1; i < k; i++) { int child = i; int parent = (i - 1) / 2; int temp = a[i]; while (parent >= 0 &&child!=0&& result[parent] >temp) { result[child] = result[parent]; child = parent; parent = (parent - 1) / 2; } result[child] = temp; } return result;}public int[] createHeap(int input[], int K) { //创建小根堆,复杂度最坏是nlgKint heap[] = new int[K];for(int i=0;i<K;i++)heap[i] = input[i];for(int i = 1;i < heap.length;i++) {int child = i;int parent = (child-1) / 2;while(parent >= 0 && child!=0 && heap[parent] > heap[child]) {int temp = heap[child];heap[child] = heap[parent];heap[parent] = temp;child = parent;parent = (parent - 1) / 2;}}return heap;}public void insertHeap(int heap[], int value) {heap[0] = value;int parent = 0;while(parent<heap.length) { //这个循环复杂度最坏是 logKint lchild = parent*2 + 1;int rchild = parent*2 + 2;int minIndex = parent; //指向左右儿子中最小的if(lchild < heap.length && heap[lchild] < heap[parent])minIndex = lchild;if(rchild < heap.length && heap[rchild] < heap[minIndex])minIndex = rchild;if(minIndex == parent) {break;}else {int temp = heap[minIndex];heap[minIndex] = heap[parent];heap[parent] = temp;parent = minIndex;}}}public int[] getTopKByHeap(int input[], int K) {int result[] = createHeap(input, K); //复杂度最坏是 O(nlgK)for(int i=K;i<input.length;i++) {if(input[i] > result[0]) insertHeap(result, input[i]); //复杂度最坏是O(nlgK),而且内存消耗就K,不然海量数据排序,内存放不下,得用归并排序,最好最坏平均都是 O(nlgn)}return result;}public static void main(String[] args) {int a[] = {4,3,5,1,2,8,9,10};//待找TOP K 的排海量数据Nint result[] = new TopK().getTopKByHeap(a, 6);System.out.print("TOP K is :");for(int resultItem : result) {System.out.print(resultItem + " ");}}}结果:
TOP K is :3 4 5 10 9 8
0 0
- java 代码实现 Top N 问题
- 分组Top N问题(一) - java实现Top n算法基础
- Spark:Java实现Top N
- Spark中实现TOP N (Java版本)
- Spark:Java实现分组取Top N
- SELECT TOP N 问题
- oracle top n 问题
- oracle top n 问题
- SELECT TOP N 问题
- 数据库 TOP N 问题
- 实现Oracle Top N
- Mysql实现TOP n
- TOP N (java)
- 分组Top N问题(二) - Hadoop MapReduce实现
- 分组Top N问题(三) - sql及Hive实现
- Top-N算法的实现(Java版)
- 讨论: SELECT TOP N 问题
- mysql实现TOP N功能
- 工作任务2016-04-22
- Hbase Table already exists问题
- socket输入流中读取一个固定长度的字节
- easyui常用控件及样式收藏
- 扩展 vfp9 自带的对象浏览器提取枚举值
- java 代码实现 Top N 问题
- 手机打开app时一直显示waiting for debugger,进不去app界面
- mybatis+ibatis 自动生成方法
- 爱的语言
- Android照相并返回照相结果的最终代码
- 邓白氏编码(duns number)申请以及填写方法-苹果开发者申请必用
- ./configure 参数详解
- 利用Spring的AbstractRoutingDataSource解决多数据源的问题
- Linux安装卸载MySQL以及修改MySQL初始密码