二叉堆和优先队列
二叉堆(binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。优先队列是计算机科学中的一类抽象数据类型。
前言
二叉堆(binary heap)是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。优先队列是计算机科学中的一类抽象数据类型。
正文
Priority Queue 优先队列
普通队列
是先进先出,后进后出;优先队列
的出队入队
只与优先级
相关优先队列
中的每个元素都有各自的优先级
,优先级最高
的元素最先
得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列往往用堆
来实现。- 常见的场景:操作系统中
任务调度
(动态选择优先级最高的任务执行) 基于不同 底层
实现时间复杂度
比较底层数据结构 插入时间复杂度 取出时间复杂度 无序数组 O(1) O(n) 有序数组 O(n) O(1) 堆 O(log n) O(log n)
Binary Heap 二叉堆
- 二叉堆是一棵
完全二叉树
,不会退化为链表
。(二叉树
在特殊情况从小到大
排序是会退化成链表
)
完全二叉树
是效率很高的数据结构,完全二叉树是由满二叉树
而引出来的。若设二叉树的深度为 h,除第 h 层外,其它各层 (1 ~ h-1) 的节点数都达到最大个数,第 h 层所有的节点都连续集中在最左边
,这就是完全二叉树。
- 二叉堆中的某个节点的值总是
不大于
其父节点的值。若根节点是最大值
则成为最大堆
,反之是最小堆
。 - 二叉堆
添加
元素放在最后的叶子节点
,再根据与其父节
点的大小进行调整位置,直到满足
所有的父子节点关系。 - 二叉堆
删除
根节点元素,将根节点
与最后的叶子节点
进行互换,删除最后的叶子节点
,再将根节点
与其子节点
进行比较互换位置,直到满足
所有的父子节点关系。 - 可以使用数组存储二叉堆。根节点为 0,
按层排序
下去。则父节点与其子节点的关系如下:
parent(i) = (i - 1) / 2
left child(i) = 2 * i + 1
right child(i) = 2 * i + 2