6月21日 オンライン分まとめ中
探索(Searching)
探索処理(サーチング、サーチ、search)
・有限のデータの中から、目的のデータを探す事
例:配列を走査して、目的の値を見つける
int iarray[10]={2, 5, 8, 1, 4, 7, 3, 6, 9, 0};
0 1 2 3 4 5 6 7 8 9 ← index
キー値6を探せ! indexの0からたどっていき、index7でキー値6を見つけたよ。
探索結果 => iarray[7]が6に一致
- 著名な探索アルゴリズム
- 線形探索
- 二分探索
- ハッシュ法
性能(場合による)= 探索の速さ = 処理の少なさ ⇐ 繰り返し数と比較数
ハッシュ法 > 二分探索 > 線形探索
データ形式:
配列:
配列=>同じ型のデータが複数あり、名前とインデックスで表現されたもの (double a[5]; => a[0] ~a[4]がdouble型で用意される)
レコード:
(キー項目)| (キーに付属した情報)
商品番号 | 商品名 | 単価
A001 | ハンバーガー | 200
A003 | チーズバーガー | 260 <= レコード形式(固定幅データ)
A005 | エッグサンド | 240
A007 | アイスコーヒー | 120
… | … | …
表=テーブル(table)
「線形探索法」(逐次探索法:Linear Search Algorithm)
・データ列(レコード、配列など)を先頭から順番に一個ずつ逐次、キー値(探索値)と比較して、 見つかるまで走査する方法
例題6-1
レコード
index| CarNo | CarName
0 | 1003 | "MarkⅡ"
1 | 1012 | "Chaser"
2 | 1053 | "Mr2"
3 | 1031 | "Rx-7"
4 | 1021 | "Minica"
5 | 1075 | "Legacy"
・CarNoで探して、車種名を出力する探索
変数として必要なもの → indexをたどるためのカウンタ変数 i
探すCarNoを保存しておく変数(キー値=探索キー)var=1053
例)探索キーが1053で入力されたとき(P92) 結果"Mr2"と表示される
if(var == 1053 && i<=最大データ数)
{
carNameを出力
}
・番兵法
if(var == 1024 && i<=最大データ数(N)) //アルゴリズムとしては、比較回数は2
{
carNameを出力
}
・データが見つからなかったときは最大データ数Nx2回の比較が必要
・最大データ数を1増やしておいて、最後に番兵を配置することで、比較回数を減らす作戦(ストラテジー)
index| CarNo | CarName
0 | 1003 | "MarkⅡ"
1 | 1012 | "Chaser"
2 | 1053 | "Mr2"
3 | 1024 | "Rx-7"
4 | 1021 | "Minica"
5 | 1075 | "Legacy"
… | … | …
N | XXX | "XXXXX"
N+1 | 1024 | -------
=探索キー=番兵
while(var != 1024) //アルゴリズムとしては、比較回数は1
{
carNameを出力
i = i + 1;
}
if(i==N+1){
データが見つからなかったときの処理;
}else{
データが見つかった時の処理
}
//(N+1) x 1 Nは0以上
ーーーーーーーーーーー【複合条件】ーーーーーーーーーーーーーーーーーーーーーーーーーー
・比較の時に複数の条件を組み合わせて真偽値を決める
i>0
i<=10
・AND → 且つ 両方同時に成り立てば真 C/C++では && (shift+6)
例:xが0以上6未満(数学だと0≦x<6)
xが0以上 且つ 6未満 x >= 0 && x < 6
・OR → 又は どちらかが成り立てば真 C/C++では || (shift+\(バックスペースの左))
例:xが0以下 または、xが6より大きい(数学だと x ≦ 0, x > 6)
x <= 0 || x > 6
・Not → ~でない 条件を否定して真偽を逆転させる
not(x>=0) => x < 0と同値 C/C++では !(x >= 0) と書く
!(x >= 0) == (x < 0)
剰余の演算子 % → x%3 xを3で割ったあまりが結果
割り切れる=余りが0
変数int xにおいて、
・3で割り切れて、かつ5で割り切れる x%3==0 && x%5==0
・3で割り切れる、正ではない整数 !(x>=0) && x%3==0
x<0 && x%3==0
・3でも、5でも割り切れない !(x%3==0) && !(x%5==0)
このような複合条件が1度に書けるようになる。
ーーーーーーーーーーー【複合条件】ーーーーーーーーーーーーーーーーーーーーーーーーーーー
順次
選択(条件分岐)
繰り返し(継続条件、終了条件) 2%3==0 -> 2%3=2 -> 2==0? -> false 条件=真偽値です。
二分探索(バイナリーサーチ Binary Search)
・相手にしているデータ→整列済みデータ(昇順化、降順に並んだデータ) サンプルデータ[3, 5, 6, 8, 12, 34, 36, 37, 45, 49] 0 1 2 3 4 5 6 7 8 9 例) ・探索キー=37 サンプルデータ[3, 5, 6, 8, 12, 34, 36, 37, 45, 49] 0 1 2 3 4 5 6 7 8 9 サンプルデータ[ 34, 36, 37, 45, 49] 5 6 7 8 9 サンプルデータ[ 34, 36, 37, 45, 49] 5 6 7 8 9 サンプルデータ[ 34, 36, 37 ] 5 6 7 サンプルデータ[ 34, 36, 37 ] 5 6 7 サンプルデータ[ 37 ] 37発見 7