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
每一个人的实现都不同。