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

  每一个人的实现都不同。

相关文章
相关标签/搜索