前言
做了太久的前端崽好久没刷题,居然忘了最大最小堆,这里梳理一下。
最大堆(Max Heap)
定义
每个父节点的值大于或等于其子节点的值。
性质
根节点是整个堆中的最大值。
插入或删除元素时,通过“上浮”(swim)或“下沉”(sink)操作维护堆性质。
操作
- 插入:将新元素添加到末尾,逐步与其父节点比较并交换,直到满足父节点 ≥ 子节点。
- 删除最大值:移除根节点(最大值),将最后一个元素移到根位置,逐步与其较大的子节点交换,直到恢复堆性质。
应用:优先队列(快速获取最大值)、堆排序算法。
最小堆(Min Heap)
定义
每个父节点的值小于或等于其子节点的值。
性质
根节点是整个堆中的最小值。
插入或删除元素时,同样通过“上浮”或“下沉”操作维护堆性质。
操作
- 插入:将新元素添加到末尾,逐步与其父节点比较并交换,直到满足父节点 ≤ 子节点。
- 删除最小值:移除根节点(最小值),将最后一个元素移到根位置,逐步与其较小的子节点交换,直到恢复堆性质。
应用:优先队列(快速获取最小值)、Dijkstra算法、合并K个有序链表。
共同特点
完全二叉树结构:可以用数组紧凑表示,无需指针。
父节点索引为 i,则左子节点为 2i+1,右子节点为 2i+2。
子节点索引为 i,则父节点为 ⌊(i-1)/2⌋。
时间复杂度:
插入(O(log n))、删除极值(O(log n))、获取极值(O(1))。
空间复杂度:O(n)。
典型应用场景
最大堆:快速获取数据流中的前K大元素。
最小堆:快速获取数据流中的前K小元素。
堆排序:利用最大堆升序排序,或最小堆降序排序。
睿哥知道我忘了这个能打死我= =。。。