PriorityQueue 優先隊列的實現

PriorityQueue 的 implementation


  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() {} }
MaxPriorityQueue

  具體實現的話有不少中,可使用一個數組來存放全部的對象。每次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

  每一個人的實現都不同。

相關文章
相關標籤/搜索