講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書...
TRANSCRIPT
![Page 1: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/1.jpg)
講義「アルゴリズムとデータ構造」
第6回 探索のためのデータ構造(1)
大学院情報科学研究院 情報理工学部門情報知識ネットワーク研究室
喜田拓也
2019/5/22講義資料
![Page 2: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/2.jpg)
今日の内容
探索※のためのデータ構造
整列済み配列による辞書の実現
二分探索木による辞書の実現
平衡探索木による辞書の実現
※探索: データの中から,特定の要素を探し出すこと
2
![Page 3: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/3.jpg)
探索のためのデータ構造: 辞書(dictionary)
次の3つの基本操作を伴う集合𝑆𝑆を辞書(dictionary)という
1. member(𝑥𝑥,𝑆𝑆): 𝑥𝑥 ∈ 𝑆𝑆ならば yes, 𝑥𝑥 ∉ 𝑆𝑆ならば no を出力
2. insert(𝑥𝑥,𝑆𝑆): 𝑆𝑆 を 𝑆𝑆 ∪ 𝑥𝑥 に更新
3. delete(𝑥𝑥,𝑆𝑆): 𝑆𝑆を 𝑆𝑆 − 𝑥𝑥 に更新
調べたり 新しい項目を書き入れたり 項目を消したり(汗3
![Page 4: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/4.jpg)
整列済み配列による辞書の実現
以降,集合𝑆𝑆は全順序集合であると仮定する配列𝐴𝐴に𝑆𝑆の要素を小さい順に格納する
member(𝑥𝑥, 𝑆𝑆): 配列上を二分探索する
insert(𝑥𝑥, 𝑆𝑆): 𝑥𝑥が入る位置を見つけたら,
それ以降の要素を後ろにずらして,できた空きに𝑥𝑥を入れる
delete(𝑥𝑥, 𝑆𝑆): 𝑥𝑥の位置を見つけたら,それ以降の要素を一つずつ前に詰めていく.𝑆𝑆の最後の要素は空きとなる
delete(7, 𝑆𝑆)の処理
1 3 5 7 9 10 12
次で説明最悪時間計算量 O log𝑛𝑛
O 𝑛𝑛
O 𝑛𝑛
1 3 5 9 9 10 12
1 3 5 9 10 10 12
1 3 5 9 10 12 12
1 3 5 9 10 12
𝑆𝑆
コピー
削除
𝐴𝐴は整列(ソート)済み配列
4
![Page 5: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/5.jpg)
配列を二分探索するアルゴリズム
Step 1: left← 0, right← 𝑛𝑛Step 2: left≥ right ならnoを出力して停止
Step 3: mid← ⌊(left + right)/2⌋Step 4: if 𝑥𝑥 < 𝐴𝐴[mid]
then right← midelse if 𝑥𝑥 = 𝐴𝐴[mid] then yesを出力して停止
else left←mid +1Step 2 へ
1回で範囲を半分以下に絞れるので,𝑘𝑘回で範囲を𝑛𝑛/2𝑘𝑘以下に絞れる範囲が空となったら終わりだから𝑛𝑛/2𝑘𝑘 < 1.よってlog2 𝑛𝑛 < 𝑘𝑘.これを満たす最小の整数𝑘𝑘は⌊ log2 𝑛𝑛 + 1⌋
このループは高々⌊ log2 𝑛𝑛 + 1⌋回
member(5, 𝑆𝑆)の場合
1 3 5 7 9 10 12𝑆𝑆
left rightmid
1 3 5 7 9 10 12
0 1 2 3 4 5 6 7
1 3 5 7 9 10 12
yes
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7
5
![Page 6: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/6.jpg)
二分探索木による辞書の実現
二分木(binary tree)とは,各節点が高々二つの子をもつ根付き木
二分探索木(binary search tree)とは,任意の節点𝑢𝑢に対して次の条件が成り立つ二分木のこと
2分木の例 2分探索木の例
根
𝑢𝑢
𝑣𝑣𝑢𝑢の子
𝑣𝑣の親
7
3 10
1 4
5
8
6
𝑢𝑢
𝑢𝑢の左部分木 𝑢𝑢の
右部分木
5
3 7
1 4
8
6 10
同じ要素が格納された異なる二分探索木
𝑢𝑢の左部分木の任意の節点の要素
< 𝑢𝑢の要素 <𝑢𝑢の右部分木の任意の節点の要素
子が1個の場合もある
この二分探索木を使って全順序集合𝑆𝑆を管理し,辞書とする
6
![Page 7: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/7.jpg)
二分探索木におけるmember(𝑥𝑥, 𝑆𝑆)操作
Step 1: 𝑢𝑢 ←根の節点
Step 2: 𝑦𝑦 ←節点 𝑢𝑢の要素
Step 3: if 𝑥𝑥 = 𝑦𝑦 thenyesを出力して停止
else if 𝑥𝑥 > 𝑦𝑦 thenif 𝑢𝑢の右の子が存在 then𝑢𝑢 ← 𝑢𝑢の右の子
elsenoを出力して停止
else if 𝑢𝑢の左の子が存在 then𝑢𝑢 ← 𝑢𝑢の左の子
elsenoを出力して停止
Step 2へ
member(5, 𝑆𝑆)の場合
7
3 10
1 4
5
8
6
yes
5 <
< 5
< 5
5 <
5 =
𝑢𝑢
𝑥𝑥 ≤ 𝑦𝑦
member(9, 𝑆𝑆)の場合
7
3 10
1 4
5
8
6
𝑢𝑢 < 9
9 <
< 9
no
7
![Page 8: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/8.jpg)
二分探索木におけるinsert(𝑥𝑥, 𝑆𝑆)操作
Step 1: 𝑢𝑢 ←根の節点
Step 2: 𝑦𝑦 ←節点 𝑢𝑢の要素
Step 3: if 𝑥𝑥 = 𝑦𝑦 then 何もしないで停止
else if 𝑥𝑥 > 𝑦𝑦 thenif 𝑢𝑢の右の子が存在 then𝑢𝑢 ← 𝑢𝑢の右の子
else𝑢𝑢の右の子として 𝑥𝑥を要素とする節点を追加して停止
else if 𝑢𝑢の左の子が存在 then𝑢𝑢 ← 𝑢𝑢の左の子
else𝑢𝑢の左の子として 𝑥𝑥を要素とする節点を追加して停止
Step 2へ
insert(9, 𝑆𝑆)の場合
赤字の部分がmember(𝑥𝑥, 𝑆𝑆)操作と違うところ
7
3 10
1 4
5
8
6
𝑢𝑢 < 9
9 <
< 9
9 追加
8
![Page 9: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/9.jpg)
二分探索木におけるdelete(𝑥𝑥, 𝑆𝑆)操作
Step 1: 𝑢𝑢 ←根の節点
Step 2: 𝑦𝑦 ←節点 𝑢𝑢の要素
Step 3: if 𝑥𝑥 = 𝑦𝑦 then Step 4 へelse if 𝑥𝑥 > 𝑦𝑦 thenif 右の子が存在 then 𝑢𝑢 ←右の節点 else 何もしないで停止
elseif 左の子が存在 then 𝑢𝑢 ←左の節点 else 何もしないで停止
Step 2 へStep 4: if 𝑢𝑢は葉 then 𝑢𝑢を木から除いて停止
else if 𝑢𝑢が1つの子をもつ then 𝑢𝑢の子を 𝑢𝑢の位置に上げて停止else𝑣𝑣 ← 𝑢𝑢の右部分木の最小要素をもつ節点
Step 5: 𝑢𝑢の要素← 𝑣𝑣の要素
Step 6: if 𝑣𝑣は葉 then 𝑣𝑣を木から除いて停止else (𝑣𝑣が1つの子を持つ場合)𝑣𝑣を 𝑢𝑢の位置に上げて停止
𝑣𝑣は部分木の最小要素をもつ節点なので子の数は高々1つ
これ以降は𝑢𝑢が2つの子をもつ場合
𝑆𝑆中に 𝑥𝑥が無ければ何もしない
9
![Page 10: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/10.jpg)
二分探索木におけるdelete(𝑥𝑥, 𝑆𝑆)操作の例
7
3 10
1 4
5
8
6
5 <
< 5
< 5
5 <
5 =
𝑢𝑢
delete(5, 𝑆𝑆)の場合
7
3 10
1 4
5
8
6
4 <
< 4
= 4
𝑢𝑢
delete(4, 𝑆𝑆)の場合
7
3 10
1 4
5
8
6
7
3 10
1
5
86
7
3 10
1 4
5
8
6
7 =
delete(7, 𝑆𝑆)の場合
𝑢𝑢
𝑣𝑣
8
3 10
1 4
5
8
6
7
3 10
1 4
5
8
6
3 <
= 3
𝑢𝑢
delete(3, 𝑆𝑆)の場合
𝑣𝑣
7
4 10
1
5
86
10
![Page 11: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/11.jpg)
二分探索木に対する操作の時間計算量
𝑛𝑛要素の二分探索木に対する各操作の計算時間は,
𝑥𝑥 ∈ 𝑆𝑆の場合,𝑥𝑥を要素としてもつ節点の深さ※に比例する
𝑥𝑥 ∉ 𝑆𝑆の場合,insert(𝑥𝑥, 𝑆𝑆)を行うことによってできる 𝑥𝑥を要素としてもつ節点の深さ−1 に比例する
最悪時間計算量はO(𝑛𝑛),平均時間計算量はO log𝑛𝑛
大きい順に格納
※ 𝑥𝑥が2つの子を持つ場合のdelete(𝑥𝑥, 𝑆𝑆)は,𝑥𝑥の右部分木の最小要素の節点 𝑣𝑣の深さにも比例
43
21
最悪な場合(木の深さ= 𝑛𝑛 − 1) 最良の場合(木の深さ= log𝑛𝑛 )
43
21
小さい順に格納
5
5
5
4
2
1 3
6
6
6
節点の深さの期待値はO log𝑛𝑛11
![Page 12: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/12.jpg)
深さの期待値がO log𝑛𝑛 である証明
(証明) 二分探索木の全ての節点がちょうど2つの子をもつように𝑛𝑛 + 1個の節点を加える.
もとの節点を内点,新しく加えた節点を外点と呼ぶ.
「外点の深さの平均」 ≥ 「内点の深さの平均」
であるから外点の深さの平均が O log𝑛𝑛 であることを示せばよい.
7
3 10
1 4
5
8
6
内点
外点
トーナメントの試合数を考えてみよう
0
1
2
3
4
5
節点の深さ=根からの路の長さ
12
![Page 13: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/13.jpg)
証明つづき
𝐷𝐷 𝑛𝑛 を外点の深さの平均とする.
最初に格納されるものが 𝑖𝑖番目の大きさである確率を 1/𝑛𝑛(等確率)とすれば,
𝐷𝐷 𝑛𝑛 =1𝑛𝑛�𝑖𝑖=1
𝑛𝑛𝑖𝑖 𝐷𝐷 𝑖𝑖 − 1 + 1 + (𝑛𝑛 − 𝑖𝑖 + 1)(𝐷𝐷 𝑛𝑛 − 𝑖𝑖 + 1)
𝑛𝑛 + 1
=2
𝑛𝑛 𝑛𝑛 + 1 �𝑖𝑖=1
𝑛𝑛
𝑖𝑖𝐷𝐷(𝑖𝑖 − 1) + 1
=2
𝑛𝑛 𝑛𝑛 + 12
𝑛𝑛 𝑛𝑛 − 1 �𝑖𝑖=1
𝑛𝑛−1
𝑖𝑖𝐷𝐷 𝑖𝑖 − 1 + 1𝑛𝑛 𝑛𝑛 − 1
2 −𝑛𝑛 𝑛𝑛 − 1
2 + 𝑛𝑛𝐷𝐷 𝑛𝑛 − 1 + 1
= 𝐷𝐷 𝑛𝑛 − 1 +2
𝑛𝑛 + 1
外点の数 = 内点の数+1
𝐷𝐷(𝑛𝑛 − 1)
内点が𝑖𝑖 − 1個
内点が𝑛𝑛 − 𝑖𝑖個
根の要素の大きさが 𝑖𝑖番目
𝐷𝐷 𝑖𝑖 − 1左側の総深さ 右側の総深さ
𝑖𝑖𝐷𝐷 𝑖𝑖 − 1 と 𝑛𝑛 − 𝑖𝑖 + 1 𝐷𝐷(𝑛𝑛 − 𝑖𝑖)は𝑖𝑖に対して対称なので
𝑖𝑖 = 𝑛𝑛のところを抽出して分解
13
![Page 14: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/14.jpg)
証明つづき
よって,𝐷𝐷(𝑛𝑛) − 𝐷𝐷(𝑛𝑛 − 1) = 2/(𝑛𝑛 + 1) となる.
𝐷𝐷 0 = 0 であるから,
𝐷𝐷 𝑛𝑛 = 2 �𝑖𝑖=2
𝑛𝑛+11𝑖𝑖≤ 2�
1
𝑛𝑛+1 1𝑥𝑥
𝑑𝑑𝑥𝑥 = 2 log𝑒𝑒(𝑛𝑛 + 1)
したがって 𝐷𝐷 𝑛𝑛 = O log𝑛𝑛 である. 【証明終わり】
調和級数の部分和
…1/2
1
1/3
1 2 𝑛𝑛 𝑛𝑛 + 1
𝑦𝑦 =1𝑥𝑥
𝑦𝑦
𝑥𝑥 14
![Page 15: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/15.jpg)
平衡探索木(balanced search tree)
各節点において,その子を根とする全ての部分木の高さがほぼ平衡している探索木
AVL木 どの節点においても,その左部分木と右部分木の高さの差が1以下である二分探索木AVLは提唱者(Adel’son-Vel’skii と Landis)の頭文字
2色木 二分探索木の各辺に次の条件を満たすように赤か黒の色を塗れるもの
1. 外点に接続する辺の色は黒
2. 根から外点までのどの路も赤い辺が連続しない
3. 根から外点までのどの路も含む黒い辺の数が同じ
B木 根と葉を除く各節点が𝑚𝑚/2個以上,𝑚𝑚個以下の子を持つ探索木(𝑚𝑚は自然数)
2-3 木 𝑚𝑚 = 3 の場合のB木
1 ≥
15
![Page 16: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/16.jpg)
AVL木におけるinsert(𝑥𝑥, 𝑆𝑆)操作
𝑇𝑇𝐿𝐿𝑢𝑢を節点𝑢𝑢の左部分木,𝑇𝑇𝑅𝑅𝑢𝑢を𝑢𝑢の右部分木,𝑠𝑠(𝑢𝑢)を𝑢𝑢の状態とする
挿入前の𝑠𝑠(𝑢𝑢)は次のように設定されている.
𝑆𝑆 𝑢𝑢 = �𝐿𝐿, 𝑇𝑇𝐿𝐿𝑢𝑢の高さ > 𝑇𝑇𝑅𝑅𝑢𝑢の高さの場合,
𝐸𝐸, 𝑇𝑇𝐿𝐿𝑢𝑢の高さ = 𝑇𝑇𝑅𝑅𝑢𝑢の高さの場合,
𝑅𝑅, 𝑇𝑇𝐿𝐿𝑢𝑢の高さ < 𝑇𝑇𝑅𝑅𝑢𝑢の高さの場合.
Step 1: 二分木と同様に挿入を行う.挿入した節点の親を 𝑢𝑢 とする
Step 2: 𝑠𝑠 𝑢𝑢 ≠ 𝐸𝐸 となるまで次のことを繰り返す
1. 𝑠𝑠 𝑢𝑢 を,挿入して高くなった方(𝐿𝐿か𝑅𝑅)に更新2. 𝑢𝑢 ← 𝑢𝑢の親
Step 3: if 𝑠𝑠 𝑢𝑢 = 𝑅𝑅かつ 𝑇𝑇𝐿𝐿𝑢𝑢 が高くなった or𝑠𝑠 𝑢𝑢 = 𝐿𝐿かつ 𝑇𝑇𝑅𝑅𝑢𝑢 が高くなった then𝑠𝑠 𝑢𝑢 ← 𝐸𝐸 として停止
else 回転して停止
左が高い
右が高い
挿入したことによる祖先のラベル変更
ここの処理は定数時間
16
![Page 17: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/17.jpg)
AVL木における挿入(左)に伴う回転操作
𝑢𝑢
𝑣𝑣
𝐸𝐸 ⇒ 𝐿𝐿𝐿𝐿 𝑢𝑢
𝑣𝑣𝐸𝐸
𝐸𝐸
回転
11
1
回転
1
𝑢𝑢
𝑤𝑤
𝐸𝐸 ⇒ 𝐿𝐿
𝑅𝑅 𝑣𝑣𝐿𝐿
𝑢𝑢
𝑤𝑤𝐸𝐸
𝐸𝐸 𝑣𝑣 𝑅𝑅
𝑠𝑠 𝑣𝑣 = 𝐿𝐿の場合
𝑠𝑠 𝑣𝑣 = 𝑅𝑅の場合
𝑇𝑇𝐿𝐿𝑤𝑤 < 𝑇𝑇𝑅𝑅𝑤𝑤 の場合もある 17
![Page 18: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/18.jpg)
AVL木におけるdelete(𝑥𝑥, 𝑆𝑆)操作
Step 1: 一般の二分木の同じように削除を行う.
削除した最も下の節点の親を 𝑢𝑢 とする.
Step 2: 𝑠𝑠 𝑢𝑢 = 𝐸𝐸 となるまで次のことを繰り返す.
1. if 𝑠𝑠 𝑢𝑢 = 𝐿𝐿かつ 𝑇𝑇𝐿𝐿𝑢𝑢 が低くなった or𝑠𝑠 𝑢𝑢 = 𝑅𝑅かつ 𝑇𝑇𝑅𝑅𝑢𝑢 が低くなった then𝑠𝑠(𝑢𝑢) ← 𝐸𝐸
else if 𝑠𝑠 𝑢𝑢 = 𝑅𝑅かつ 𝑇𝑇𝐿𝐿𝑢𝑢 が低くなった or𝑠𝑠 𝑢𝑢 = 𝐿𝐿かつ 𝑇𝑇𝑅𝑅𝑢𝑢 が低くなった then
(1) 回転
(2) 𝑠𝑠 𝑢𝑢 ≠ 𝐸𝐸ならば停止
2. 𝑢𝑢 ← 𝑢𝑢の親
Step 3: 𝑠𝑠 𝑢𝑢 を,低くなった方の逆(𝐿𝐿 or 𝑅𝑅)に更新
高々,木の高さの回数しか繰り返さない
回転処理は定数時間
18
![Page 19: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/19.jpg)
11
11
AVL木における削除(左)に伴う回転操作
𝑣𝑣
𝑢𝑢 𝑅𝑅
𝐸𝐸𝑣𝑣
𝑢𝑢𝑅𝑅
𝐿𝐿
高さ変化せず
𝑣𝑣
𝑢𝑢 𝑅𝑅
𝑅𝑅𝑣𝑣
𝑢𝑢𝐸𝐸
𝐸𝐸
高さ 1 減少
回転
回転
𝑠𝑠 𝑣𝑣 = 𝐸𝐸の場合
𝑠𝑠 𝑣𝑣 = 𝑅𝑅の場合
19
![Page 20: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/20.jpg)
AVL木における削除(左)に伴う回転操作
高さ1減少
𝑠𝑠 𝑣𝑣 = 𝐿𝐿の場合
𝑢𝑢
𝑤𝑤
𝐿𝐿𝑅𝑅
𝑣𝑣𝐸𝐸
11
𝑢𝑢
𝑤𝑤𝐸𝐸
𝐸𝐸
𝑣𝑣𝐸𝐸回転
20
![Page 21: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/21.jpg)
AVL木に対する操作の時間計算量
𝑛𝑛要素のAVL木に対する各操作の計算時間は,
最悪時間計算量はO(log𝑛𝑛),平均時間計算量はO log𝑛𝑛
AVL木のどの操作も,木の高さに比例した時間しかかからない.𝑛𝑛節点のAVL木の高さは O log𝑛𝑛
21
![Page 22: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/22.jpg)
AVL木の高さが O log𝑛𝑛 の証明
𝑓𝑓 ℎ を高さ ℎのAVL木の最小節点数とすれば,以下の漸化式が成り立つ.
𝑓𝑓(ℎ) = 𝑓𝑓(ℎ − 1) + 𝑓𝑓(ℎ − 2) + 1,𝑓𝑓(0) = 1,𝑓𝑓(1) = 2.𝐹𝐹 ℎ = 𝑓𝑓 ℎ + 1 とすれば,
𝐹𝐹 ℎ = 𝐹𝐹 ℎ − 1 + 𝐹𝐹 ℎ − 2 , 𝐹𝐹(0) = 2,𝐹𝐹(1) = 3.すると,𝐹𝐹 ℎ はフィボナッチ数列なので,
𝐹𝐹(ℎ) =𝜑𝜑1ℎ+3 − 𝜑𝜑2ℎ+3
5
ただし,𝜑𝜑1 = 1+ 52
, 𝜑𝜑2 = 1− 52
である.
高さ ℎの節点数最小のAVL木
高さ ℎ − 1 の節点数最小のAVL木
高さ ℎ − 2 の節点数最小のAVL木
根だけの木
22
![Page 23: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/23.jpg)
証明つづき
高さ ℎのAVL木の節点数を 𝑛𝑛 とすれば,𝑓𝑓(ℎ) はその下限なので,
𝑓𝑓 ℎ ≤ 𝑛𝑛である.よって,
𝜑𝜑1ℎ+3 − 𝜑𝜑2ℎ+3 ≤ 5 𝑛𝑛 + 1 .
𝜑𝜑2 < 1 なので,
𝜑𝜑1ℎ+3 − 1 ≤ 5 𝑛𝑛 + 1 .
よって,
ℎ ≤log 5 𝑛𝑛 + 1 + 1
log𝜑𝜑1− 3.
したがって,ℎ = 𝑂𝑂 log𝑛𝑛 である. 【証明終わり】
∵𝜑𝜑1ℎ+3 − 𝜑𝜑2ℎ+3
5= 𝑓𝑓 ℎ + 1
23
![Page 24: 講義「アルゴリズムとデータ構造」kida/lecture/alg2019-06.pdf探索のためのデータ構造:辞書 (dictionary) 次の3つの基本操作を伴う集合 𝑆𝑆を辞書(dictionary)という](https://reader034.vdocuments.net/reader034/viewer/2022050315/5f77d8df11120473243be28b/html5/thumbnails/24.jpg)
今日のまとめ
探索のためのデータ構造である辞書の実現方法を学んだ
整列済み配列による辞書の実現
memberは最悪時間計算量O(log𝑛𝑛)insertとdeleteはO(𝑛𝑛)かかる
二分探索木による辞書の実現
最悪時間計算量O 𝑛𝑛平均時間計算量O log𝑛𝑛
平衡探索木による辞書の実現
最悪時計算量も平均時間計算量もO log𝑛𝑛
24