PriorityQueue便是優先隊列。通俗的說就是體育課的時候老師要求從高到低排序,老師能直接一眼看出誰是最高的在班級裏。當這個最高的離開的時候,老師也立刻能知道下面哪一個最高的人。java
public class MaxPriorityQueue<T extends Comparable<T>> { public void insert(T t) { } public T max(){} public T delMax() {} public boolean isEmpty() {} public int size() {} }
具體實現的話有不少中,可使用一個數組來存放全部的對象。每次delMax(刪除最大的那個元素的時候)只須要遍歷一遍數組 找出最大的返回就能夠了。這樣子的話Time proportational to O(n), 時間是和n成正比的.git
還有另一種實現方法,是使用heap(堆結構),堆結構以下,能夠清楚的知道堆的含義就是,頂層的元素的值比底層的大。一級壓一級。github
堆通常用數組來實現,從index=1開始(方便計算),index * 2 和 index * 2 + 1 就是左右子元素, index / 2 就是父元素數組
好了,如今假設你有這樣子的一個堆ide
如今我要插入一個111,我先把111 插入到底部spa
這個時候破壞了heap的有序,堆有序須要底部的元素小於頂部,因此咱們把111 和 111的頂部(之後我會叫parentNode) 進行比較3d
發現111大於33,全部我須要改變exchange 111 和 33的位置code
接着111 和 parentNode比,發現仍是大於ParentNode,因此繼續改變位置。對象
繼續比較blog
到了top了,沒有元素比111大了。堆又有序了。每次堆由於插入或者刪除形成的無須均可以用這樣子的操做來挽回。
接着說如何刪除一個最大的元素。好比剛纔的那個堆,咱們要拿到最大的那個元素。
首先咱們先把111和 最底部的元素交換位置。而且取出111
如今堆的有序被破壞了。咱們要把top部的元素和2個子元素比較大小,若是比子元素小的話,外面就須要交換他們的位置
在這裏,咱們須要把33 和 100 和 50 比較。把值小的元素放在堆底部。把33 和 Math.max(100, 50)交換位置獲得以下
33 比 90 小。 交換他們的位置
這個時候堆又有序了。
Are u Okay
堆的有序性必須獲得保證。
每次的插入insert() 和 delMax()的操做所須要的時間與 Log(N)成正比。O(logN)
具體的實現能夠參考一下https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/elementary/MaxPriorityQueue.java
每一個人的實現都不同。