データ構造とアルゴリズム AVL木 (平衡探索木)

データ構造とアルゴリズム
AVL 木 (平衡探索木)
岡本 吉央
豊橋技術科学大学 情報工学系
2005 年 10 月 3 日
岡本 吉央
AVL 木
目的
前回:2 分探索木:
最悪の場合の高さ = O(n)
最良の場合の高さ = O(log n)
今回:AVL 木
常に高さが O(log n) となる 2 分探索木
岡本 吉央
AVL 木
平衡探索木
定義
平衡探索木 (balanced search tree) とは
根付き木
高さが O(log n)
様々な平衡探索木
AVL 木
赤黒木 (2 色木)
2-3 木
B木
岡本 吉央
AVL 木
AVL 木:定義
定義
A に対する AVL 木 (AVL-tree) とは
2 分探索木
どの節点においても,
その左部分木と右部分木の高さの差が 1 以下
岡本 吉央
AVL 木
AVL 木:例 1
AVL 木?
4
3
2
1
岡本 吉央
AVL 木
AVL 木:例 1
AVL 木?でない
4
3
2
1
岡本 吉央
AVL 木
AVL 木:例 2
AVL 木?
8
4
12
2
1
6
3
5
10
7
岡本 吉央
9
AVL 木
14
11
13 15
AVL 木:例 2
AVL 木?である
8
4
12
2
1
6
3
5
10
7
岡本 吉央
9
AVL 木
14
11
13 15
AVL 木:例 3
AVL 木?
8
3
2
1
14
6
4
12
7
10
9
5
岡本 吉央
AVL 木
15
13
11
16
AVL 木:例 3
AVL 木?である
8
3
2
1
14
6
4
12
7
10
9
5
岡本 吉央
AVL 木
15
13
11
16
AVL 木:例 4
AVL 木?
(注:配布物と異なる)
5
2
8
1
4
6
3
9
7
10
12
11
岡本 吉央
AVL 木
AVL 木:例 4
AVL 木?である
(注:配布物と異なる)
5
2
8
1
4
6
3
9
7
10
12
11
岡本 吉央
AVL 木
AVL 木:例 5
AVL 木?
8
12
5
2
1
10
7
3
9
6
4
13
11
15
14
岡本 吉央
AVL 木
AVL 木:例 5
AVL 木?でない
8
12
5
2
1
10
7
3
9
6
4
13
11
15
14
岡本 吉央
AVL 木
AVL 木:例 5
AVL 木?でない (13 に注目)
8
12
5
2
1
10
7
3
9
6
4
13
11
15
14
岡本 吉央
AVL 木
AVL 木の性質:部分木
AVL 木の部分木も AVL 木
8
3
2
1
14
6
4
12
7
10
9
5
証明:定義から直ちに分かる
岡本 吉央
AVL 木
15
13
11
16
AVL 木の性質:部分木
AVL 木の部分木も AVL 木
8
3
2
1
14
6
4
12
7
10
9
5
証明:定義から直ちに分かる
岡本 吉央
AVL 木
15
13
11
16
AVL 木の性質:高さ
AVL 木の高さは O(log n)
証明:
f (h) = 高さ h の AVL 木が持つ節点の最小数
ここで,h ≥ 2 のとき
f (h) = 1 + f (h − 1) + f (h − 2)
が成り立つ (ただし,f (0) = 1, f (1) = 2)
岡本 吉央
AVL 木
AVL 木の性質:高さ
AVL 木の高さは O(log n)
証明:
f (h) = 高さ h の AVL 木が持つ節点の最小数
ここで,h ≥ 2 のとき
f (h) = 1 + f (h − 1) + f (h − 2)
が成り立つ (ただし,f (0) = 1, f (1) = 2)
岡本 吉央
AVL 木
AVL 木の性質:高さ
AVL 木の高さは O(log n)
証明:
f (h) = 高さ h の AVL 木が持つ節点の最小数
ここで,h ≥ 2 のとき
f (h) = 1 + f (h − 1) + f (h − 2)
が成り立つ (ただし,f (0) = 1, f (1) = 2)
岡本 吉央
AVL 木
AVL 木の性質:高さ (続き)
解くと,
√ !h+3
1  1+ 5
−
f (h) = √
2
5

