TopK问题的求解
TopK问题
- 设有N个数,要确定其中第K大(小)的数,或者求最大(小)的K个数字。
- 方法一:将N个数排序,然后输出第K个(或者前K个)。
- 方法二:选择前K个数组成一个数组,对这K个数的数组进行排序,然后逐个读入新的数,如果新的数比数组的第K个大,则将新的数替换掉数组的第K个数,然后进行排序,如果新的数比数组的第K个小,则忽略。重复以上步骤,直到所有数字都读完。最后数组里剩下的就是最大的K个数。
- 显然在N比较大,即数字比较多的时候,第二种方法的时间复杂度将远好于第一种。由于方法一的时间复杂度为O(NlogN)(考虑快速排序),而第二种方法的时间复杂度则可以认为是线性时间的,即O(N)。
TopK问题O(N)算法实现(Java)
public class TopK {
public static int selectTopK(int[] A,int topK){
int[] tempTopk = new int[topK];
for (int i = 0; i < tempTopk.length; i++) {
tempTopk[i] = A[i];
}
InsertionSort.insertSort(tempTopk);
for (int i = topK; i < A.length; i++) {
if (A[i]<tempTopk[topK-1]) {
tempTopk[topK-1]=A[i];
InsertionSort.insertSort(tempTopk);
}
}
return tempTopk[topK-1];
}
}
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;
}
}
}