第十一章 Heap 結構
description
Transcript of 第十一章 Heap 結構
1
第十一章 Heap 結構
2
目次
11.1 Min-Max heap
11.2 Deap
11.3 Binomial heap
11.4 Fibonacci heap
11.5 動動腦時間11.6 練習題解答
3
11.1 Min-max heap
Min-max heap – 它包含了 min-heap 與 max-heap 兩種堆積樹的特徵,
如下圖即為一棵 min-max heap : 10
40 45
19 13 18 15
32 28 34 31 24 35 42 33
Level 1
Level 2
Level 3
Level 4
min
max
min
max
4
11.1 Min-max heap (con.t)
Min-max heap 的特性– min-max heap 是以一層 min-heap 、 max-heap 交互構成的
Level1 中各節點的鍵值一律小於子節點 (10 小於 40 、 45) , Level2 中各節點的鍵值一律大於子節點 (40 大於 19 、 13 ;
45 大於 18 、 15)
– 樹中為 min-heap 的部分,仍需符合 min-heap 的特性 如圖 Level 1 的節點鍵值,會小於 Level 為 3 的子樹 (10 小
於 19 、 13 、 18 、 15)
– 樹中為 max-heap 的部份,仍需符合 max-heap 的特性 如圖的 Level 2 的節點鍵值,會大於 Level 為 4 之子樹 (40
大於 32 、 28 、 34 、 31 ; 45 大於 24 、 35 、 42 、 33)
5
11.1 Min-max heap (con.t)
11.1.1 Min-max heap 的加入 min-max heap 的加入
– 與 max-heap 的原理差不多,但是加入後,要調整至符合上述 min-max heap 的定義
– 假設已存在一棵 min-max heap 如下:10
40 45
19 13 18 15
32 28 34 31
min
max
min
max
6
11.1 Min-max heap (con.t)
– 若加入 5 ,步驟如下
40 45
19 13 18 15
32 28 34 31 5
10 min
max
min
max
7
11.1 Min-max heap (con.t)
– 加入後 18>5 ,不符合第一項定義,將 5 與 18 交換
40 45
19 13 5 15
32 28 34 31 18
10 min
max
min
max
8
11.1 Min-max heap (con.t)
– 交換後,由於 10>5 ,不符合第二項定義,將 5 與 10 對調 min
max
min
max
40 45
19 13 10 15
32 28 34 31 18
5
9
11.1 Min-max heap (con.t)
– 符合 min-max heap 的定義,加入動作結束。若再加入 50 ,其加入步驟如下 :
min
max
min
max
40 45
19 13 10 15
32 28 34 31 18
5
50
10
11.1 Min-max heap (con.t)
– 加入後 45<50 ,不符合第三項定義,將 45 與 50 交換
– 符合 min-max heap 的定義,加入動作結束
min
max
min
max
40 50
19 13 10 15
32 28 34 31 18
5
45
11
11.1 Min-max heap (con.t)
11.1.2 Min-max heap 的刪除 min-max heap 的刪除
– 若刪除最後一個節點,則直接刪除即可 – 否則,先將刪除節點鍵值與樹中的最後一個節點對調,
再作調整動作,意即以最後一個節點取代被刪除節點 假設已存在一棵 min-max heap 如下:
40 50
19 13 10 15
32 28 34 31 18
5
45
min
max
min
max
12
11.1 Min-max heap (con.t)
– 若刪除 45 ,則直接刪除
40 50
19 13 10 15
32 28 34 31 18
5 min
max
min
max
13
11.1 Min-max heap (con.t)
– 若刪除 40 ,則需以最後一個節點的鍵值 18 取代 40min
max
min
max
18 50
19 13 10 15
32 28 34 31
5
14
11.1 Min-max heap (con.t)
– 交換後 18<19 ,不符合第一項定義,將 18 與 19 交換min
max
min
max
19 50
18 13 10 15
32 28 34 31
5
15
11.1 Min-max heap (con.t)
– 交換後,由於 19 小於 32 、 28 、 34 、 31 ,不符合第三項定義,將 19 與最大的鍵值 34 交換
– 符合 min-max heap 的定義,刪除動作結束
min
max
min
max
34 50
18 13 10 15
32 28 19 31
5
16
11.2 Deap
Deap– 同樣也具備 max-heap 與 min-heap 的特徵,其定義如下:
Deap 的樹根不儲存任何資料,為一空節點。 樹根的左子樹為一棵 min-heap ;右子樹則為 max-heap 。 min-heap 與 max-heap 存在一對應,假設左子樹中有一節
點為 i ,則在右子樹中相同的位置存在一節點 j 與 i 對應,且 i 必須小於等於 j 。如圖的 5 與 35 對應, 5 小於 35 ;12 與 30 對應, 12 小於 30 5 35
12 21 30 32
18 16 25 27 22 29
17
11.2 Deap (con.t)
11.2.1 Deap 的加入 Deap 的加入
– Deap 的加入動作與其它堆積樹一樣,將新的鍵值加入於整棵樹的最後,再調整至符合堆積樹的定義
假設已存在一 Deap 如下:
5 30
15 20
18
11.2 Deap (con.t)
– 若加入 25 ,加入後右子樹仍為一棵 max-heap ,如下所示,且左子樹對應節點 15 小於等於它所對應的右子樹節點 25 ,符合 deap 的定義
5 30
15 20 25
19
11.2 Deap (con.t)
– 加入 17 ,加入後的圖形如下所示
– 此時右子樹仍為 max-heap ,但 17 小於其左子樹的對應節點 20 ,故將 17 與 20 交換
5 30
15 20 25 17
5 30
15 17 25 20
20
11.2 Deap (con.t)
– 加入 40 ,如下所示
5 30
15 17 25 20
40
21
11.2 Deap (con.t)
– 加入後左子樹雖為 min-heap ,但 40 大於其對應節點 25( 與節點 40 的父節點對應之右子樹節點 ) ,不符合 deap的定義,故將 40 與 25 交換,如下所示:
5 30
15 17 40 20
25
22
11.2 Deap (con.t)
– 交換後樹中的右子樹不是一棵 max-heap ,重新將其調整為 max-heap 即可
5 40
15 17 30 20
25
23
11.2 Deap (con.t)
11.2.2 Deap 的刪除 Deap 的刪除
– Deap 的刪除動作與其它堆積樹一樣,當遇到刪除節點非最後一個節點時,要以最後一個節點的鍵值取代刪除節點,並調整至符合 deap 的定義
假設存在一 deap 如下: 5 35
12 21 30 32
18 16 25 27 22 29
24
11.2 Deap (con.t)
– 若刪除 29 ,則直接刪除即可,結果如下圖所示
5 35
12 21 30 32
18 16 25 27 22
25
11.2 Deap (con.t)
– 刪除 21 ,此時以最後一個節點 22 取代之,再將最後一個節點刪除,檢查左子樹仍為一棵 min-heap ,且節點鍵值 22 小於其對應節點 32 ,不需作任何調整。刪除結果如下
5 35
12 22 30 32
18 16 25 27
26
11.2 Deap (con.t)
– 刪除 12 ,以最後一個節點 27 取代
5 35
27 22 30 32
18 16 25
27
11.2 Deap (con.t)
– 左子樹不符合 min-heap 的定義,將 27 子節點中鍵值較小者 16 交換
– 最後 16 與其對應的 30 比較; 16 小於 30 ,故不需再做調整
5 35
16 22 30 32
18 27 25
28
11.3 Binomial heap
Binomial heap– Binomial heap 是由一些 Binomial tree 所組成的集合 – 一棵 Binomial tree (Bk) 具有那些特徵:
Bk 的 Binomial tree 含有二棵 Bk-1 的 Binomial tree 。 Bk 的 Binomial tree 具有 2k 的節點數,如下所示
B0 B1 B2 B3
29
11.3 Binomial heap (con.t)
Bk 的高度為 k ,如 B3 表示此棵 Binomial tree 的高度為 3
在高度為 i 的那一層共有 k! / i!(k-i)! 個節點
高度 0
1
2
3
4
2
30
11.3 Binomial heap (con.t)
11.3.1 合併的動作 假設有二棵 Binomial heap ,如下圖所示:
7
13
19
15
1
23
12head[H1]
5
45
19
39 28
44
31
3
37
18head[H2]
50
31
11.3 Binomial heap (con.t)
– 將它們化為一棵 Binomial heap ,由左至右按照其 degree由小至大排列之
6
45
30 10 44
31
1
23
18head[H]
50
12 3
37
28
13
7
15
19
32
11.3 Binomial heap (con.t)
– 將 degree 相同的合併,並且注意較小的鍵值放在上面,重複此步驟直到沒有相同的 degree 為止。首先將 degree為 0 的 Binomial tree 合併
6
45
30 10 44
31
1
2318
head[H]
50
12 3
37
28
13
7
15
19
33
11.3 Binomial heap (con.t)
– 再將 degree 為 1 的 Binomial tree 合併,由於有 3 棵 Binomial tree 的 degree 為 1 ,因此我們必須先判斷 root 的鍵值為較小的二棵 Binomial tree ,然後將這二棵 Binomial tree 中較大的加在較小的 Binomial tree 下方,如下圖所示:
6
45
30 10 44
31
1
2318
head[H]
50
12
3
37 28
13
7
15
19
34
11.3 Binomial heap (con.t)
– 再將 degree 為 2 的合併 6
45
30 10 44
31
1
2318
head[H]
50
12
3
37 2813
7
15
19
35
11.3 Binomial heap (con.t)
– 再將 degree 為 3 的合併
– 此時就大功告成了,其 Big-O 為 O( log n)
6
45
30 10 44
31
1
2318
head[H]
50
12
3
37
28
13
7
15
19
36
11.3 Binomial heap (con.t)
11.3.2 加入的動作 將一節點加入到 Binomial heap ,有二個步驟:
– 將它加入到 head[H] 指向 Binomial tree 之樹根的鏈結串列中
– 執行合併的動作。
37
11.3 Binomial heap (con.t)
– 下面舉個例子來說明上述的步驟,將圖 11.1 加入一節點,其鍵值為 18 ,則加入於 head[H] 指向的樹根串列中
7
11
8 13 15
17
1
23
18head[H]
28
12
10
16 19
38
11.3 Binomial heap (con.t)
– 利用上述合併的動作,將按照 degree 的大小排列,再進行合併
– 由於 12 和 18 的 degree 皆為 0 ,故合併之,將 18 加入到12 的下方,因為 18 大於 12 。其 Big-O 為 O( log n)
7
11
8 13 15
17
1
2318
head[H]
28
12
10
16 19
39
11.3 Binomial heap (con.t)
11.3.3 刪除的動作 刪除的動作
– 一般刪除的動作乃是擷取此棵 Binomial heap 的最小值出來,因此只要從 head[H] 指向的鏈結串列中就可找到最小的值在那一棵 Binomial tree ,此時將此節點刪除之即可
如有一棵 Binomial heap 如下 :7
11
8 13 15
17
1
23
head[H]
28
12
10
16 19
40
11.3 Binomial heap (con.t)
– 將最小的鍵值 1 刪除,則為 7
11
8 13 15
17
10
16
head[H]
28
12 23
19
41
11.3 Binomial heap (con.t)
– 因為在刪除 1 之後, Binomial heap 中有 degree 相同的 Binomial tree ,因此要執行合併的動作
7
11
8 13 15
17
10
16
head[H]
28
12
23
19
42
11.3 Binomial heap (con.t)
– 而刪除動作的 Big-O 也是 O( log n)
7
11
8 13 15
17
10
16
head[H]
28
12
23 19
43
11.4 Fibonacci heap
Fibonacci heap 的類型– max F-heap :若 parent 節點的鍵值皆大於 child 節點的鍵
值,則稱此棵樹為 max F-heap – min F-heap :若 parent 節點的鍵值皆小於 child 節點的鍵值,
則稱此棵樹為 min F-heap 有一棵 F-heap 如下所示:
20
37
18 22 42
39
2
50
6
16
31
12 15
36
min[H]
44
11.4 Fibonacci heap (con.t)
– 每一節點的資料結構如下:parent
Llink key Rlink
Children
45
11.4 Fibonacci heap (con.t)
11.4.1 加入的動作 加入的動作
– 假設現在有一棵 F-heap ,如下圖所示
20
37
28 22 42
39
2
50
6
16
31
12 15
36
min[H]
46
11.4 Fibonacci heap (con.t)
– 加入 77
– 只要將 77 加入到 root 串列中,再看看它是否比 min[H] 來得小,若是,則將 min[H] 指向此新加入的鍵值。加入後不需要作合併的動作。而此加入動作的 Big-O 為 O(1)
20
37
28 22 42
39
2
50
77
16
31
6 15
36
min[H]
12
47
11.4 Fibonacci heap (con.t)
11.4.2 擷取 F-heap 中的最小值 擷取 F-heap 中的最小值
– 擷取 min[H] 所指向的節點 假設有一 F-heap ,如下圖所示:
– 今將擷取 min[H] 即為鍵值為 2 的節點
20
37
22 42
39
2
50
6
16
31
36
min[H]
48
11.4 Fibonacci heap (con.t)
– 刪除鍵值 2 的節點後,此時的 F-heap 為
20
37 22 42
36
39
5016
31
6
min[H]
49
11.4 Fibonacci heap (con.t)
– 因為刪除鍵值 2 後,有相同的 degree 的樹,所以將其合併之。合併的動作與 Binomial heap 的合併動作相同,在此不再贅述
20
37 22 42
36
39
16
31
6
50
min[H]
20
50 22 42
36
39
6
31
16
37
min[H]
50
11.4 Fibonacci heap (con.t)
– 而刪除動作的 Big-O 為 O( log n)
20
22 42
36
39
31
6
5016
37
min[H]
51
11.4 Fibonacci heap (con.t)
– 而刪除動作的 Big-O 為 O( log n)
20
22 42
36
39
31
6
5016
37
min[H]
52
11.4 Fibonacci heap (con.t)
11.4.3 減少某鍵值的值 減少某鍵值的值
– 將圖 11.2 的鍵值 16 減少 15 ,使其為 1 。– 首先與 parent node 相比,若較小,則刪除此節點與父節點
和兄弟節點的指標,此時將此節點和其子節點 ( 若有的話 )獨立出來,並將其加入 root 集合中。
– 並重新掃瞄 root 串列中的最小值為何,之後將 min[H] 指向它
53
11.4 Fibonacci heap (con.t)
– 其結果如下圖所示:
– 若減少某一鍵值 (decrease key) 之後,其值還是比 parent 來得大,則不需調整之。此一減少某鍵值的值之 Big-O 為 O(1)
20
28 22 42
39
26
50
31
15
36
12 1
min[H]
37
54
11.4 Fibonacci heap (con.t)
11.4.4 刪除的動作 刪除的動作:
– 刪除的節點若為最小值,即和擷取最小值的情況是一樣的,刪除此節點並將其所屬的 child node 為此棵樹的 root ,重新連結這些節點,如將圖 11.2 刪除節點 2 ,則將成為下圖所示
20
28 22 4239
166
31
15
37
12 3650
min[H]
55
11.4 Fibonacci heap (con.t)
– 並重新選擇 root 中最小值為 6 ,因此 min[H] 指向此節點,之後再進行合併的動作
– 若刪除的不是最小值的話,如刪除圖 11.2 中的 16 ,則成為
20
28 22 42
39
26
50
31
15
36
12 37
min[H]
56
11.4 Fibonacci heap (con.t)
– 亦即從 double circular list 中刪除掉,然後將其 children node 成為 root 集合中的一員,如刪除 16 ,則 37 就會成為 root 集合中的一員,並選擇 root 集合中最小的一員當其 min[H] ,之後再進行合併的動作
– 而此刪除動作的 Big-O 為 O( log n)