スライド 1

アルゴリズムとデータ構造
補足資料13-1
「2分探索木」
横浜国立大学
理工学部
数物・電子情報系学科
富井尚志
静的データ / 動的データ
• 静的データ
– あらかじめ、データの全量がわかっている
– データの追加・削除がない
→静的データ構造:配列
• 動的データ
– データの追加・削除がある
– したがって、データの全量もわからない(増減する)
→動的データ構造
順アクセスだけ: 線形リスト
効率的な探索、局所的なデータ管理:木構造
動的データ構造
• 線形リスト
– 次の項目への「ポインタ」
• 木構造
– 複数の「部分木」を持つ
• 部分木が高々2個の木構造: 2分木 binary tree
• 動的データ構造共通のオペレータ
– 要素の生成(追加)
• 生成先 ポインタ変数= (struct 構造体名 *)malloc(sizeof(struct 構造体名))
– 要素の削除
• free(削除先へのポインタ)
おまけ
• 木構造 tree structure
– 複数の「部分木」を持つ
• 部分木が高々2個の木構造: 2分木 binary tree
– どの部分木にも、自分自身(の節)を含まない
– 親と子は1:nの関係
• 網構造 network structure
– 複数の「参照先」を持つ
– 参照先の参照先の…参照先に自分自身を含んでよい
静的データの探索:2分探索
解の方針:「区間」と「中央」を決めて、「中央」より「右」、「左」のどちらかに絞り込む
2分探索のイメージ: 解の候補を片側「半分」に絞り込む
解
n件のデータ
解の候補
解の候補
解の候補
解の候補
解の
候補
! ろぐエヌ) のアルゴリズム
2分探索: O( log n ) (オーダ
log2 n
2分探索の特徴
• 探索の計算量(比較回数)はO(log n)
• あらかじめソートされている必要がある
– ソートの計算量:クイックソート O( n log n )
– ソートの計算量の方が重い
→ 最初に一度だけソートする。探索は頻繁に行
う。(固定的な名簿の探索に使える)
• つまり、静的データ(データの増減、追加・削
除が起こらない)を対象にしている。
動的データを木構造を使って2分探索
可能にする方法: 探索木(search tree)
• 任意の節点Nについて、以下の条件を満たし
ている木
1. (Nの)左部分木中のすべての節点のキーが、N
のキーよりも小さい
2. (Nの)右部分木中のすべての節点のキーが、N
のキーよりも大きい
動的データを木構造を使って2分探索
可能にする方法: 探索木(search tree)
root
7
2
9
1
6
8
10
4
3
キーの値が小さい
5
キーの値が大きい
探索木のオペレータ
• 探索木を探索する
• 探索木に節点を追加(挿入)する
• 探索木から節点を削除する
探索木(search tree)
8を探せ!
root
7
2
9
1
6
8
10
4
3
キーの値が小さい
5
キーの値が大きい
探索木(search tree)
8を探せ!
root
根から始めて
7
2
8は左?右?
→ 右
1
6
8
9
10
4
3
キーの値が小さい
5
キーの値が大きい
探索木(search tree)
8を探せ!
root
根から始めて
7
2
8は左?右?
→ 左
1
6
8
9
10
4
3
キーの値が小さい
5
キーの値が大きい
探索木(search tree)
8を探せ!
root
根から始めて
7
2
9
1
6
8
10
4
発見! O(log n)
3
キーの値が小さい
5
キーの値が大きい
探索木のオペレータ
• 探索木を探索する
• 探索木に節点を追加(挿入)する
• 探索木から節点を削除する