簡體   English   中英

使用優先級隊列結構?

[英]Priority queue structure used?

在C ++標准庫文檔中搜索某些函數時,我讀到優先級隊列的推送和彈出需要恆定的時間。

http://www.cplusplus.com/reference/stl/priority_queue/push/

常量(在priority_queue中)。 雖然注意到push_heap在對數時間內運行。

我的問題是使用什么樣的數據結構來維護優先級隊列,其中包含推送和彈出的O(1)?

我假設你指的是cplusplus.com的頁面

它在頁面的前面說:

該成員函數有效地調用底層容器對象的成員函數push_back,然后調用push_heap算法以保持priority_queues的堆屬性。

因此,在O(1)推送之后,數據結構已丟失其堆屬性不變量,然后將始終遵循O(log N)調用以恢復該屬性。 換句話說, O(1)操作只是整個操作的一部分; 完整操作是O(1) + O(log N) ,它與O(log N)

我猜他們提到的原因是優先級隊列是一個適配器,他們試圖強調底層容器與適配器之間的區別。

priority_queue的底層存儲可以是vector或deque或任何類似的支持隨機訪問迭代器的存儲。 存儲作為堆維護,對於推送不是O(N),所以我懷疑你已經讀錯了

我對O(1)聲明持懷疑態度......你在哪里看到它?

無論如何,這里有一些關於gcc優先級隊列實現的注釋

沒有這種堆。 他們寫過它調用push_heap是對數的,所以它是logn。

該標准根據push_heappop_heap定義了這些成員,這意味着compilexity。

如果該引用所說的是真的(它表示top也是常量),為什么沒有人使用std::priority_queue實現通用O(N)排序?

第二,雖然這是參考文獻可能試圖說的一種非常誤導的方式:復雜性是push_back O(1)+ push_heap (O(log N))

暫無
暫無

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

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