面试复习-堆相关
堆(Heap)
堆是一种特殊的树:
- 堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。
复杂度分析:
- 初始化:O(n)
- 插入、查找或删除:O(logn)
- 和有序数组的区别:查找是O(1),但涉及插入或删除则是O(n); 初始化是O(logn)
最大堆/最小堆:
- 父节点>子节点 - 最大堆;
- 父节点<子节点 - 最小堆;
存储形式:
- 完全二叉树
两种操作:
插入元素(最大堆为例):
- 将待插入的元素放在最后
- 从底向上,如果大于父节点,则交换父子节点
删除堆顶元素(最大堆为例)(又叫堆化):
- 自底向上:遍历每个节点,比较左右子节点取最大上升为父节点(缺点-中间节点出现气泡,浪费存储空间)
- 自顶向下:选择末尾元素置于堆顶,比较左右子节点取最大上升为父节点,直到无法交换。
最大堆排序:
- 建堆:对所有非叶节点进行堆化,顺序从后往前
- 排序:删除堆顶元素+自顶向下堆化 = 交换堆顶元素和数组最后元素。(由于堆大小减少,排序中被置于末尾的堆顶元素不会被再次被排序)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Golden Arc!