ここで,f (h) ≤ n と置くと,

√ !h+3
1− 5
 −1
2
h = O(log n)
が得られる
[証明終]
岡本 吉央
AVL 木
AVL 木の性質:高さ (続き)
解くと,
√ !h+3
1  1+ 5
−
f (h) = √
2
5

ここで,f (h) ≤ n と置くと,

√ !h+3
1− 5
 −1
2
h = O(log n)
が得られる
[証明終]
岡本 吉央
AVL 木
AVL 木の性質:高さ (続き)
解くと,
√ !h+3
1  1+ 5
−
f (h) = √
2
5

ここで,f (h) ≤ n と置くと,

√ !h+3
1− 5
 −1
2
h = O(log n)
が得られる
[証明終]
岡本 吉央
AVL 木
AVL 木に対する操作
Member, Min
木を変化させないので,
2 分探索木と同じ操作でよい
Insert,Delete
木を変化させるので,
2 分探索木と同じ操作では足りない
→ 変更操作を行なう
⇒ 変更を容易にするため各節点にラベルを
付ける
岡本 吉央
AVL 木
AVL 木に対する操作
Member, Min
木を変化させないので,
2 分探索木と同じ操作でよい
Insert,Delete
木を変化させるので,
2 分探索木と同じ操作では足りない
→ 変更操作を行なう
⇒ 変更を容易にするため各節点にラベルを
付ける
岡本 吉央
AVL 木
AVL 木に対する操作
Member, Min
木を変化させないので,
2 分探索木と同じ操作でよい
Insert,Delete
木を変化させるので,
2 分探索木と同じ操作では足りない
→ 変更操作を行なう
⇒ 変更を容易にするため各節点にラベルを
付ける
岡本 吉央
AVL 木
AVL 木に対する操作
Member, Min
木を変化させないので,
2 分探索木と同じ操作でよい
Insert,Delete
木を変化させるので,
2 分探索木と同じ操作では足りない
→ 変更操作を行なう
⇒ 変更を容易にするため各節点にラベルを
付ける
岡本 吉央
AVL 木
節点のラベル付け
節点 y のラベル s(y )


L 左部分木の高さ > 右部分木の高さ
s(y ) = E 左部分木の高さ = 右部分木の高さ


R 左部分木の高さ < 右部分木の高さ
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
岡本 吉央
AVL 木
E
R
16 E
節点のラベル付け
節点 y のラベル s(y )


L 左部分木の高さ > 右部分木の高さ
s(y ) = E 左部分木の高さ = 右部分木の高さ


