2分探索木

2分探索
データ検索
• 検索:
– 与えれたキー(探索キー)と等しいキーを、あるデータ集合
の中から探す操作
• データの保持状態で検索処理の効率は変わるか?
– データがでたらめの順番で格納されている状態
– データが予めソートされて格納されている状態
• 2つの状態では検索処理の効率の差はどの程度?
– 単語がでたらめな順で並んでいる辞書での検索
– 単語が辞書式順で並んでいる辞書での検索
2分探索法
10を検索
left right
left
1
3
4
7
right
10 11 14 18
mid mid mid
10を発見
2分探索法
5を検索
left
left right
left
1
3
4
right
7
10 11 14 18
mid mid mid
探索失敗
2分探索木
5
3
13
2
8
14
10
2
3
5
8
10
13
14
2分探索木
8を探索
8
5
3
2
13
8
8を発見
14
10
2分探索木
7を探索
7
5
3
13
2
8
14
10
探索失敗
検索時間は木の高さに比例
O(log n)
バランスの良い木
O(n)
バランスの悪い木
挿入(2分探索木)
7を挿入
7
5
3
13
2
8
7
14
10
検索時間の期待値(2分探索木)
全ての順列を考える
1,2,3,4,5
…
…
3,2,4,1,5
1
0 2
1 3
2 4
3 5
4
計 10
3
0
…
2
4
1
1
…
1
5
2
2
計6
Dn = (各計の合計/ n!) = (「深さの合計」の平均)
Tn = (Dn÷n) = 「深さの平均」の平均
検索時間の期待値(2分探索木)
全ての順列を考える
1,2,3,4,5
…
?,?,?,?,?
…
3,2,4,1,5
…
1
0 2
1 3
2 4
3 5
4
計 10
0 3
…
?
…
12
41
21
計?
…
5 2
計6
Dn = (各計の合計/ n!) = (「深さの合計」の平均)は何に対応?
Tn = (Dn÷n) = 「深さの平均」の平均は何に対応?
検索時間の期待値(2分探索木)
根がkの場合を考える
k
• k-1頂点の木
• 各頂点の深さ
の平均=Tk-1
• n-k頂点の木
• 各頂点の深さ
の平均=Tn-k
根がkの場合の深さの総和
= (k-1)(1+ Tk-1) + 0 +
(n-k)(1+ Tn-k)
= (n-1) + (k-1)Tk-1
+ (n-k)Tn-k
= (n-1) +Dk-1 + Dn-k
kは1~nまで動くのでそれの平均
Dn
= ∑1≦k≦n (n-1 +Dk-1 + Dn-k ) /n
= n-1 + (2/n)∑1≦k≦n-1 Dk
= 2(n+1) (Hn+1-2)+2 (演習問題5.6)
⇒ Tn = O(log n)
削除(内点の子を持たない場合)
4
6
10
削除(内点の子を1つ持つ場合)
9
5
2
削除(内点の子を2つ持つ場合)
2
6
10
4
9
8
7