Michael Tsai
2010/12/31 2010最後一堂資料結構課
Happy New Year
•
作業六(最後一個作業, 耶)上線•
期末考前due (跟助教會再討論)•
期末考方式討論(close book, 2 A4雙面大抄)•
範圍: 全部(第一堂課到最後一堂課)紅黑樹
•
可以幹嘛?•
是棵平衡的樹: 保證從root到某個leaf的simple path一定不會 超過從root到任何一條其他這樣的path的兩倍長•
大概平衡operation可以都在O(log n)內完成. 耶.•
那些operation?•
1. 找•
2. 插入某element•
3. 殺掉某element•
4. 找最大or找最小element紅黑樹
•
每個node都分配一個顏色: 紅或黑•
使用extended binary tree: 沒有children的地方都補上external node, 又叫nil•
規則們:•
1. 每個node不是黑就是紅•
2. root是黑色的•
3. 每個leaf (external node, or nil)都是黑色•
4. 如果一個node是紅的, 則它的children都是黑的•
5. 對每個node來說, 從它到他的所有子孫葉子node的路徑上 含有一樣數目的黑色node黑高度
•
Black height: bh(x) = 從x到任何一個它的子孫葉子node遇到 的black node個數 (因為都一樣, 所以可以是任何一個)•
不包含node x自己•
external node或nil(葉子node)的black height為0巨大的紅黑樹例子
26
17 41
47
nil
30
35 39
28 38
14 21
10 16 19 23
15 20 7 12
nil
nil nil
nil nil
nil nil
nil nil
nil nil
nil nil
nil nil
nil nil
3 nil
nil nil
1 2
1 1 1 1
2 3
1 2
3
2
1
1 1
1 2
1 1 1
bh(x)們
巨大的紅黑樹例子
26
17 41
30 47
35 39
28 38
14 21
10 16 19 23
15 20 7 12
3
1 2
1 1 1 1
2 3
1 2
3
2
1
1 1
1 2
1 1 1
bh(x)們
nil
來點證明
•
定理: 一個有n個node的紅黑樹, 最高為2 log(n+1)•
第一步驟: 證明node x底下的subtree最少有2 1個 internal node•
歸納法證明:•
1. 當x的height為0, 則x是個葉子. bh(x)=0. 2 1 0. 的確 subtree有0個internal node.•
2. 假設當x的height為正整數, 且是一個有兩個children的 internal node. 每個小孩的black height為bh(x) or bh(x)‐1. (看 該小孩是黑是紅)•
假設小孩的subtree都至少有2 1個internal node•
3. 則x底下的subtree應該有•
2 1 2 1 1 2 1(成功了!)來點證明
•
“4. 如果一個node是紅的, 則它的children都是黑的”•
另外一種解釋:•
從任一node到leaf, 至少一半以上的node是黑的•
假設h是tree的高度, 則•
“node x底下的subtree最少有2 1個internal node”•
第二步驟: root底下至少有多少個node?•
root底下最少有•
2 1 2 1個node.•
假設node個數為n, 則 2 1•
2 log 1 . 耶.以上證明…
•
說明為什麼•
1. 找•
4. 找最大or找最小element•
等operation可以在O(log n)內完成•
那麼insert和delete呢?•
問題: 插入或殺掉之後, 可能不滿足紅黑樹的條件Representation
data
parent
left right
color
Rotate
•
等一下會用到的y x
x
y left‐rotate(T,x)
right‐rotate(T,y)
Insertion
•
首先, 用原本的binary search tree插入的方法•
insert(z)•
不同的地方:•
1. z的兩個children都指到nil node•
2. z為紅色•
3. 我們最後要處理不符合紅黑樹規則的部分•
怎麼處理?nil
會違反那些規則呢?
•
規則們:•
1. 每個node不是黑就是紅•
2. root是黑色的•
3. 每個leaf (external node, or nil)都是黑色•
4. 如果一個node是紅的, 則它的children都是黑的•
5. 對每個node來說, 從它到他的所有子孫葉子node的路徑上 含有一樣數目的黑色node•
5.不會違反因為z是紅的, z取代掉一個nil, 而z的兩個children 都是nil•
如果違反2, 則z是root, 整棵樹只有z: 很容易處理•
來看違反4的情形: z’s parent is also rednil
nil nil
17
情形一: 你的叔叔是紅的
A D
B C
z: 你 parent(z): 你爸 y:叔叔
A D
B C
z: 你
繼續看新z爸爸是不是紅的 你是你爸右邊的小孩
情形一: 你的叔叔是紅的
B D
A
C
z: 你
parent(z): 你爸 y:叔叔
B D
A
C
z: 你 你是你爸左邊的小孩
注意看每一個步驟是否有保持 紅黑樹第五個條件
情形二與三: 你的叔叔是黑的
A
B C
z: 你 parent(z): 你爸 y:叔叔
B
A
C
z: 你
parent(z): 你爸
y:叔叔
B
A C
z: 你 你是你爸右邊的小孩
你是你爸左邊的小孩 left rotate(A)
right rotate(C)
需要繼續往上層看嗎? 不用! 因為B還是黑的!
注意看每一個步驟是否有保持 紅黑樹第五個條件
黑板練習時間
26
17 41
30 47
35 39
28 38
14 21
10 16 19 23
15 20 7 12
3
1 2
1 1 1 1
2 3
1 2
3
2
1
1 1
1 2
1 1 1
2. 加入4?
1. 加入40?
要花多少時間呢?
•
原本正常的binary tree insert要花O(log n)的時間•
因為高度最高為2 log(n+1)•
那麼花費在調整的時間呢?•
最糟的狀況? 情形一一直重複發生, 每次z往上移兩層•
執行時間最糟要花跟高度成正比的時間•
也是O(log n)•
那如果發生情形二or三呢?•
執行一次即完成. O(1). (所以比O(log n)小)•
另外, 最多rotate只需要執行兩次. (不會再發生第二次情形二 or三)tree 複習)
•
首先要先找到那個node•
接著, 有各種不同情形:•
如果沒有手(degree=0)•
直接拿掉20
12 22
10 15 25
11
tree 複習)
•
如果只有一隻手 (degree=1)•
則把那個唯一的child拿上來接到parent上•
例如: 拿掉22•
問題: 要怎麼接?•
怎麼記得parent是誰?20
12 22
10 15 25
11
tree 複習)
•
如果兩手都有東西呢? (degree=2)•
例如刪掉12•
找左邊child底下最大的•
(或者是右邊child底下最小的)•
刪掉它並把它移到原本刪掉的位置•
問題: 那如果那個最大的底下還有child呢?•
直接拿上來(最多只會有左邊一隻手)•
這時被移上去的node顏色改變成新位置原本node的顏色20
12 22
10 15 25
11
拿掉一個node, 什麼時候會違反規則?
• 假設前述三種情形中,
• 移動(兩手都有)或是刪除(一隻 手或沒有手)的node為y
• 當y為紅色(原本的顏色), 移動或 刪除會造成違反規則嗎?
• 1. black height不會改變, 因為y 是紅色node
• 2. 會不會造成兩個紅色node是 相鄰的呢? (父子)
• A. 如果y是被刪掉的, 因為它是 紅的, 所以它的上下層都是黑的
• 不會有問題
20
12 22
10 15
11
y
拿掉一個node, 什麼時候會違反規則?
•
B. 如果y是被移動的, 假設y有 children也是黑色的, 不會造成 問題•
3. y如果是紅色, 它不會是root.所以也不會有造成違反root是 黑色的規定
•
綜合以上三點, 只有當y為黑色 時才會造成問題, 需要調整20
12 22
10 15 25
11
可能違反規則的情形
•
當y是黑色的, 可能造成違反規則的有下列情形:•
1. y是root. y刪掉以後, 它的一個children是紅色的, 變成了 root•
2. y原本的上下兩層都是紅色的, 移走或刪除以後變成兩個 紅色相鄰•
3. y刪掉或移走以後, 造成black height不一致(因為y是黑的)怎麼修正紅黑樹以符合規則呢?
•
假設x為移動到y位置的node•
(如果忘記了的話, y是被刪掉或被移動的node)•
y原本是黑的, 則x好像要”有兩個黑”, 這樣black height才會正 確•
每次x都指到一個”兩個黑”的node (或者也有可能是”紅與黑”)•
依序修正情形一: x的弟弟是紅的
A D
C B
E
x w
D
A C
B E
x
new w change color of B and D
and left rotate(B)
轉換成情形二、三、或四
x的弟弟是黑的&它的姪子們都是黑的
A D
C B
E
x w
A D
C B
E new x
它的姪子們都是左紅右黑
A D
C B
E
x w
D
A C
B
E new w x
C和D顏色改變 right rotate(D)
變成case 4
它的姪子右邊那一個是紅的
A D
C B
E
x w
D
A C
B E
new x=root B,D,E顏色改變
left rotate(B)