目录
1.优先队列(priority queue):
优先队列是一种按照优先级出队(deQueue)的队列,支持插入(Insert)和删除并返回最小值(DeleteMin)或者删除并返回最大值(DeleteMax)操作。
基本实现:
实现 | 插入 | 删除 |
无序链表 | O(1) | O(N) |
有序链表 | O(N) | O(1) |
二叉查找树 | O(logN)(平均) | O(logN)(平均) |
平衡二叉查找树 | O(logN)(最坏) | O(logN)(最坏) |
2.二叉堆(binary heap):
2.1两个性质:
- 结构性质
堆是一棵完全二叉树(complete binary tree),一棵高为h的完全二叉树有 到 个节点,所以完全二叉树的高是,即 O() .
用数组表示二叉堆,对于数组中任一位置i上的元素,其左儿子在位置2i上,右儿子在左儿子后的单元(2i+1),它的父亲则在位置上。
- 堆序性质
最小元应该在根上,任意节点应该小于它的所有后裔。对于每一节点X(根节点除外),X的父亲中的关键字小于(或等于)X中的关键字。
2.2基本的堆操作:
- 插入(Insert):
将一个元素X插入到堆中下一个空闲位置,如果不满足堆序,需要将该空闲位置沿着根的位置上滤(percolate up),直到满足堆序。
最坏情形插入时间为O(log N)。
- 删除最小元(DeleteMIn):
将根处的最小元删除,将堆中最后一个元素X置入沿着从根开始包含最小儿子的一条路径上的一个正确的位置,一般需要将根处的空位置下滤(percolate down)到堆的底层。
最坏情形删除时间为O(log N);平均情形运行时间为O(log N)。
3.优先队列的应用
- 图论算法
- 选择问题
找出N个元素中的第k个最大的元素。
将N个元素读入一个数组,对该数组应用BuildHeap算法构建一个从大到小的堆,然后执行k次DeleteMin操作。运行时间
前k个元素通过调用一次BuildHeap 以总时间O(k)被置入堆中,对于其他N-k 个数依次检测是否要通过删除堆中的最小元并插入堆中,最后返回堆中的最小元素。运行时间。