[英]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)
構造函數檢查集合是SortedSet
, PriorityQueue
還是普通Collection
並以不同方式執行初始化。 如果參數是SortedSet
或PriorityQueue
則復雜度為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.