データ構造とアルゴリズム ( 第 7 回 )
静岡大学工学部 安藤和敏
2006.12.21
http://coconut.sys.eng.shizuoka.ac.jp/algo/06/
第 4 章データの探索
4.1
探索の定義と簡単な探索アルゴリズ ム
4.2 2
分探索法
4.3ハッシュ法
第 4 章データの探索
4.1
探索の定義と簡単な探索アルゴリズ ム
4.2 2
分探索法
4.3ハッシュ法
定義 4.1 (探索)
探索とは,入力として n 個のデータ d0, d1, ...
, dn-1 と値 x が与えられたときに,データ中 から x = di となる di をみつける操作である
.
探索する値がデータの中に存在しないときは,
“ データ中に存在しない”という出力を行う.
日常生活における探索の例
n 個のデータ d0, d1, ... , dn-1 :辞書に載っているすべての 単語
探索する値 x :調べたい単語
n 個のデータ d0, d1, ... , dn-1 :オークションに出品されて いるすべての商品名
探索する値 x :欲しい物の商品名 辞書
インターネット・オークション
簡単な探索アルゴリズム
以降では,与えられる n 個のデータ d0, d1, ... , dn-1 ,および,探索する値 x は,すべて正の整 数であると仮定する.
アルゴリズム 4.1 (線形探索)
入力: n 個のデータを格納する配列 D と探索す る値 x
i = 0;
while (i < n) { if (x == D[i]) {
D[i] を出力してアルゴリズムを終了 ;
} else { i = i + 1;
}
“x は存在しない”と出力 ;
}
アルゴリズム 4.1 の実行例
17 39 1
D 5
[0] [1] [2] [3] [4]
9 24 2 11
[5] [6] [7]
23 6 13 [8] [9] [10]
29 28 20 [11] [12][13]
33 [14][15]
15
23
アルゴリズム 4.1 の時間計算量
17 39 1
D 5
[0] [1] [2] [3] [4]
9 24 2 11
[5] [6] [7]
23 6 13 [8] [9] [10]
29 28 20 [11] [12][13]
33 [14][15]
15
最良時間計算量は O(1) 最悪時間計算量は O(n) 平均時間計算量は O(n)
第 4 章データの探索
4.1
探索の定義と簡単な探索アルゴリズ ム
4.2 2
分探索法
4.3ハッシュ法
2 分探索法
D[0] < D[1] < D[2] < ... < D[n-1].
入力データが昇順に(小さい順)に,配列 D に格納 されていると仮定する :
2 分探索法(1)
探索する値 x と配列の中央にあるデータと比較する.
D
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]
x と比較す
る
2 分探索法(2)
中央のデータと x が等しい場合,そのデータを出力して 探索を終了する.
D
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]
D[7] == x の場合
2 分探索法(2)
中央のデータが x より小さい場合, x は中央 のデータより左側にはないので,探索範囲を
D
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]
D[7] < x の場合
2 分探索法(3)
中央のデータが x より大きい場合, x は中央 のデータより右側にはないので,探索範囲を D[0] ~ D[6] に限定できる.
D
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12][13][14][15]
x < D[7] の場合
2 分探索法の実行例 (x=23)
1 2 5
D 9
[0] [1] [2] [3] [4]
6 11 13 15
[5] [6] [7]
17 20 23 [8] [9] [10]
24 28 29 [11] [12][13]
39 [14][15]
33 D[7] < 23
2 分探索法の実行例 (x=23)
1 2 5
D 9
[0] [1] [2] [3] [4]
6 11 13 15
[5] [6] [7]
17 20 23 [8] [9] [10]
24 28 29 [11] [12][13]
39 [14][15]
33 23 < D[11]
2 分探索法の実行例 (x=23)
1 2 5
D 9
[0] [1] [2] [3] [4]
6 11 13 15
[5] [6] [7]
17 20 23 [8] [9] [10]
24 28 29 [11] [12][13]
39 [14][15]
33 D[9] < 23
2 分探索法の実行例 (x=23)
1 2 5
D 9
[0] [1] [2] [3] [4]
6 11 13 15
[5] [6] [7]
17 20 23 [8] [9] [10]
24 28 29 [11] [12][13]
39 [14][15]
33 D[9] == 23
2 分探索法の実現(アルゴリズム 4.2 )
入力 : n 個の昇順データを格納する配列 D と探索する値 x
left = 0; right = n -1; mid = (left + right)/2;
while (left < right) {
if (D[mid] == x) { D[mid] を出力しアルゴリズムを終了 ; } else if (D[mid] < x) { left = mid + 1; }
else { right = mid -1; } mid = (left + right) /2;
}
アルゴリズム 1.3 の動き
1 回目
1 2 5
D 6 9 11 13 15 17 20 23 24 28 29 33 39
1 2 5
D 6 9 11 13 15 17 20 23 24 28 29 33 39
1 2 5
D 6 9 11 13 15 17 20 23 24 28 29 33 39
1 2 5
D 6 9 11 13 15 17 20 23 24 28 29 33 39
2 回目
3 回目
4 回目
2分探索法の時間計算量
調べる配列の大きさは, while の繰り返しごとに
,半分以下になる.したがって, k 回目の while の繰り返しを実行したときに,配列の大きさは
以下になる.
n
k
2 1
2分探索法の時間計算量(続き)
したがって,アルゴリズムが終了するまでの
while 文の繰返し回数 k は
を満たす.
2 1
1
n
k
n 2
k上式を書き換えると, であるから,
を得る.
したがって,最悪時間計算量は O(log n) である.
k
n
log
宿題
第 4 章の演習問題のできるところすべて.(提出 しなくてもよい.巻末の解答例を見て自己採点せ よ.)
お知らせ
2007 年 1 月 1 1日のこの時間帯に中間試験を行う
.詳細は Web ページ
http://coconut.sys.eng.shizuoka.ac.jp/algo/06/
に掲載予定です.