可刪除堆講解
可刪除堆也是堆的一個分支。它和對頂堆的使用是差不多的,都是為了解決用朴素堆解決不了的問題。對頂堆解決的是朴素堆不支持單點查詢的問題,而可刪除堆就解決了朴素堆不支持任意刪除的問題。
我們知道,優先隊列只能刪除堆頂元素,然而我們並不能刪掉其他元素,有時甚至找不到要刪的元素。這時怎么辦呢?於是,可刪除堆出場了。
可刪除堆的實現原理也比較簡單。我們建一個臨時堆,如果要刪除哪個元素,就把哪個元素壓入臨時堆,然后待此元素和正常堆的堆頂元素相同時(即兩個堆頂一樣),就同時pop掉。
那么為什么這樣做是正確的呢?
我們發現,我們在調用堆的時候,只能取出並就堆頂元素進行操作,也就是說,排在下面的那些元素,在沒到達堆頂之前,是不對結果造成任何影響的。那么我們就自然而然的覺得,我先把這個要刪除的元素掛出來,什么時候它到達堆頂了,就把它跳過(實現就是pop)。就好比追查一個通緝犯,我們卡住安檢口,拿着犯人的照片,犯人一露頭就直接被帶走了,不會對機場的秩序造成任何的影響。由於我們的臨時堆跟正常堆的方向是一樣的,所以當臨時堆里有多個要刪除的元素的時候,他們也是排好序的,不會出現下一個要刪除的元素比上一個提前出現的情況。
我個人覺得,朴素堆、對頂堆和可刪除堆一起構成了堆這種數據結構的大部分內容。對於能用堆維護和解決的一些問題,大體都能用這三種方式解決。其實,這三個堆的難點並不在於理解和掌握,而在於活學活用,也就是我們所說的搭配。在我看來,對頂堆搭配可刪除堆,就是堆學習中的一大難點。但是,二者的集合其實和二者中的任何一個都殊途同歸,最終在應用的時候,都是差不多的原理。希望同學們能夠多多體會,輔以訓練,徹底掌握這些難點。