定義
堆(heap)也被稱爲優先隊列(priority queue)。是一種特殊的樹狀數據結構。
普通隊列是先進先出(first in first out),而優先隊列出棧的順序是按照元素的優先權大小。
堆可以分爲”大頂堆“也稱”最大堆“(最大值優先出列),”小頂堆“也稱”最小堆“(最小值優先出列)。
堆的常用方法:
- 構建優先隊列
- 快速找出最大值(最小值)
實現
堆是用數組實現的完全二叉樹。目前有多種算法可以實現堆,速度最快的是斐波那契堆。
具體的實現可以參考一下這兩篇文章
使用
LeetCode第703題Kth Largest Element in a Stream就是一個使用堆的場景,如果我們使用簡單的數組排序的方法很有可能超時,使用堆是該題的最優解之一。
class KthLargest {
private final PriorityQueue<Integer> q;
private final int k;
public KthLargest(int k, int[] nums) {
this.k = k;
q = new PriorityQueue<>(k);
for (int n : nums) {
add(n);
}
}
public int add(int val) {
if (q.size() < k) {
q.offer(val);
} else if (q.peek() < val) {
q.poll();
q.offer(val);
}
return q.peek();
}
}