✅什么是小顶堆,可以用在哪些场景?

✅什么是小顶堆,可以用在哪些场景?

典型回答

小顶堆(Min Heap)是一种特殊的二叉堆数据结构,它满足以下性质:对于堆中的任意节点i,其父节点的值小于等于节点i的值。换句话说,堆中的最小值总是位于堆的根节点上。

小顶堆是一种二叉堆数据结构,它可以使用数组来实现。

小顶堆常用于解决与最小值相关的问题,所以在实际应用中非常的广泛,比如:

1、查找最小值,在一群数字中,查找最小值,可以利用小顶堆,小顶堆的根节点就是最小值。

如:从10亿个数字中,取出最小的10个数

2、排序,小顶堆可以用于堆排序,可以把一个数组构建成小顶堆,那么就是实现了从小到大的排序。

3、定时器,在定时器的实现中,可以使用小顶堆来管理即将触发的定时事件。每个定时事件可以表示为一个包含触发时间戳的数据结构。从堆顶不断取出需要执行的定时任务即可。

4、Dijkstra算法:在最短路径问题中,Dijkstra算法使用优先级队列来选择当前最短路径的下一个节点,而小顶堆可以用作实现该优先级队列。

5、优先级队列:小顶堆可以用作优先级队列的底层数据结构,在O(log n)时间内进行插入和删除操作,O(1)时间内获取最小优先级元素。如Java 中的 PriorityQueue

6、查找最大值,有的时候,为了节省空间,也么用小顶堆实现海量数据的最大值查找。

✅海量数据查找最大的 k 个值,用什么数据结构?

扩展知识

插入过程

小顶堆的插入主要有两个步骤:

  • 1、将新元素添加到小顶堆的最后一个位置(数组的末尾)。
  • 2、执行"上浮"(Heapify Up)操作:将新插入的元素与其父节点进行比较。如果新元素的值比父节点的值小,则交换它们,并继续向上比较和交换,直到满足小顶堆的性质(即新元素的值不小于其父节点的值),或者到达堆的根节点。

加入有一个以下小顶堆,当我们插入一个元素3的时候。

将3添加到堆的最后位置:

执行上浮操作,将3上浮到正确位置:

删除过程

小顶堆的删除主要有两个步骤:

  • 1:将堆顶元素(最小值)删除,并用堆的最后一个元素(数组的最后一个元素)来替换它。
  • 2:执行"下沉"(Heapify Down)操作:将新的根节点与其较小的子节点进行比较。如果新根节点的值比其子节点的值大,则交换它们,并继续向下比较和交换,直到满足小顶堆的性质(即新根节点的值不大于其子节点的值),或者到达叶子节点。

以下是删除3这个元素的过程:

经过几轮下沉后: