优先队列(堆)
例如打印机这种一项特别重要的工作
优先队列允许至少下列两种操作:Insert插入以及DeleteMin,他的工作是找回,返回,删除优先队列中最小的元素。
insert等价于enqueue,deletemin等价于dequeue
贪婪算法的实现方面优先队列也很重要
二叉堆
这个工具叫二叉堆,但对优先队列的实现非常普遍,以至于堆这个词不加修饰的使用一般都是指该数据结构的这种实现
与二叉查找树一样,堆也有两个性质,及结构性和堆序性,像AVL树一样堆的操作要到堆所有性质被满足时才会停止
堆是一颗被完全填满的二叉树,有可能的例外在底层,底层的元素从左到右插入这样的树称为完全二叉树
一般用二叉堆来分析问题,用数组实现
堆序性:
使操作被快速执行的性质是堆序性,任意节点应该小于他所有后裔
insert插入:
插入一个元素到堆里,在下一个空闲位置创建一个空穴,如果x可以放在空穴中不破坏堆序性,那么插入成功
这种操作一般叫上滤(上浮)新元素在堆中上滤直到找到正确的位置
如果插入的值是最小值,那么将上浮到最顶端,这时i=1时就会跟下标-进行比较,这时一般用一个很小的值放到角标为0的位置让while循环终止,这个值成为标记
deletemin:
当删除一个最小元素时,在根节点处产生一个空穴,因此堆中最后一个元素x必须移动到堆中的某个位置,做法是把x沿着根节点包含最小儿子的路径上的每一个节点进行比较直到找到合适的位置插入,并把最小儿子的值移动空穴中
这种过程叫下滤(下沉)
在堆的实现中经常发生错误的是堆中存在偶数个元素的情况,将遇到节点只有一个儿子的情况,所以必须假设儿子不总是有两个的情况