對稱最小最大堆


對稱最小最大堆 (SMMH) 定義為一棵完全二叉樹,其中除根節點外,每個節點都恰好包含一個元素。SMMH 的根節點可以為空,SMMH 中節點的總數為 m + 1,其中 m 是元素的數量。

設 y 為 SMMH 中的任意節點。設 elements(y) 為以 y 為根的子樹中的元素,但不包括 y 中的元素(如果有)。假設 elements(y) j= ∅。y 滿足以下屬性

  • y 的左孩子在 elements(y) 中具有最小元素。
  • y 的右孩子(如果有)在 elements(y) 中具有最大元素。

圖 1 顯示了一個包含 12 個元素的 SMMH 示例。

當 y 表示值為 81 的節點時,elements(y) = {7, 15, 31, 41};y 的左孩子在 elements(y) 中具有最小元素 6;y 的右孩子在 elements(y) 中具有最大元素 41。我們可以驗證此 SMMH 的每個節點 y 都滿足所述屬性。

由於 SMMH 表示為一棵完全二叉樹,因此它儲存為一個隱式資料結構,實現了將完全二叉樹對映到陣列的標準方法。當 m = 1 時,最小和最大元素相同,幷包含在 SMMH 根節點的左孩子中。

當 m > 1 時,最小元素位於根節點的左孩子中,最大元素位於根節點的右孩子中。因此,getMin 和 getMax 操作消耗 O(1) 時間。

很容易看出,具有空根節點和每個其他節點中包含一個元素的 m + 1 個節點的完全二叉樹是 SMMH 當且僅當以下條件為真 -

A1 - 對於每個具有右兄弟的節點 y,y 中的元素小於或等於其右兄弟中的元素。

A2 - 對於每個具有祖父母節點的節點 y,祖父母節點的左孩子中的元素小於或等於 y 中的元素。

A3 - 對於每個具有祖父母節點的節點 y,祖父母節點的右孩子中的元素大於或等於 y 中的元素。

請注意,如果屬性 A1 在節點 y 處滿足,則在 y 處最多隻有一個 A2 和 A3 可能被違反。透過實現屬性 A1 到 A3,我們得到了用於插入和刪除元素的簡單演算法。這些演算法是對最小堆和最大堆的相應演算法的簡單改編。它們的複雜度為 O(log m)。

這裡,我們指定插入操作。假設我們希望將 3 插入到圖 1 的 SMMH 中。由於 SMMH 是一棵完全二叉樹,因此我們必須在圖 2 所示的位置向 SMMH 新增一個新節點;新節點標記為 B。

在我們的示例中,B 將表示一個空節點。現在 3 插入到節點 B 中。

更新於: 2020-07-13

1K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.