2012-11-28 27 views
0

在Java中,是否有一種簡單的方法可以在O(n)時間內創建一個無序數集合中的PriorityQueue,但是順序相反? PriorityQueue的構造函數都沒有采用集合和比較器來指定排序。我知道你可以創建一個指定比較器的PriorityQueue,然後再調用addAll來添加所有的無序數字。不過,我認爲addAll會單獨添加每個值,而不是堆積無序集合,所以我不認爲這會是O(n)時間。在java中構造一個優先級隊列,在O(n)時間中的反向順序時間

+1

不幸的是,這門課留下了許多優化方法。就像許多其他標準庫類一樣。 –

+0

我能想到的最好的選擇是首先將你的集合轉換成一個'SortedSet',然後把'SortedSet'轉換成'PriorityQueue'。 – reprogrammer

+0

但是,如果您可以以比O(n log n)更好的方式對元素進行預先排序,那麼只會有任何內容。 Collections.sort(),例如,基本上是O(n log n)。 –

回答

0

addAll具有O(n * log(n))的複雜性,所以這並不太可怕。

我不知道你從哪裏得到了創建一個無序集合中的PriorityQueue的想法,其中有O(n),我認爲它與addAll相同。

+0

您可以從O(n)中的無序列表構建一個堆。請參見http://cs.utsa.edu/~dj/cs3343/lecture6.html – reprogrammer

+0

這是一種就地算法,如果您必須將元素從一個集合複製到另一個集合,則不適用。 – cohadar

+0

將n的列表複製到數組中可以在O(n)中完成。而且,可以從O(n)中的數組構建一個堆。 – reprogrammer

0

解決方法是首先否定數字,然後在O(n)中創建一個堆。之後,你只需要記住在你從堆中檢索數字之後否定這些數字。

相關問題