TopK问题的求解
2017-03-31 18:17
232 查看
TopK问题的求解
TopK问题
设有N个数,要确定其中第K大(小)的数,或者求最大(小)的K个数字。方法一:将N个数排序,然后输出第K个(或者前K个)。
方法二:选择前K个数组成一个数组,对这K个数的数组进行排序,然后逐个读入新的数,如果新的数比数组的第K个大,则将新的数替换掉数组的第K个数,然后进行排序,如果新的数比数组的第K个小,则忽略。重复以上步骤,直到所有数字都读完。最后数组里剩下的就是最大的K个数。
显然在N比较大,即数字比较多的时候,第二种方法的时间复杂度将远好于第一种。由于方法一的时间复杂度为O(NlogN)(考虑快速排序),而第二种方法的时间复杂度则可以认为是线性时间的,即O(N)。
TopK问题O(N)算法实现(Java)
/* 这里的TopK实现的是:返回第K小的数值 */ public class TopK { public static int selectTopK(int[] A,int topK){ int[] tempTopk = new int[topK]; for (int i = 0; i < tempTopk.length; i++) { // 选择前k数排序 tempTopk[i] = A[i]; } InsertionSort.insertSort(tempTopk); // 排序 for (int i = topK; i < A.length; i++) { if (A[i]<tempTopk[topK-1]) { // 如果比数组第K个小 tempTopk[topK-1]=A[i]; // 将最后一个挤出 InsertionSort.insertSort(tempTopk); // 新来的数插入 } } return tempTopk[topK-1]; // 返回第K个 } } // 这里使用插入排序 class InsertionSort{ public static void insertSort(int [] A) { int j; for(int i = 1;i<A.length;i++){ int temp = A[i]; // 将该回合位置值存放 for( j = i;(j>0)&&(temp<A[j-1]);j--){ // 从该位置向前开始比较 A[j] = A[j-1]; // 向右移 } A[j] = temp; // 移动的最左边空位将值放回 } } }
相关文章推荐
- 快速排序的两种改进方法算法及topK问题求解
- 汉偌塔问题求解方法
- 求解问题郁闷中
- 模拟退火算法求解TSP问题--转载
- 使用C#求解N皇后问题。
- 工作中碰到的几个问题,网络中求解!!
- 动态规划求解最长公共子串问题
- 全排列问题之递归求解
- [转]最长递增子序列问题的求解
- 一元三次方程的求解问题
- 求解新闻系统常见问题!
- 回溯法求解8皇后问题(转帖)
- 算法问题求解
- 求解exists子查询执行机制或原理问题
- 以前的作业:八皇后问题求解
- 经典8皇后问题求解,C#2.0版本
- 八数码问题完全版-是否可解判断及求解
- 求解在SQL中使用了where列所遇到的问题
- 全排列问题之递归求解
- 一个非线性约束问题的lingo求解