java中PriorityQueue优先队列
优先队列 :底层是用数组实现的二叉堆,因为堆通常分为大顶堆或者小顶堆,所以优先队列可以获取每次出来的都是最大或者最小元素(对象可以实现比较器,Java优先级队列默认每次取出来的为最小元素)。
因为底层实现是数据结构堆,所以其时间复杂度peek和element操作的时间复杂度都为常数,
add、offer、remove以及poll的时间复杂度是log(n)。
底层原理:
优先队列底层实际是用数组实现的二叉堆
优先级队列表示为一个平衡的二进制堆:队列[n]的两个子队列是队列[2n+1]和队列[2(n+1)]。优先级队列根据比较器排序,或者如果比较器为空,则根据元素的自然顺序排序:

对于堆的实现是基于数组来实现的,实际开辟存储空间是数组,对数据的访问按照二叉树来进行访问遍历。父节点和子节点编号存在联系,父节点和子节点存在如下关系:
Arr[(i-1)/2] Returns the parent node
Arr[(2i)+1] Returns the left child node
Arr[(2i)+2] Returns the right child node
以小根堆为例,数据如何进行调整:
插入数据
入数据首先在有效数据的最后一个位置,即插入在某个叶子节点上,以该节点为待调整节点,和其父节点比较,如果当前节点大于父节点,符合小根堆,不用进行调整,否则需要进行调整,调整至0号根节点或者是其中某一个位置时当前节点大于父节点才终止。

源码:
public boolean offer(E e) {
if (e == null)
throw new NullPointerException();
modCount++;
int i = size;
if (i >= queue.length)
grow(i + 1);
size = i + 1;
if (i == 0)
queue[0] = e;
else
siftUp(i, e);
return true;
}
private void siftUp(int k, E x) {
if (comparator != null)
siftUpUsingComparator(k, x);
else
siftUpComparable(k, x);
}
@SuppressWarnings("unchecked")
private void siftUpComparable(int k, E x)


1291

被折叠的 条评论
为什么被折叠?



