C++ 中的 Priority Queues

官方參考文檔:priority_queue - C++ Reference - cplusplus.com

本文譯自 https://www.fluentcpp.com/2018/03/20/heaps-and-priority-queues-in-c-part-3-queues-and-priority-queues/

無意間搜到這篇文章,十分喜歡作者對 Priority Queues 的介紹,特此翻譯過來分享給大家。

priority queue 是一個不遵循先入先出規則的隊列。

在 priority queue 中,我們可以添加連續的數據 ,並在常數時間內得到具有最高優先級的數據。

因此,要實現一個 priority queue,我們需要指定元素之間的比較規則來確定哪個元素具有較高的優先級。

在 C++ 中,我們可以使用 std::priority_queue 來包裝另一個容器(默認是 std::vector)。std::priority_queue 默認使用 std::less 來比較元素。因此具有最高優先級的元素是 最大的 那個元素。

std::priority_queue 也允許我們自定義比較方式。比如,我們可以使用 std::greater,這樣的話,具有最高優先級的元素是 最小的。我們也可以用其他的自定義比較符來比較自定義類型等。

std::priority_queue 提供了優先隊列的接口:

  • push:在隊列中添加新的元素
  • pop:移除隊列中優先級最高的元素
  • top:訪問隊列中優先級最高的元素

什麼時候優先隊列有用?一個例子是處理具有不同優先級的傳入事件。我們希望根據事件的優先級處理事件,而不是根據事件的到達順序。

堆實際上是優先隊列的一種實現方式。

關於優先隊列的運用,可以參考一下 Leetcode 數組中的第K個最大元素

該題可以使用自定義比較方式來用優先隊列來模擬一個最小堆來完成。

int findKthLargest(vector<int>& nums, int k) {
    priority_queue<int, vector<int>, greater<int>> q;

    for (int num : nums) {
        q.push(num);

        if (q.size() > k) {
            q.pop();
        }
    }

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