秉承前文。前面提到過針對稀疏圖時,以二項堆來作為最小優先佇列是更為適宜的。這裡記錄一下學習二項堆的過程。
二項堆的名字**於二項樹。二項堆是多個二項樹連在了一起。
二項樹的名字**於其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 附接到另一棵二項樹 ...