用法
先说结论,JAVA中默认是小根堆,即小的在堆顶(poll时小的出去)
接下来看下默认的最小堆写法
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return o1 < o2 ? -1 : 1;
// 最小优先队列,直接 return o1.compareTo(o2);
}
});
// 最大优先队列,则反过来 return o2.compareTo(o1);
compare含义
compare(Integer o1, Integer o2)
一定要记住o1是待插元素,o2是最后一个非叶子节点,当compare()返回的值<0时入队,>0时不入队
-
小根堆:o1若要入队,则o1<o2,同时compare需要返回负的,即o1.compareTo(o2)
-
大根堆:o1若要入队,则o1>o2,同时compare需要返回负的,即o2.compareTo(o1)
具体场景
TopK问题:
一、找海量数据中最大的K个
构造小根堆,堆顶为最小数,不断入队,当队列数大于K时,将最小的堆顶弹出,最后剩下的就是K个最大数
二、数组中最小的K个
构造最大堆,堆顶为最大数,不断入队,当队列数小于K时,将最大的堆顶弹出,最后剩下的就是K个最小数