R 左部分木の高さ < 右部分木の高さ
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
岡本 吉央
AVL 木
E
R
16 E
変更操作:単右回転
u における単右回転 (single right rotation)
u
v
v
u
γ
β
α
α
岡本 吉央
AVL 木
β
γ
変更操作:単左回転
v における単左回転 (single left rotation)
v
u
v
u
α
β
α
γ
岡本 吉央
AVL 木
β
γ
変更操作:双左回転
u における双左回転 (double left rotation)
u
w
v
v
u
w
δ
α
α
β
γ
岡本 吉央
AVL 木
β
γ
δ
変更操作:双右回転
v における双右回転 (double right rotation)
v
w
u
v
u
w
α
δ
β
α
γ
岡本 吉央
AVL 木
β
γ
δ
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
17 の挿入
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
E
R
16 E
16
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
17 の挿入
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
E
R
16 E
17
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
R
16 E
E
17 の挿入,17 のラベルは E (葉だから)
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
17
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
L
12
15
7 E 10 E 13 E
9 11
5 E
E
E
17 から根に向かってラベルを更新
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
R
16 E
17
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
E
右から更新
⇒ 16 の右部分木の高さが 1 増加
16 のラベルは E
⇒ 16 の新しいラベルは R
岡本 吉央
AVL 木
R
16 E
17
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
E
右から更新
⇒ 16 の右部分木の高さが 1 増加
16 のラベルは E
⇒ 16 の新しいラベルは R
岡本 吉央
AVL 木
R
16 R
17
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
E
右から更新
⇒ 15 の右部分木の高さが 1 増加
15 のラベルは R
⇒ 15 において条件が満たされない
岡本 吉央
AVL 木
R
16 R
17
E
ラベルと回転の組合せによる変更:例 1
R
8 E
3
2 L
1 E
6
4
R
L
L
14
L
16 E
12
7 E 10 E 13 E 15 17
E
E
9 11
5 E
E
E
16 のラベルは R だった
⇒ 15 において単左回転,ラベルも付け替え
14 の右部分木の高さは挿入前と変化なし
⇒ 変更終了
岡本 吉央
AVL 木
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
16 の削除
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
E
R
16 E
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
16 の削除
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
E
R
16 E
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
R
16 E
E
16 の親だった 15 からラベルの付け替え
ダミー
ダミー
ダミー
岡本 吉央
AVL 木
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
E
右から更新
⇒ 15 の右部分木の高さが 1 減少
15 のラベルは R
⇒ 15 の新しいラベルは E
岡本 吉央
AVL 木
R
16 E
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
E
右から更新
⇒ 15 の右部分木の高さが 1 減少
15 のラベルは R
⇒ 15 の新しいラベルは E
岡本 吉央
AVL 木
E
16 E
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
L
12
15
7 E 10 E 13 E
9 11
5 E
E
E
右から更新
⇒ 14 の右部分木の高さが 1 減少
14 のラベルは L
⇒ 14 において条件が満たされない
岡本 吉央
AVL 木
E
16 E
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
4
R
L
L
14
12
L
15
7 E 10 E 13 E
9 11
5 E
E
E
16 E
E
15 のラベルは E だった
⇒ 14 において単右回転,ラベルも付け替え
ダミー
ダミー
岡本 吉央
AVL 木
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
L
4
R
7 E
5 E
E
E
12
10
9
E
14
11 13
E
E
E
15 E
E
15 のラベルは E だった
⇒ 14 において単右回転,ラベルも付け替え
ダミー
ダミー
岡本 吉央
AVL 木
ラベルと回転の組合せによる変更:例 2
R
8 E
3
2 L
1 E
6
L
4
R
7 E
5 E
E
12
E
10
9
E
11 13
E
E
右から更新
⇒ 右部分木の高さが 1 減少
8 のラベルは E
⇒ 8 の新しいラベルは L
岡本 吉央
14
AVL 木
E
E
15 E
ラベルと回転の組合せによる変更:例 2
R
8 L
3
2 L
1 E
6
L
4
R
7 E
5 E
E
12
E
10
9
E
11 13
E
E
右から更新
⇒ 右部分木の高さが 1 減少
8 のラベルは E
⇒ 8 の新しいラベルは L
岡本 吉央
14
AVL 木
E
E
15 E
ラベルと回転の組合せによる変更:例 2
R
8 L
3
2 L
1 E
6
L
4
R
7 E
5 E
E
E
12
10
9
E
14
11 13
E
E
E
8 を根とする部分木の高さは変化なし
⇒ 全体の変更を終了
ダミー
ダミー
岡本 吉央
AVL 木
E
15 E
Insert と Delete のアルゴリズムの説明
一般的な挿入と削除のアルゴリズム (概要)
要素の挿入,削除
⇒ 部分木の高さが変化
⇒ ラベルを変更,必要ならば回転操作
注意
アルゴリズムは暗記しない
論理的に考えれば導くことが出来る
岡本 吉央
AVL 木
Insert と Delete のアルゴリズムの説明
一般的な挿入と削除のアルゴリズム (概要)
要素の挿入,削除
⇒ 部分木の高さが変化
⇒ ラベルを変更,必要ならば回転操作
注意
アルゴリズムは暗記しない
論理的に考えれば導くことが出来る
岡本 吉央
AVL 木
一般的な変更の方法:挿入
挿入した要素のラベルは E
そこから根に向かって順に昇る
1. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 増えたとき)
1-1. v のラベルが L のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
1-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを R にして,上へ昇る
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入
挿入した要素のラベルは E
そこから根に向かって順に昇る
1. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 増えたとき)
1-1. v のラベルが L のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
1-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを R にして,上へ昇る
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入
挿入した要素のラベルは E
そこから根に向かって順に昇る
1. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 増えたとき)
1-1. v のラベルが L のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
1-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを R にして,上へ昇る
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入
挿入した要素のラベルは E
そこから根に向かって順に昇る
1. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 増えたとき)
1-1. v のラベルが L のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
1-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを R にして,上へ昇る
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入 (続き)
1-3. v のラベルが R のとき
1-3-1. v の右の子供 u のラベルが R のとき
v において単左回転,ラベルも付け替え
変更終了
v R
u
u
E
R
E
v
α
β
α
γ
岡本 吉央
AVL 木
β
γ
一般的な変更の方法:挿入 (続き)
1-3. v のラベルが R のとき
1-3-2. v の右の子供 u のラベルが L のとき
v において双右回転,ラベルも付け替え
変更終了
v R
wE
u L
u E
v L
w R
α
β
β
δ
α
γ
岡本 吉央
AVL 木
γ
δ
一般的な変更の方法:挿入 (続き)
1-3. v のラベルが R のとき
1-3-2. v の右の子供 u のラベルが L のとき
v において双右回転,ラベルも付け替え
変更終了
v R
wE
u L
u R
v L
w L
α
γ
γ
δ
α
β
岡本 吉央
AVL 木
β
δ
一般的な変更の方法:挿入 (続き)
挿入した要素のラベルは E
そこから根に向かって順に昇る
2. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 増えたとき)
2-1. v のラベルが R のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
2-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを L にして,上へ昇る
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入 (続き)
挿入した要素のラベルは E
そこから根に向かって順に昇る
2. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 増えたとき)
2-1. v のラベルが R のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
2-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを L にして,上へ昇る
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入 (続き)
挿入した要素のラベルは E
そこから根に向かって順に昇る
2. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 増えたとき)
2-1. v のラベルが R のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
2-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを L にして,上へ昇る
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入 (続き)
挿入した要素のラベルは E
そこから根に向かって順に昇る
2. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 増えたとき)
2-1. v のラベルが R のとき
v を根とする部分木の高さは不変 ⇒
v のラベルを E に変更して,変更終了
2-2. v のラベルが E のとき
v を根とする部分木の高さが変化 ⇒
v のラベルを L にして,上へ昇る
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:挿入 (続き)
2-3. v のラベルが L のとき
2-3-1. v の左の子供 u のラベルが L のとき
v において単右回転,ラベルも付け替え
変更終了
L v
u E
L u
v E
γ
β
α
α
岡本 吉央
AVL 木
β
γ
一般的な変更の方法:挿入 (続き)
2-3. v のラベルが L のとき
2-3-2. v の左の子供 u のラベルが R のとき
v において双左回転,ラベルも付け替え
変更終了
R
Lv
w
E
u
w
L
u
v
γ
α
β
岡本 吉央
R
γ
δ
α
E
AVL 木
β
δ
一般的な変更の方法:挿入 (続き)
2-3. v のラベルが L のとき
2-3-2. v の右の子供 u のラベルが R のとき
v において双左回転,ラベルも付け替え
変更終了
R
Lv
w
L
u
w
R
β
α
γ
岡本 吉央
u
v
E
β
δ
α
E
AVL 木
γ
δ
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
1. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 減ったとき)
1-1. v のラベルが L のとき
v のラベルを E に変更して,上へ昇る
1-2. v のラベルが E のとき
v のラベルを R にして,変更終了
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
1. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 減ったとき)
1-1. v のラベルが L のとき
v のラベルを E に変更して,上へ昇る
1-2. v のラベルが E のとき
v のラベルを R にして,変更終了
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
1. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 減ったとき)
1-1. v のラベルが L のとき
v のラベルを E に変更して,上へ昇る
1-2. v のラベルが E のとき
v のラベルを R にして,変更終了
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
1. ある節点 v に左から到達したとき
(すなわち,左部分木の高さが 1 減ったとき)
1-1. v のラベルが L のとき
v のラベルを E に変更して,上へ昇る
1-2. v のラベルが E のとき
v のラベルを R にして,変更終了
1-3. v のラベルが R のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除 (続き)
1-3. v のラベルが R のとき
1-3-1. v の右の子供 u のラベルが E のとき
v において単左回転,ラベルも付け替え
変更終了
v R
u
u
R
E
L
v
α
α
β
γ
γ
β
岡本 吉央
AVL 木
一般的な変更の方法:削除 (続き)
1-3. v のラベルが R のとき
1-3-2. v の右の子供 u のラベルが R のとき
v において単左回転,ラベルも付け替え
上へ昇る
E
v R
u
u
E
R
v
α
β
α
γ
岡本 吉央
AVL 木
β
γ
一般的な変更の方法:削除 (続き)
1-3. v のラベルが R のとき
1-3-3. v の右の子供 u のラベルが L のとき
v において双右回転,ラベルも付け替え
上へ昇る
v R
wE
u L
u R
v E
w L
α
γ
γ
δ
α
β
岡本 吉央
AVL 木
β
δ
一般的な変更の方法:削除 (続き)
1-3. v のラベルが R のとき
1-3-3. v の右の子供 u のラベルが L のとき
v において双右回転,ラベルも付け替え
上へ昇る
v R
wE
u L
u E
v E
w E
α
δ
β
α
γ
岡本 吉央
AVL 木
β
γ
δ
一般的な変更の方法:削除 (続き)
1-3. v のラベルが R のとき
1-3-3. v の右の子供 u のラベルが L のとき
v において双右回転,ラベルも付け替え
上へ昇る
v R
wE
u L
u E
v L
w R
α
β
β
δ
α
γ
岡本 吉央
AVL 木
γ
δ
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
2. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 減ったとき)
2-1. v のラベルが R のとき
v のラベルを E に変更して,上へ昇る
2-2. v のラベルが E のとき
v のラベルを L にして,変更終了
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
2. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 減ったとき)
2-1. v のラベルが R のとき
v のラベルを E に変更して,上へ昇る
2-2. v のラベルが E のとき
v のラベルを L にして,変更終了
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
2. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 減ったとき)
2-1. v のラベルが R のとき
v のラベルを E に変更して,上へ昇る
2-2. v のラベルが E のとき
v のラベルを L にして,変更終了
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除
削除要素を移動させた場所の親から
根に向かって順に昇る
2. ある節点 v に右から到達したとき
(すなわち,右部分木の高さが 1 減ったとき)
2-1. v のラベルが R のとき
v のラベルを E に変更して,上へ昇る
2-2. v のラベルが E のとき
v のラベルを L にして,変更終了
2-3. v のラベルが L のとき
v で条件が満たされない →
岡本 吉央
AVL 木
一般的な変更の方法:削除 (続き)
2-3. v のラベルが L のとき
2-3-1. v の左の子供 u のラベルが E のとき
v において単右回転,ラベルも付け替え
変更終了
L v
u R
E u
v L
γ
α
α
β
γ
β
岡本 吉央
AVL 木
一般的な変更の方法:削除 (続き)
2-3. v のラベルが L のとき
2-3-2. v の左の子供 u のラベルが L のとき
v において単右回転,ラベルも付け替え
上へ昇る
L v
u E
L u
v E
γ
β
α
α
岡本 吉央
AVL 木
β
γ
一般的な変更の方法:削除 (続き)
2-3. v のラベルが L のとき
2-3-3. v の左の子供 u のラベルが R のとき
v において双左回転,ラベルも付け替え
上へ昇る
R
Lv
w
E
u
w
L
u
v
γ
α
β
岡本 吉央
R
γ
δ
α
E
AVL 木
β
δ
一般的な変更の方法:削除 (続き)
2-3. v のラベルが L のとき
2-3-3. v の左の子供 u のラベルが R のとき
v において双左回転,ラベルも付け替え
上へ昇る
R
Lv
w
E
u
w
E
E
u
v
E
δ
α
α
β
γ
岡本 吉央
AVL 木
β
γ
δ
一般的な変更の方法:削除 (続き)
2-3. v のラベルが L のとき
2-3-3. v の左の子供 u のラベルが R のとき
v において双左回転,ラベルも付け替え
上へ昇る
R
Lv
w
L
u
w
R
β
α
γ
岡本 吉央
u
v
E
β
δ
α
E
AVL 木
γ
δ
AVL 木に対する操作の計算量
Member,Min
2 分探索木と同じく,O(木の高さ) = O(log n)
Insert,Delete
挿入と削除自体に,O(木の高さ) = O(log n)
各回転は定数個のポインタの付け替え
回転操作の数は高々O(木の高さ)
∴ 計算量は O(木の高さ) = O(log n)
岡本 吉央
AVL 木
AVL 木に対する操作の計算量
Member,Min
2 分探索木と同じく,O(木の高さ) = O(log n)
Insert,Delete
挿入と削除自体に,O(木の高さ) = O(log n)
各回転は定数個のポインタの付け替え
回転操作の数は高々O(木の高さ)
∴ 計算量は O(木の高さ) = O(log n)
岡本 吉央
AVL 木
まとめ
平衡探索木と AVL 木
AVL 木の高さ = Θ(log n)
回転操作
ラベルによる操作の効率化
(操作は覚えるのではなく,論理的に導く)
岡本 吉央
AVL 木
まとめ
平衡探索木と AVL 木
AVL 木の高さ = Θ(log n)
回転操作
ラベルによる操作の効率化
(操作は覚えるのではなく,論理的に導く)
岡本 吉央
AVL 木
まとめ
平衡探索木と AVL 木
AVL 木の高さ = Θ(log n)
回転操作
ラベルによる操作の効率化
(操作は覚えるのではなく,論理的に導く)
岡本 吉央
AVL 木
まとめ
平衡探索木と AVL 木
AVL 木の高さ = Θ(log n)
回転操作
ラベルによる操作の効率化
(操作は覚えるのではなく,論理的に導く)
岡本 吉央
AVL 木
まとめ
平衡探索木と AVL 木
AVL 木の高さ = Θ(log n)
回転操作
ラベルによる操作の効率化
(操作は覚えるのではなく,論理的に導く)
岡本 吉央
AVL 木
演習問題 (1)
{1, 2, 3, 4} に対する 2 分探索木を全て書き下して
みよ.
2 分探索木は全部でいくつあるだろうか?
その中で AVL 木であるものはどれか?
AVL 木はいくつあるだろうか?
ランダム 2 分探索木のように,ランダムな順
列に従って要素を挿入することによって AVL
木を構成した場合,各 AVL 木はどれほどの確
率で得られるだろうか?
岡本 吉央
AVL 木
演習問題 (2)
2 分探索木に対する各回転操作が
「2 分探索木である」という性質を保つことを
示せ
岡本 吉央
AVL 木
演習問題 (3)
挿入操作における 1-3 と 2-3 の場合において,
節点 w のラベルが E である場合を考える必要が
ないのはなぜか?
岡本 吉央
AVL 木
演習問題 (4)
下の AVL 木に対して (A)∼(F) の操作を順に行な
うと,各操作後に得られる AVL 木はどうなるか?
2
0
8
1
9
5
3
7
(A) 6 の挿入 (B) 1 の削除 (C) 4 の挿入
(D) 3 の削除 (E) 8 の削除 (F) 1 の挿入
岡本 吉央
AVL 木
演習問題 (5)
異なる整数の集合 A と B ,そして,整数 x に対し
て,次の不等式が成り立っているとする.
任意の a ∈ A と b ∈ B に対して,a < x < b .
A に対する AVL 木と B に対する AVL 木が与えられ
ていて,それぞれの高さは hA , hB とする.
このとき,A ∪ {x} ∪ B に対する AVL 木を
O(1 + |hA − hB |) という計算量
で構成するにはどうしたらよいか?
(hA と hB は事前に分かっているとする.)
岡本 吉央
AVL 木