[英]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_heap
和pop_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.