今天介绍一些java内的容器-堆和优先队列,有些容器会在后续案例中更详细介绍
堆
- 是完全二叉树,给定任意一个节点,可以根据其编号直接快速计算出其父节点和孩子节点编号
- 根据顺序分为两种堆:一种是最大堆,另一种是最小堆
- 可以实现优先级队列,解决求前K个最大的元素,求中值元素等问题
- 堆还可以实现排序,称之为堆排序
- 概念上是树,存储为数组,父子有特殊顺序,根是最大值/最小值,构建/添加/删除效率都很高
优先队列
- PriorityQueue
- 内部是用堆实现的,内部元素不是完全有序的,逐个出队会得到有序的输出
- 优先级可以有相同的,内部元素不是完全有序的,如果遍历输出,除了第一个,其他没有特定顺序
- 查看头部元素的效率很高,为O(1),入队、出队效率比较高,为O(log2(N)),构建堆heapify的效率为O(N)
特别说明
- 对于某些问题(如求前k个最大元素和求中值),相比使用排序,使用堆不仅实现效率更高,而且可以应对数据量不确定且源源不断到来的情况,可以给出实时结果