プログラム再構成に関する 特許申請について

データ構造と
アルゴリズム
第九回
知能情報学部
新田直也
二分探索アルゴリズム(復習)


表のデータ構造: 配列(キーでソート済み)
探索のアルゴリズム: 候補を半分づつ絞っていく…
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)