1. 程式人生 > >索引堆(Index Heap)

索引堆(Index Heap)

div 個數 wid data 想去 針對 bsp 最大 alt

首先我們先來看一個由普通數組構建的普通堆。

技術分享圖片

然後我們通過前面的方法對它進行堆化(heapify),將其構建為最大堆。

結果是這樣的:

技術分享圖片

對於我們所關心的這個數組而言,數組中的元素位置發生了改變。正是因為這些元素的位置發生了改變,我們才能將其構建為最大堆。

可是由於數組中元素位置的改變,我們將面臨著幾個局限性。

1.如果我們的元素是十分復雜的話,比如像每個位置上存的是一篇10萬字的文章。那麽交換它們之間的位置將產生大量的時間消耗。(不過這可以通過技術手段解決)

2.由於我們的數組元素的位置在構建成堆之後發生了改變,那麽我們之後就很難索引到它,很難去改變它。例如我們在構建成堆後,想去改變一個原來元素的優先級(值),將會變得非常困難。

可能我們在每一個元素上再加上一個屬性來表示原來位置可以解決,但是這樣的話,我們必須將這個數組遍歷一下才能解決。(性能低效)


針對以上問題,我們就需要引入索引堆(Index Heap)的概念。

對於索引堆來說,我們將數據和索引這兩部分分開存儲。真正表征堆的這個數組是由索引這個數組構建成的。(像下圖中那樣,每個結點的位置寫的是索引號)

技術分享圖片

而在構建堆(以最大索引堆為例)的時候,比較的是data中的值(即原來數組中對應索引所存的值)

而構建完之後,data域並沒有發生改變,位置改變的是index域。

技術分享圖片

那麽現在這個最大堆該怎麽解讀呢?

例如,堆頂元素為Index=10代表的就是索引為10的data域的值,即62。

這時我們來看,構建堆的過程就是簡單地索引之間的交換,索引就是簡單的int型。效率很高。

現在如果我們想對這個數組進行一些改變,比如我們想將索引為7的元素值改為100,那我們需要做的就是將索引7所對應data域的28改為100。時間復雜度為O(1)。

當然改完之後,我們還需要進行一些操作來維持最大堆的性質。不過調整的過程改變的依舊是index域的內容。

索引堆(Index Heap)