簡體   English   中英

從集合構建PriorityQueue的時間復雜度是多少?

[英]What is the time complexity of constructing a PriorityQueue from a collection?

Java的PriorityQueue構造函數與Collection的復雜性是什么? 我用了構造函數:

PriorityQueue(Collection<? extends E> c)

復雜度是O(n)還是O(n * log(n))?

復雜性不能是O(log(n))因為要處理n元素,復雜性必須至少為O(n)

但是, PriorityQueue(Collection c)構造函數檢查集合是SortedSetPriorityQueue還是普通Collection並以不同方式執行初始化。 如果參數是SortedSetPriorityQueue則復雜度為O(n) (它實現為數組副本)。 當使用另一個Collection它看起來是O(n log(n))

從集合(即使是未排序的集合)初始化PriorityQueue的時間復雜度是O(n)。 在內部,它使用一個名為siftDown()的過程來siftDown() “堆積”一個數組。 (這在文獻中也稱為下推。)

這是違反直覺的。 似乎將一個元素插入堆中是O(log n),因此插入n個元素會導致O(n log n)復雜度。 如果您一次插入一個元素,則為true。 (在內部,插入單個元素使用siftUp()執行此操作。)

對單個元素進行修改肯定是O(log n),但siftDown()的“技巧”是,在處理每個元素時,必須篩選過去的元素數量不斷減少。 所以總復雜度不是n個元素乘以log(n); 它是篩選過剩元素的成本遞減的n個項的總和。

請參閱此答案 ,另請參閱本文通過數學運算。

暫無
暫無

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

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