topK问题
给定一批数,如n个, 然后从中找出k个最大(小)的数。
具体一个场景,比如给出1000w个数,找出最大的100个。
topK思路
在求解 TopK 问题时, 使用堆是最佳方法。
思路:
先把数组前K个元素建立一个堆,后面每拿到一个元素就和堆顶元素进行比较。
前k个最大的建立小堆,前K个最小的建立大堆。
topK实现
public class TopK {
public static Integer[] topK(int[] array,int k){
MyComparator myComparator = new MyComparator();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
for (int i = 0; i < array.length; i++) {
if (maxHeap.size() < k) {
maxHeap.offer(array[i]);
} else {
Integer val = maxHeap.peek();
if (val != null && val > array[i]) {
maxHeap.poll();
maxHeap.offer(array[i]);
}
}
}
Integer[] ret = new Integer[k];
for (int i = 0; i < k; i++) {
int v = maxHeap.poll();
ret[i] = v;
}
return ret;
}
public static void main(String[] args) {
int[] array = {10,1,7,8,18,20,15};
Integer[] ret = topK(array,4);
System.out.println(Arrays.toString(ret));
}
}