堆 堆就是一种利 用完全二叉树 来维护数据的一种数据结构,而当我们实际使用时使用数组来存储时,树中节点与数组中的值 相对应 ,也就是可以灵活运用 完全二叉树 的性质通过数组下标来维护堆。 想看Stl模板的堆请直达底部 为什么要选择堆? 堆的功能就是保持堆顶的元素最大/最小,本质上是一种 排序算法 ,为什么不用 Sort 呢?它构建时间一般是复杂度是 \(O(n)\) ,而维护的时间复杂度是 \(O(\log_2N)\) ,如果你用 Sort 进行排序,时间复杂度是 \(O(N\log_2N)\) ,两者对比,明显堆的时间复杂度 优于Sort 。 但是特殊情况特殊考虑,针对不同题目仍需要使用不同的做法 前置技能点:完全二叉树 何为完全二叉树? 如果一棵深度为K二叉树,1至k-1层的结点都是满的,即满足2i-1,只有最下面的一层的结点数小于2i-1,并且最下面一层的结点都集中在该层最左边的若干位置,则此二叉树称为完全二叉树。 简单来说就是假设一颗树的深度为h,除了最后一层每个节点都有 两个子节点 ,最后一层的结点必须 从左向右 连续出现。 什么是从 从左向右连续出现 ?如图,a就是 完全 二叉树,而b不是 完全 二叉树 此外,如果将完全二叉树按照 从上至下 , 从左至右 的次序对节点进行编号,则编号为i的节点有以下性质。 若 \(i\leq\lfloor n/2\rfloor\) 1