簡體   English   中英

為什么 std::priority_queue 使用最大堆而不是最小堆?

[英]Why does std::priority_queue use max heap instead of min heap?

我一直想知道為什么 STL 優先級隊列默認使用最大堆而不是最小堆。 我想到的兩個明顯用例是尋路 (Dijkstra) 和構建霍夫曼代碼。 兩種算法都需要先拉取最小元素。 由於排序 (std::sort) 默認使用升序,我想知道 priority_queue 背后的設計原因是什么,因為我更喜歡默認情況下的最小堆。

Priority_queue 改編自 make_heap/pop_heap/push_heap/sort_heap。 當您使用 less 進行 make_heap 時,元素按升序排列。 最后一個元素被視為根元素。 所以它是最大堆。 我想有兩個原因:

  1. 我們總是在所有默認的 STL 排序中使用 less。
  2. push_back() 或 pop_back() 比 push_front() 或 pop_front() 高效得多。

這是有原因的,但這與 C++ 的互連特性有關。

priority_queue被設計為一個易於使用的封裝make_heappop_heappush_heap 堆函數將最大值保留在前面是有意義的,因為這是您能夠實現sort_heap ,它也使用堆函數。

當然,您始終可以使用greater而不是less來實例化priority_queue以獲得您想要的行為。

在英語中,優先級更高的事情應該先發生。 因此,在優先級隊列中,優先級高的東西應該先被彈出。

基本上你的問題的答案是因為優先級這個詞的定義強烈暗示從大到小排序。

想象一下像醫院大廳這樣的優先隊列。 優先級最高的患者(緊急情況)應該排在治療隊列的最前面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM