[英]Complexity of PriorityQueue addAll()
PriorityQueue 的 addAll 方法的復雜度是多少。 它是一次添加一個元素導致 O(n log n) 還是使用構建堆過程在 O(n) 時間內從無序元素中創建一個堆?
Javadoc似乎暗示addAll
是從AbstractQueue繼承的,它被實現為 adds 序列。
這讓我相信復雜度是O(mlogn)
,其中 m 是要插入的集合的大小。
從優先隊列
...此實現為入隊和出隊方法提供 O(log(n)) 時間...
所以你只能假設n log(n)
。
然而——顯然——這只是你可以假設的。 根據您計划使用的具體實現,您可能會發現一些可以為您改善問題的技巧。
查看 OpenJDK,看起來 PriorityQueue 從 AbstractQueue 繼承了 addAll 實現,它遍歷集合並在每個元素上調用 add。
PriorityQueue 中的addAll
方法為每個元素實現add
方法。 因此它具有nlogn
的時間復雜度。
但這並不意味着沒有任何東西相當於 python 的 heapq.heapify() 或 C++ make_heap 方法以 O(n) 復雜度運行。 PriorityQueue 具有執行復雜度為 O(n) 的 heapify 操作的構造函數。
List<Integer> x = Arrays.asList(1, 54, 22, 87, 242, 32, 11, 90);
PriorityQueue<Integer> pq1 = new PriorityQueue<Integer>(x); // O(n) complexity
PriorityQueue<Integer> pq2 = new PriorityQueue<Integer>();
pq2.addAll(x); // nlogn complexity
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.