浅谈可删除堆

可删除堆讲解

可删除堆也是堆的一个分支。它和对顶堆的使用是差不多的,都是为了解决用朴素堆解决不了的问题。对顶堆解决的是朴素堆不支持单点查询的问题,而可删除堆就解决了朴素堆不支持任意删除的问题。

我们知道,优先队列只能删除堆顶元素,然而我们并不能删掉其他元素,有时甚至找不到要删的元素。这时怎么办呢?于是,可删除堆出场了。

可删除堆的实现原理也比较简单。我们建一个临时堆,如果要删除哪个元素,就把哪个元素压入临时堆,然后待此元素和正常堆的堆顶元素相同时(即两个堆顶一样),就同时pop掉。

那么为什么这样做是正确的呢?

我们发现,我们在调用堆的时候,只能取出并就堆顶元素进行操作,也就是说,排在下面的那些元素,在没到达堆顶之前,是不对结果造成任何影响的。那么我们就自然而然的觉得,我先把这个要删除的元素挂出来,什么时候它到达堆顶了,就把它跳过(实现就是pop)。就好比追查一个通缉犯,我们卡住安检口,拿着犯人的照片,犯人一露头就直接被带走了,不会对机场的秩序造成任何的影响。由于我们的临时堆跟正常堆的方向是一样的,所以当临时堆里有多个要删除的元素的时候,他们也是排好序的,不会出现下一个要删除的元素比上一个提前出现的情况。

我个人觉得,朴素堆、对顶堆和可删除堆一起构成了堆这种数据结构的大部分内容。对于能用堆维护和解决的一些问题,大体都能用这三种方式解决。其实,这三个堆的难点并不在于理解和掌握,而在于活学活用,也就是我们所说的搭配。在我看来,对顶堆搭配可删除堆,就是堆学习中的一大难点。但是,二者的集合其实和二者中的任何一个都殊途同归,最终在应用的时候,都是差不多的原理。希望同学们能够多多体会,辅以训练,彻底掌握这些难点。

原文地址:https://www.cnblogs.com/fusiwei/p/11432510.html