7-3.高度な木
(平衡木)
• AVL木
平衡2分木。回転操作に基づくバランス回
復機構により平衡を保つ。
• B木
平衡多分木。各ノードの分割、併合操作に
より平衡を保つ。
1
2分探索木の問題点
• 高さが O (n ) になることがある。
• 各操作の最悪計算量は、 O (n ) 時間
になってしまう。
(平均計算量は、 O (log n ) 時間である。)
最悪計算時間でもO (log n ) 時間にしたい。
n : 保存データ 数
2
平衡木とは
• 根から、葉までの道の長さが、どの葉に対
してもある程度の範囲にある。
(厳密な定義は、各々の平衡木毎に定義さ
れる。概して、平衡木の高さは、 O (log n )
である。)
• 平衡木に対する各操作は、最悪計算時間
で O (log n ) 時間にできることが多い。
3
平衡木のイメージ
ほぼ完全(2分)木に近い形状をしている。
葉までの経路長がほぼ等しい。
4
AVL木
• Adel’son-Vel’skiiとLandisが考案したデー
タ構造
• 探索、挿入、削除の操作が最悪でも、
O (log n )時間で行える2分探索木の一種。
• 全てのノードにおいて、左部分木と右部分
木の高さの差が1以内に保つ。
最後の、性質を保つために、バランス回復
操作を行う。
また、この性質より、高性能となる。
5
様々なAVL木
5
6
5
1
3
8
2
9
4
6
9
8
8
9
5
3
6
6
AVL木でない例
8
5
5
3
9
4
6
3
1
1
6
1
8
9
8
5
3
7
7
9
7
AVL木の高さの導出
• 「各ノードにおいて、右部分木の高さと左部
分木の高さの差が高々1」
という条件からAVL木の高さが、
O (log n )
になることが導かれる。
AVL木の
バランス条件
ここでは、できるだけ少ないノードで、
高さを増加させることを考える。
8
少ないノードのAVL木1
高さ0
高さ1
高さ2
3点
1点
2点
4点
9
少ないノードのAVL木2
高さ3
7点
高さ4
12点
10
高さ
h
N (h )
のAVL木を実現する最小のノード数を
と表す。
例より、
N (0) = 1, N (1) = 2, N (3) = 4, N (4) = 7, L
という数列になるはずである。
ここで、この数列 N (h ) が満たすべき漸化式を導く。
11
高さ
h
h
を実現する最小ノード数のAVL木
h- 1
h- 2
N (h - 1)
N (h - 2)
\ N (h ) = N (h - 1) + N (h - 2) + 1
左部分木の点数
(右部分木の点数)
右部分木の点数
(左部分木の点数)
根
12
以上の考察より、次の漸化式が成り立つ。
ìï N (0) = 1
h= 0
ïï
ïï
h= 1
í N (1) = 2
ïï
ïï N (h ) = N (h - 1) + N (h - 2) + 1 h ³ 2
ïî
この漸化式を解けば、高さ
N (h ) が求められる。
特殊解を N
h
を実現する最小のノード数
とする。
再帰式より、
N = N +N +1
\ N = - 1
13
この同次解を求める。
すなわち、以下の漸化式を満たす解を求める。
°(h) - N
°(h - 1) - N
°(h - 2) = 0
N
特性方程式を解く。
x2 - x - 1 = 0
よって、
1± 5
\ x=
2
1+ 5
1- 5
a º
,b º
2
2
と置くと、任意定数
c1 , c 2
を持ちいて、次のようにあらわせる。
N (h) = c1a h + c2b h + N = c1a h + c2b h - 1
14
N (0) = c1 + c2 - 1 = 1
1+ 5
1- 5
N (1) = c1
+ c2
- 1= 2
2
2
これを解いて、
c1 =
2+
5
5
1 3
2- 5
- 1 3
=
a , c2 = =
b
5
5
5
1
h+ 3
h+ 3
\ N (h ) = c1a + c2 b + N =
a
b
(
)- 1
5
h
これより、
n
h
点のAVL木の高さは、次式を満たす。
\ N (h ) £ n
15
これより、
h = O (log n )
と高さを導くことができる。
(この評価は、最悪時も考慮されていることに注意する。)
16
AVLへの挿入
• 挿入によっても、AVLのバランス条件を満
足していれば、通常の2分探索木の挿入を
おこなう。
• 挿入によりバランス条件を破ってしまった
とき、挿入状況により、バランス回復操作
をおこなう。
– 1重回転操作
– 2重回転操作
17
バランスを崩す挿入
A
B
挿入前
h
T2
T1
挿入後
h
T3
h
1
A
A
B
B
h
h
T1
X
h
T2
1重回転
T3
h
T1
T2
X
h
h
T3
18
2重回転
1重回転
回転前
回転後
A
h+ 2
T1
X
B
B
h
h+1
T2
h
T3
2
A
h
T1
X
h
h
T2
T3
高さの差は0
19
h
2重回転1
回転前
詳細化
A
h+ 2
A
h+ 2
B
B
C
T1
h
T2
X
h
T3
2
h
T1
h
hT 21 T
22
X
T
1 3
2
20
h
2重回転2
回転前
回転後
C
h+1
B
A
h+ 2
B
h- 1
C
T1
A
h
hT 21 T
22
X
T
1 3
h
T1
h
T 21
T 22
X
T3
2
高さの差は0
21
h
1重回転2回での2重回転の実現
1回転後
回転前
A
C
B
h- 1
T 22
A
h+ 2
T 21
T1
B
X
C
T1
h
hT 21 T
22
X
T
1 3
h
T3
2回転後
C
A
B
2
T1
T 21
X
T 22
T3
22
h
AVL木への挿入例1
1
30
15
10
5
39
34
18
12 16
50
25
23
バランスが崩れる
30
15
10
5
39
34
18
12 16
50
25
1
1重回転
24
15
30
10
5
1
12
18
16
39
25
34
50
1重回転後
25
AVL木への挿入例2
28
30
15
10
5
39
34
18
12 16
50
25
26
バランスが崩れる
30
15
10
5
39
34
18
12 16
50
25
28
2重回転
27
バランスが崩れる
18
15
10
5
12
30
16
25
28
39
34
50
2重回転後
28
練習
次のAVL木に、各要素を順に挿入した結果を示せ。
33
17
8
3
46
41
24
11
27
28 ® 10 ® 35
29
AVLへの挿入の計算量
• 挿入位置の確認とバランス条件のチェックに、木
の高さ分の時間計算量が必要である。
• また、回転操作には、部分木の付け替えだけで
あるので、定数時間( O (1) 時間)で行うことが
できる。
• 以上より、挿入に必要な最悪時間計算量は、
である。
O (log n )
30
AVLへの削除の計算量
• 削除時に、バランス条件が崩された場合も、挿入
時と同様に、回転操作によって、バランスを回復
することができる。
• 削除位置を求めることと、バランス条件のチェッ
クに、木の高さ分の時間計算量が必要である。
• 以上より、削除に必要な最悪時間計算量も、
である。
O (log n )
31
B木の概略
• 多分木( d 分木)を基にした平衡木
• 各ノードには、データそのものと、部分木へ
のポインタを交互に蓄える。
• 各葉ノードまでの道は全て等しい。
(したがって、明らかに平衡木である。)
• 部分木中の全てのデータは、親ノードの
データで範囲が限定される。
32
B木の満たすべき条件
• ①根は、葉になるかあるいは 2 : m 個の子を
持つ。
ém ù
• ②根、葉以外のノードは、 ê ú: m 個の子を
ê2 ú
持つ。
• ③根からすべての葉までの道の長さは等しい。
• ④部分木全てのデータは、その部分木へのポイ
ンタを“はさんでいる”データにより、制限される。
33
B木の例
ém ù
d= ê ú
ê2 ú
d = 2, m = 3
35
10
2
5
45
20
13 15
27
37 40
50
34
B木の高さ
簡単のため、根以外は、
d
個以上の個があるとする。
このとき、高さ h のB木に含まれるノード数
を N (h ) とする。このとき、次が成り立つ。
h
n = N (h ) ³
å
d =
i= 0
i
d
h+ 1
- 1
d- 1
\ h = O (logd n )
35
B木への挿入
43
35
10
2
5
45
20
13 15
27
37 40
50
36
オーバーフロー時のノード分割1
35
10
2
5
45
20
13 15
27
37 40
50
43
37
オーバーフロー時のノード分割2
35
10
2
5
40
20
13 15
27
37
45
43
50
オーバーフローが起きたときには、ノードを分割して、親に向かって
再帰的にB木の条件を満足するように更新していく。
38
B木からの削除
delete(50)
35
10
2
5
40
20
13 15
27
37
45
43
50
アンダーフローが起きたときには、ノードを結合や、
データの再配置等を行い、
再帰的にB木の条件を満足するように更新していく。
39
アンダーフローにおけるデータの再配置
35
10
2
5
40
20
13 15
27
37
43 45
アンダーフローが起きたときには、ノードを結合や、
データの再配置等を行い、
再帰的にB木の条件を満足するように更新していく。
40
B木の最悪計算量
• B木の高さが、 O (logd n ) であることに注意す
る。
• また、1つのノードを処理するために、 O(m ) 時
間必要である。
• 以上より、各操作は、最悪時間計算量として、
O (m + log ém ù n )
ê ú
ê2 ú
時間である。パラメータ m の値により性能に違
いが生じる。m = W(n ) とすると高速に動作しない
41
B木の応用
• ディスクアクセスは、メモリアクセスに比べて極端
に遅い。したがって、ある程度もまとまったデータ
を1度の読み込んだ方が全体として高速に動作
することが多い。
• よって、B木の各ノードに蓄えられているデータを、
一度に読み込むようにすれば、ディスクアクセス
の回数が軽減される。
• 各ノード内の処理は、メモリ上で効率よく実現で
きる。
42
平衡木のまとめ
• 平衡木の高さは、
O (log n )
となる。
• 平衡を実現するための条件により、各種平
衡木が定義される。
• 平衡状態を満足するために、各種バランス
回復処理が行われる。
43
ダウンロード

A B