什么是二叉堆
什么是堆
堆就像一个有点特殊的数组,其中每个元素都有一个优先级或者权重。我们可以把堆看成一个二叉树,每个节点的值都小于或者大于它的子节点。 通常用于实现优先队列或堆排序算法。
图1
图2
图1为原始的数组,图2二叉堆的表示方式,可以当作一个二叉树,可以发现数组的索引和二叉堆的左右子结点之间的关系:树的根结点为A[1],给定一个结点下标i,很容易得出其父结点[i/2]、左孩子结点[i/2]和右孩子结点[i/2]+1。
最小堆
对于任意一个节点的值,它的子节点的值都不小于它的值。也就是说,最小堆的根节点是整个堆中最小的元素。在最小堆中,每个节点的值都小于等于其子节点的值。
最大堆
对于任意一个节点的值,它的子节点的值都不大于它的值。也就是说,最大堆的根节点是整个堆中最大的元素。在最大堆中,每个节点的值都大于等于其子节点的值。
二叉堆操作
最小二叉堆和最大二叉堆的插入,都是先将新元素插入到堆的最后位置,然后上浮找到合适的位置。
最小二叉堆和最大二叉堆的删除,都是先将根元素和堆最后一个元素交换,然后下沉找到合适的位置。
二叉堆应用场景
优先队列
二叉堆可以用来实现优先队列,它可以存储具有优先级的元素,每次从中取出优先级最高的元素。
堆排序
堆排序是一种基于二叉堆的排序算法,利用堆的性质将数组或链表进行排序。堆排序算法的时间复杂度为 O(nlogn)。
图算法
二叉堆可以用来实现最小生成树算法(比如 Prim 算法和 Kruskal 算法)和最短路径算法(比如 Dijkstra 算法和 Bellman-Ford 算法)。
计算器
二叉堆可以用来实现计算器中的运算符优先级,每个运算符都有一个权重和关联的操作数,可以用二叉堆来存储和排序。
缓存系统
二叉堆可以用来实现缓存系统的淘汰策略,根据缓存的大小和缓存数据的访问次数,可以使用二叉堆来决定哪些数据需要被淘汰。