什么是优先队列
普通队列:先进先出;后进后出
优先队列:出队顺序和入队顺序无关;和优先级有关
动态处理:首先处理优先级高的,同时会进入其他的请求
堆的基础表示
一个堆也是一棵树
使用二叉树来表示一个堆,通常也可以表示为二叉堆
满二叉树:除了叶子结点,其他所有节点的孩子节点都不为空
二叉堆是一颗完全二叉树
完全二叉树:把元素排成树的形状。(将元素一层一层的放,右下角有可能是空的)
二叉堆:堆中某个节点的值总是不大于其父亲节点的值(根节点最大,最大堆,相应也可以对应最小堆)
用数组存储二叉堆
索引从1标:
parent(i)=i/2(一个奇数除以2,后面的小数是要抹去的)
left child (i)= 2i
right child(i)=2i+1
索引从0标:
parent(i)=(i-1)/2
left child (i)= 2i+1
right child(i)=2i+2
向堆中添加元素(主要步骤):
定一个add函数
//向堆中添加元素
public void add(E e){
data.addLast(e);
siftUp(data.getSize() - 1);
}
定义一个swap交换函数
public void swap(int i,int j){
if(i<0 || i>=size || j<0||j>=size)
throw new IllegalArgumentException("Index is illegal.");
E t = data[i];
data[i] = data[j];
data[j] = t;
}
数据上浮siftUp
//上浮
private void siftUp(int k){
while(k <0 && data.get(parent(k)).compareTo(data.get(k)) < 0){
data.swap(k,parent(k));
k = parent(k);
}
}