fibonacci heaps
Post on 18-Feb-2016
77 Views
Preview:
DESCRIPTION
TRANSCRIPT
FIBONACCI HEAPSMichael Tsai2011/1/6
2
Outline• 本學期最後一堂課…有什麼話要講嗎 ?• 考試方式• Red-black tree 複習• Fibonacci Heaps
3
x, y, z 的定義
z zy y
x
z
y
x
nil x
z: 要被刪掉的y: z 少於兩隻手被砍掉的 z 兩隻手 移動到 z 原本位置的x: 移動到原本 y 的位置的
4
拿掉一個 node, 什麼時候會違反規則 ?• 假設前述三種情形中 ,• 移動 ( 兩手都有 ) 或是刪除 ( 一隻手或沒有手 ) 的 node 為 y
• 當 y 為紅色 ( 原本的顏色 ), 移動或刪除會造成違反規則嗎 ?
• 1. black height 不會改變 , 因為y 是紅色 node
• 2. 會不會造成兩個紅色 node 是相鄰的呢 ? ( 父子 )• A. 如果 y 是被刪掉的 , 因為它是紅的 , 所以它的上下層都是黑的• 不會有問題
20
12 22
10 15
11
y
5拿掉一個 node, 什麼時候會違反規則 ?• B. 如果 y 是被移動的 , 假設y 有 children 也是黑色的 , 不會造成問題• 3. y 如果是紅色 , 它不會是root. 所以也不會有造成違反root 是黑色的規定• 綜合以上三點 , 只有當 y 為黑色時才會造成問題 , 需要調整
20
12 22
2510 15
11
6
可能違反規則的情形• 當 y 是黑色的 , 可能造成違反規則的有下列情形 :• 1. y 是 root. y 刪掉以後 , 它的一個 children 是紅色的 , 變成了 root• 2. y 原本的上下兩層都是紅色的 , 移走或刪除以後變成兩個紅色相鄰• 3. y 刪掉或移走以後 , 造成 y 的祖先們的 black height不一致 ( 因為 y 是黑的 )
• y 拿掉以後 , y 的黑色就被”趕到” x 裡面了• x 是表示 : 這邊要有一份黑色• 但是 x 本身可能原本是紅或黑色
7
x 是”紅與黑”或”黑與黑” ?• 1. x 如果是”紅與黑” , 我們把它改成黑就可以了 . • ( 這邊要多一份黑色 , 所以我就把紅色變成黑色就多一份了 )
• 2. x 如果是 root 且為”黑與黑” , 那麼直接就可以改成單純的黑色• ( 反正已經到 root 了 , 所以就算把一份黑色拿掉也不會有祖先會因此少算一份黑色的 node)
• 3. 其他的就用以下的四種 case 處理…
8
情形一 : x 的弟弟是紅的
DA
C
B
𝛼 𝛽
𝛾 𝛿𝜖
E
𝜁
x w
D
A C
B
𝛼 𝛽 𝛾 𝛿
𝜖
E
𝜁xnew w
change color of B and Dand left rotate(B)
轉換成情形二、三、或四
9
情形二:x的弟弟是黑的&它的姪子們都是黑的
DA
C
B
𝛼 𝛽
𝛾 𝛿𝜖
E
𝜁
x w DA
C
B
𝛼 𝛽
𝛾 𝛿𝜖
E
𝜁
new x
10
情形三: x的弟弟是黑的它的姪子們都是左紅右黑
DA
C
B
𝛼 𝛽
𝛾 𝛿𝜖
E
𝜁
x w
D
AC
B
𝛼 𝛽 𝛾
𝛿
𝜖
E
𝜁
new wx
C 和 D 顏色改變right rotate(D)
變成 case 4
11
情形四: x的弟弟是黑的它的姪子右邊那一個是紅的
DA
C
B
𝛼 𝛽
𝛾 𝛿𝜖
E
𝜁
x w
D
A C
B
𝛼 𝛽 𝛾 𝛿
𝜖
E
𝜁
new x=root
B,D,E 顏色改變left rotate(B)
12
Delete 要花多少時間 ?• 解決路徑圖 :• 1 2 solved ( 從 1 到 2 的 , 情形二中的圖中 B 原本一定是紅色 , 所以可以直接解決 )• 134solved• 14solved• 34 solved• 4 solved• 2 解決 ( 如果圖中 B 原本是紅色 ), or 轉到 1 or 2 or 3 or 4 (x 往上走一層 ) ( 如果圖中 B 原本是黑色 )
• 所以 worst case 為 2,2,2,… 一直到 root 為止• O(log n)
13
Fibonacci heaps• 類似於 Binomial heaps• 也是 forest (min tree or max tree 組成 )• 各層的 sibilings 使用 circular doubly linked list
• 有以下的 operations:• insert• find min• delete min• decrease• merge• 除了 delete min 外 , 其他都可以”平均”達到 O(1)!• 還可以做以下的 operation• decrease• delete
14
Insert• 把要加入的 element 自己當作一棵樹 ( 只有一個 node)• 放到 heap 裡面 ( 當作最高層的一棵樹 )• 檢查指著最小的 element 的指標是不是正確的• ( 不用檢查是否要把同樣 degree 的 tree merge 起來 , 和binomial heap 不同 )• ( 把工作拖到需要做再來做可能之後某一些根本不需要做 ?)• O(1)
52
3
18
39
38
41
17
30
24
26
35
46
723
21
min
15
Merge• 把兩個 forest 直接變成同一個 forest• 也就是把兩個 circular linked list 合併• ( 不用檢查是否要把同樣 degree 的 tree merge 起來 , 和binomial heap 不同 )• O(1)
16
重頭戲 : delete min• 剛剛欠的現在都要要回來了• 跟上次 binomial heaps 裡面 merge 的情形幾乎一樣• 1. 先把 min 指到的 element 底下的 sub tree 都放到最頂層• 2. min 可以從最頂層拿掉了• 3. 依序檢查是否有一樣 degree 的樹 , 有的話就把兩個合併 , 然後繼續尋找下去• 黑色的 node 是被標記 , 在被跟現在的 parent 連結之後 , 有砍掉過一個小孩的• 所以如果某個 node 跟別人合併成一棵 , 則要把黑色消掉
17
delete min 例子
52
3
18
39
38
41
17
30
24
26
35
46
723
21
min
18
delete min 例子
52
18
39
38
41
17
30
24
26
35
46
723
21
min
0 1 2 3
19
delete min 例子
52
18
39
38
41
17
30
24
26
35
46
723
21
0 1 2 317
20
delete min 例子
52
18
39
38
41
17
30
24
26
35
46
723
21
0 1 2 317 24
21
delete min 例子
52
18
39
38
41
17
30
24
26
35
46
723
21
0 1 2 323 17 24
22
delete min 例子
52
18
39
38
41
17
30
24
26
35
46
723
21
0 1 2 323 17 24
23
delete min 例子
52
18
39
38
41
17
30
24
26
35
46
7
23
21
0 1 2 317 24
17
30
24
delete min 例子
52
18
39
38
41
24
26
35
46
7
23
21
0 1 2 324
17
30
24
26
35
46
25
delete min 例子
52
18
39
38
41
7
23
21
0 1 2 37
17
30
24
26
35
46
26
delete min 例子
52
18
39
38
41
7
23
21
0 1 2 321 7
17
30
24
26
35
46
27
delete min 例子
52
18
39
38
41
7
23
21
0 1 2 321 18 7
17
30
24
26
35
46
28
delete min 例子
52
18
39
38
41
7
23
21
0 1 2 321 18 7
17
30
24
26
35
46
29
delete min 例子
18
39
38
41
7
23
21
0 1 2 318 7
17
30
24
26
35
46
52
21
52
30
delete min 例子
18
39
38
41
7
23
0 1 2 318 7
17
30
24
26
35
46
21
52
31
delete min 例子
18
39
38
41
7
23
0 1 2 338 18 7
17
30
24
26
35
46
21
52
min
32
Decrease• 把某一個 element(key) 數字減少• 減少以後 , 那個 element 可能就比他的 parent 小了• 必須做一些動作來修正• 1. 如果減少以後 , 比它的 parent 小 , 就把它跟 parent中間連結砍斷 , 把以該 element 的 subtree 移到最上層• 2. 如果這個 parent 已經被砍過一次小孩 , 則把它和它的parent 也砍斷 , 移到最上層 , 並繼續往上檢查是否有此情形…• ( 此稱為 cascading cut)
33
decrease 例子7
24
17
30
23
462
6
35
18
21
39
52
38
41
min
4615
15
24
34
decrease 例子7
17
30
23
26
35
18
21
39
52
38
41
min
15
24
355
5 26
24
35
Delete• 方法 :• 1. 把某一個 element 減少到負無限大 ( 此時它會被移動到最上層 , 而且 min 會指著它 )• 2. delete min
36
Fibonacci Heap 中 node 的degree• 定理 : • 用歸納法 .• k=0 and k=1 時成立 (• 假設 for
• 得證
37
Fibonacci Heap 中 node 的degree• 定理 : b 為任何 Fibonacci heap 中的一個 node, 則 b 的degree 最多為 , , m 是以 b 為 root 之 subtree 的 node數目 .• 證明 : 假設為當 b 為 degree i 的 subtree 的最少 node個數 . • 則• 假設 為 b 的 children, 其中比早加入 b, 比早加入 b等等依此類推 • 當加入時 , b 已經有 i-1 個 children, 所以至少 degree 為i-1• 此時 , 最多可能少掉一個 children ( 少兩個就會被移到最上層 ), 所以至少 degree 為 i-2
38
Fibonacci Heap 中 node 的degree• 我們現在要證明 , k 為 0 或正整數 , 為 Fibonacci 數列• 用歸納法• •
• k=0,1,2 時都成立• 假設 i=0,1,…,k-1 時 , 都成立• 證明 i=k 時 , 是否成 :
39
Fibonacci Heap 中 node 的degree
• Fibonacci number滿足• 所以 ,
• 得證
40
Fibonacci Heap- time complexity• 又• 所以 ,• m 為實際上以 b 為 root 之 subtree 的 node 數目• . 找到 bound 了 !
• Insert, merge, find min O(1)
• 從 Fibonacci tree degree 的 upper bound 我們可以得知 :• Delete min O(degree(trees)+m) = O(log n + m),
m=number of trees in the first level• Decrease O(c), c 為 mark 為黑色之 node 個數 ( 已經被刪掉一個小孩的個數 )
41
下學期再見• 教得不好請多多包涵• 下學期敬請繼續支持• 歡迎來聊天
top related