堆(優先隊列)

定義

堆(heap)也被稱爲優先隊列(priority queue)。是一種特殊的樹狀數據結構。

普通隊列是先進先出(first in first out),而優先隊列出棧的順序是按照元素的優先權大小。

堆可以分爲”大頂堆“也稱”最大堆“(最大值優先出列),”小頂堆“也稱”最小堆“(最小值優先出列)。

堆的常用方法:

  • 構建優先隊列
  • 快速找出最大值(最小值)

實現

堆是用數組實現的完全二叉樹。目前有多種算法可以實現堆,速度最快的是斐波那契堆。

具體的實現可以參考一下這兩篇文章

Learning to Love Heaps
Heap

使用

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();
    }
}

參考資料

Heap wiki
Learning to Love Heaps
Heap
Heap Data Structure

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章