簡體   English   中英

PriorityQueue addAll() 的復雜性

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

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