Top k 问题
解决 topK 问题的步骤:
1、建立一个小顶堆
2、将前k个数先添加进小顶堆里面
3、从k+1个数开始,和堆顶元素进行比较,如果大于堆顶元素,则进行replace
4、最后堆里面剩下的元素就是最大的k个数
找出最小的k个数的思路和TopK的思路一样:
使用大顶堆,当k+1开始的元素小于堆顶元素的时候,进行replace,最终堆即为所求
// 1、建立一个小顶堆
BinaryHeap<Integer> heap = new BinaryHeap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
int k = 3;
Integer[] data = new Integer[]{72, 43, 17, 44, 85,
54, 71, 2, 96, 81, 36, 6, 62, 73, 88, 50,
34, 84, 14, 11, 98, 76, 60, 83, 58, 55,
97, 29, 40, 68, 100};
for (Integer datum : data) {
if (heap.size() < k) { // 2、将前k个数先添加进小顶堆里面
heap.add(datum);
}else if (datum > heap.get()){ // 3、从k+1个数开始,和堆顶元素进行比较,如果大于堆顶元素,则进行replace
heap.replace(datum);
}
}
BinaryTrees.println(heap); // 4、最后堆里面剩下的元素就是最大的k个数