半路演算法之二項樹與二項堆

2021-07-30 14:48:33 字數 2015 閱讀 8342

秉承前文。前面提到過針對稀疏圖時,以二項堆來作為最小優先佇列是更為適宜的。這裡記錄一下學習二項堆的過程。

二項堆的名字**於二項樹。二項堆是多個二項樹連在了一起。

二項樹的名字**於其bn

棵樹的元素個數為2n

,且其深度n處恰有2k

個節點,其性質與二項式非常吻合。此外,它還是一種遞迴定義的有序樹。

重點依照二項式的性質說一下二項樹的性質:

首先二項式定理的公式表示為: (a

+b)n

=∑r=

0ncr

nan−

rbr

嗯,在二項樹中我們將上式的a和b統統定位1。

那麼二項樹的第乙個性質——共有2k

個節點,便可以理解為上面二項式的值了;

我們假設樹的高度為r(即畫出來的樹有r行),在其深度n處有ck

n 個節點,其中i=0, 1, 2, …, k,理解為其二項式係數,嗯,剛好等於ck

n ;

我們假設根節點(這一行只有它自己,它沒有兄弟姐妹節點)的度數為r,它的度數是這棵二項樹上最大的,而且其子女節點分別是它們(子女節點)相對應的子樹的根(真有點拗口)

這些性質的證明基本就是二項式定理的證明(數學歸納法,亦即遞迴)了。這裡不再展開。

依據性質1和3,我們知道如果一棵二項樹的總結點數為n,那麼其節點的最大度數為lgn。

make-heap()     --建立並返回乙個不包含任何元素的新堆

insert(h, x) --將節點x(有值)插入到堆h中

minimum(h) --返回乙個指向堆h中包含最小關鍵字的節點的指標

extract-min(h) --將堆h中包含最小關鍵字的節點刪除並返回指向該節點的指標

union(h1, h2) --建立並返回乙個包含堆h1和h2中所有節點的新堆,同時刪除堆h1和h2

二項堆中的每個二項樹遵循最小堆的性質,其節點的關鍵字(即節點的值)大於或等於其父節點的關鍵字。由於二項堆是有二項樹拼起來的,其性質完全就是二項樹的那些,不再進一步討論了。

這裡重點說說二項堆的函式實現:

新建乙個二項堆

嗯,就是分配並返回了乙個物件h,且head[h]=null,執行時間為o(1)

尋找最小關鍵字

偽**

binomial-heap-minimum(h)

y <- null

x <- head[h]

min<- ∞

while x≠null

doif key[x]then

min<- key[x]

y <- x

x <- sibling[x]

return y

我們需要注意的是關鍵字只在二項樹內排序

**實現為:

while (x !=

null)

}return y;

合併兩個二項堆

偽**

binomial-link(y, z)

p[y]

<- z

sibling[y]

<- child[z]

child[z]

<- y

degree[z]

<- degree[z]+1

**實現為:

y

.parent = z

.child;z

.child = y;z

.degree++;

星期六, 15. 四月 2017 10:37下午

二項樹和二項堆(Binomial Heaps)

二項樹bk是一種遞迴定義的有序樹。二項樹b0只包含乙個結點。二項樹bk由兩個子樹bk 1連線而成 其中一棵樹的根是另一棵樹的根的最左孩子。二項樹bk 具有以下性質 1 共有2的 k次方個結點 2 樹的高度為k 3 在深度 i處恰有 上 k,下i 因此叫二項樹 個結點,其中 i 0,k 4 根的度數為...

優先佇列之 二項堆

從以上定義,不難得到下面的結論 二項堆由一組二項樹所構成,這裡的二項樹需要滿足下列條件 1 h中的每個二項樹遵循最小堆的性質。2 對於任意非負整數k,在h中至多有一棵二項樹的根具有度數k。對於性質2,任意高度最多有一棵二項樹,這樣就可以用二項樹的集合唯一地表示任意大小的二項堆,比如13個結點的二項堆...

優先佇列 堆 二項佇列

目錄四 二項佇列的實現 位址 我們知道,左式堆每次操作的時間界是 o logn 二項佇列支援合併 插入 刪除最小值,每次插入的平均時間為常數時間,而最壞時間是 o logn 二項佇列 結構 高度為0的二項樹是一棵單節點樹,例如b0。高度為k的二項樹 b k 通過將一棵二項樹 b 附接到另一棵二項樹 ...