优先队列
优先队列与普通队列有什么区别?
- 普通队列: 出队顺序由入队顺序决定, 先入先出;
- 优先队列: 队列元素带有优先级, 优先级高的元素优先出列;
- 本质: 出队顺序由优先级决定, 而不是由到达时间决定;
优先队列有哪些使用场景?
- 任务调度器: 高优先级任务先执行;
- 查找第 k 个最小元素;
- 需要反复取出当前极值的场景;
优先队列有哪几种实现方式?
- 数组或链表: 入队 O(1), 但取极值需要 O(n) 扫描;
- 二叉堆: 可以用数组、链表或二叉堆实现, 常用二叉堆;
- 二叉堆的代价: 入堆与出堆 O(log n), 访问堆顶 O(1);
优先级字段如何参与堆的比较?
- 做法: 堆中存放带优先级的数据, 例如
[值, 优先级]二元组; - 改动: 下沉与上浮中的比较从元素本身换成优先级字段;
// 堆的骨架见 [堆与完全二叉树](./040-堆与完全二叉树.md)
// 唯一改动: 比较时取下标 1 的优先级字段
if (left < n && nums[left][1] > nums[max][1]) max = left;
if (right < n && nums[right][1] > nums[max][1]) max = right;