データ構造と アルゴリズム 第九回 知能情報学部 新田直也 二分探索アルゴリズム(復習) 表のデータ構造: 配列(キーでソート済み) 探索のアルゴリズム: 候補を半分づつ絞っていく… key key key 1 1 1 3 3 3 4 4 4 8 8 8 13 13 14 14 middle → 14 18 18 18 20 middle → 20 21 21 21 25 25 25 middle → 13 < 14 (key) > 14 (key) 20 二分探索の登録(復習) 登録のアルゴリズム: データは常にソートされている必要がある. →挿入位置を探す必要. →挿入位置の後ろのデータをずらす必要. 挿入位置は二分探索で可能. int add_binary(int key, int data) { O(log n) int pos; pos = データを挿入すべき位置; 配列中のpos以降の要素を1つづつ後ろにずらす; O(n) table[pos].key = key; table[pos].data = data; O(1) } 線形探索法と二分探索法の比較 (復習) 登録 探索 線形探索法 O(1) O(n) 二分探索法 O(n) O(log n) 二分探索の高速化 登録が遅い原因 データをずらすのに時間がかかっている. 線形リストを使えないか? struct Record { int key; int data; struct Record *next; }; 簡単には高速化できない 線形リストではmiddleの位置を探すのに時間がかかる. (双方向リストでも同様) low middle … high … 二分探索から二分探索木へ 二部探索ではリストの中央を辿っていければよい. middle 1 3 4 8 13 14 18 20 21 25 二分探索から二分探索木へ 二部探索ではリストの中央を辿っていければよい. middle 13 3 1 3 20 middle 4 8 13 14 18 20 21 25 二分探索から二分探索木へ 二分木を使って二分探索ができる(二分探索木). 13 3 1 20 4 14 8 21 18 25 二分探索木の性質 節xのkeyは,節xの左部分木に含まれるkeyより大きい. 節xのkeyは,節xの右部分木に含まれるkeyより小さい. 13 3 1 20 4 14 8 21 18 25 二分探索木による探索(1) 二分探索と同様. 14 (key)? 13 14 (key)< 3 1 <14 (key) 4 14 8 20 =14 (key) 18 21 25 二分探索木による探索(2) struct BinarySearchTree { int key; int data; struct BinarySearchTree *left; struct BinarySearchTree *right; }; int search(struct BinarySearchTree *r, int key) { while (r != NULL) { if (r->key == key) return r->data; else if (r->key > key) r = r->left; else r = r->right; } return -1; } 二分探索木への登録(1) 以下の木に19を登録したい場合は? 4を登録したい場合は? 13 3 20 6 1 4 14 8 21 18 25 19 二分探索木への登録(2) 登録位置は探索と同じアルゴリズムで見つけれる. 4 (key)< 3 4 <19 (key) 19 (key)< <4 (key) 1 4 (key)< 13 6 14 8 20 <19 (key) 18 21 <19 (key) 19 25 二分探索木からの削除(1) 以下の木から18を削除したい場合は? 13を削除したい場合は? 13 3 1 20 6 14 8 21 18 25 二分探索木からの削除(2) 1. 子供の数によって場合分けする. 子供がいない場合: 6 6 8 →そのまま削除. 二分探索木からの削除(3) 2. 子供が1人の場合: 3 1 3 6 1 8 →詰める. 8 二分探索木からの削除(4) 3. 子供が2人の場合: 13 3 1 20 6 14 8 21 18 →13の位置に来ていいのは,「8」か「14」. 25 二分探索木からの削除(5) 3. 子供が2人の場合(続き): 13 3 1 20 6 14 8 21 18 25 →右部分木の最小値か左部分木の最大値を持っ てくればよい. 二分探索木からの削除(6) 右部分木の最小値の探し方. 13 3 1 20 6 14 8 →左に行けるところまで行く. 21 18 25 二分探索木からの削除(7) 右部分木の最小値の探し方. →左に行けるところまで行く. 二分探索木からの削除(8) 最小値を移動した後の処理. →子供が1つの場合の削除と同様. 二分探索木の時間計算量 探索アルゴリズムの時間計算量 4 1 1 2 6 2 3 5 7 3 4 →最良の場合(完全二分木) O(log n) 5 6 →最悪の場合 O(n) 7 時間計算量のまとめ 時間計算量のまとめ 登録 探索 削除 線形探索法 (最悪・平均) O(1) O(n) O(n) 二分探索法 (最悪・平均) O(n) O(log n) O(n) 二分木探索 (最悪) O(n) O(n) O(n) 二分木探索 (平均) O(log n) O(log n) O(log n)
© Copyright 2024 ExpyDoc