优先级队列——基于TypeScript的大/小顶堆
引言
大家好啊,我是前端拿破轮😁。
最近学习算法题遇到了优先级队列的问题,遍想着写一篇文章来总结一下,好加深自己的印象。同时也希望能够帮助到有需要的各位同学。
老规矩,带着问题来读文章。
- 什么是优先级队列?
- 什么是大/小顶堆?
- 优先级队列和大/小顶堆是什么关系?
- 如何用
TypeScript来实现一个优先级队列?- 优先级队列有什么典型应用?
- 使用优先级队列要注意什么问题?
什么是优先级队列?
队列相信大家都清楚,就是一种先进先出(FIFO)的数据结构。而优先级队列是一种抽象数据结构,它类似于普通的队列,但是元素出队的顺序并不是先进先出,而是按优先级高低出队。
在优先级队列中,每次总是队列中优先级最高的元素先出队。至于什么是优先级高就取决于我们自己定义了。可能是数值越大,优先级越高,这就是大顶堆;也可能是数值越小,优先级越高,这就是小顶堆;还可能是其他判断条件。所以才说优先级队列是一种抽象的数据结构,具体规则需要我们去实现。
什么是大/小顶堆?
堆是一种完全二叉树结构,常用数组来实现。(因为二叉树既可以用数组存储,也可以用二叉链表来存储)。
堆主要有两种表现形式:
| 类型 | 定义 | 用途 |
|---|---|---|
| 小顶堆 | 父节点<=子节点(堆顶是最小值) | 实现最小优先级队列 |
| 大顶堆 | 父节点>=子节点(堆定是最大值) | 实现最大优先级队列 |
堆的常用操作push,pop,top的时间复杂度是O(logn)。
优先级队列和堆是什么关系?
正如前两点所说,优先级队列是一种抽象的数据结构,而堆则是将优先级这一指标具像化,通常是数值大小,从而实现为大顶堆或小顶堆。
可以说:堆是实现优先级队列最常见,较高效的方式。
如何用TypeScript来实现一个优先级队列
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 马嘉路!
评论


