简介
数据结构中的堆要求满足以下性质:
- 堆总是一棵完全二叉树
- 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆是完全二叉树,很适合使用顺序存储,因为完全二叉树使用顺序存储不会有 null
值占位,另外,堆的插入和删除操作要计算父节点的下标后操作,顺序存储比链式存储更适合用下标访问。
堆最常见的应用之一就是优先队列,它每次入队或出队的时间复杂度都是 O(log n),出队入队随意交替操作也能保证按照升序或降序出队。Java 中的 PriorityQueue
和 PriorityBlockingQueue
就是堆这一个数据结构,PriorityBlockingQueue
额外地通过 ReentrantLock
加锁来保证多线程安全。
要特别注意,数据结构的堆和操作系统的堆不是同一个东西,操作系统的堆是链式存储的。