logo

堆与优先队列

May 17, 2022 · 5min

简介

数据结构中的堆要求满足以下性质:

  • 堆总是一棵完全二叉树
  • 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值

将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆是完全二叉树,很适合使用顺序存储,因为完全二叉树使用顺序存储不会有 null 值占位,另外,堆的插入和删除操作要计算父节点的下标后操作,顺序存储比链式存储更适合用下标访问。

堆最常见的应用之一就是优先队列,它每次入队或出队的时间复杂度都是 O(log n),出队入队随意交替操作也能保证按照升序或降序出队。Java 中的 PriorityQueuePriorityBlockingQueue 就是堆这一个数据结构,PriorityBlockingQueue 额外地通过 ReentrantLock 加锁来保证多线程安全。

要特别注意,数据结构的堆和操作系统的堆不是同一个东西,操作系统的堆是链式存储的。

CC BY-NC-SA 4.0 2021-PRESENT © Edsuns