优先队列定义
优先队列是一个以集合为基础的抽象数据类型。
优先队列中每个元素都有一个优先级。
不同的元素也有可能时同一个优先级。
##
优先队列的实现
- 有序链表
用有序链表实现求最小元素(min(H))和删除(deleteMin(H))的时间复杂度为O(1)
插入(insert(x,H)),最坏的情况需要O(n),其中n为插入元素时优先队列中已有的元素个数
- 二叉搜索树
用二叉搜索树表示右N个元素的优先队列,最坏的情况下插入和删除的时间复杂度为O(n)
平均时间为O(log2^n)
- 无序链表
O(1)实现插入运算
删除需要O(n)时间
优先级树
- 极小化优先级树
从根到叶的路径上,较高层的结点有较小的优先级。
插入和删除所需的时间一般和树的高有关。
- 极大化优先级树
任意一结点存储的元素优先级不小于其孩子的优先级。
堆
当一棵优先级树时近似满二叉树时,称其为堆或偏序树
- 删除并返回最小优先级的算法
将最后一个叶子结点覆盖根节点
覆盖之后,就和优先级最低的孩子进行比较,直到没有其他元素比他小或者到了最后。
- 插入算法
将需要插入的元素放在树的最后
然后依次和双亲比较,如果比双亲小,他们就互换位置。
直到没有其他元素比他大,或者到了根节点。
可并优先队列
可并优先队列也是一个以集合为基础的抽象数据类型
- 左偏树
左偏树不仅能在O(log2^n)支持同一个优先队列的基本运算,还可以支持两个不同优先队列的合并运算。
左偏树分为左偏高树和左偏重树