140 likes | 317 Views
アルゴリズムとデータ構造 補足資料 13-1 「 2 分探索木」. 横浜国立大学 理工 学部 数物・電子情報系学科 富井尚志. 静的データ / 動的データ. 静的データ あらかじめ、データの全量がわかっている データの追加・削除がない →静的データ構造: 配列 動的データ データ の追加・削除がある したがって 、データの全量もわからない(増減する) →動的データ構造 順 アクセスだけ: 線形リスト 効率的 な探索、局所的なデータ管理: 木構造. 動的データ構造. 線形リスト 次の項目への「ポインタ」 木構造 複数の「部分木」を持つ
E N D
アルゴリズムとデータ構造補足資料13-1「2分探索木」アルゴリズムとデータ構造補足資料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件のデータ 解 解の候補 解の候補 解の候補 log2 n 解の候補 解の候補 ! 2分探索: O( log n ) (オーダ ろぐエヌ) のアルゴリズム
2分探索の特徴 • 探索の計算量(比較回数)はO(log n) • あらかじめソートされている必要がある • ソートの計算量:クイックソート O( n log n ) • ソートの計算量の方が重い → 最初に一度だけソートする。探索は頻繁に行う。(固定的な名簿の探索に使える) • つまり、静的データ(データの増減、追加・削除が起こらない)を対象にしている。
動的データを木構造を使って2分探索可能にする方法: 探索木(search tree) • 任意の節点Nについて、以下の条件を満たしている木 • (Nの)左部分木中のすべての節点のキーが、Nのキーよりも小さい • (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 8は左?右? → 右 2 9 1 6 8 10 4 3 5 キーの値が小さい キーの値が大きい
探索木(search tree) 8を探せ! root 根から始めて 7 8は左?右? → 左 2 9 1 6 8 10 4 3 5 キーの値が小さい キーの値が大きい
探索木(search tree) 8を探せ! root 根から始めて 7 2 9 1 6 8 10 4 発見! O(log n) 3 5 キーの値が小さい キーの値が大きい
探索木のオペレータ • 探索木を探索する • 探索木に節点を追加(挿入)する • 探索木から節点を削除する