探索法など

◆ 線形探索法

 線形探索法とは、n個あるデータからmというデータを見つけたい時、データ郡の中を先頭から順番に探索していく方法の事です。
配列のデータが順に格納されていない場合など、この方法でしか  ですが、試験では意味を聞かれる事はなく、何回データを比較したか、また平均何回データを探索するかが出てきます。

 よく出る過去問題で、n個の昇順に並んだデータがあり、このデータをm個のデータ毎のブロックに分割し、 各ブロックの最後尾のデータだけを線形探索することによって、目的のデータのブロックを探し出す。 次に、該当ブロックを線形探索を行い目的のデータを探し出す。この時の平均比較回数はいくつか? (nはmの倍数であり、該当データは必ず存在する。)

 問題では下の図の様に、データを分割すると書いてます。

m個 m個 ・・・ m個
n個


 探索はブロック単位と、ブロックの中で個別という2種類の方法で行われます。
 なのでブロック単位とブロックの中で個別、2つの平均を出さないといけません。
 まずはブロック単位。nはmの倍数なので、全てのブロックはm個あると考えて良いです。 そして平均回数は全探索回数/2で良いので、ブロック単位は 全ブロック数/2 となります。
 よって全ブロック数は n/m なので、n/2m がブロック単位の平均回数となります。

 次に、ブロックの中で個別の平均探索回数を求めます。
 どのブロックであるかは前の探索で見つかっているという前提で良いと思うので、 ここはそのまま ブロックの中のデータ個数/2、よって m/2 で良いと思います。


 最後にこの2つを加算したのが総平均探索回数となります。よって

 n/2m + m/2

 となります。


◆ 2分木探索法

 データが2分木の規則になって並んでいるのが条件です。 2分木の説明は、情報構造のページで説明したと思います。 右の図の様に、左の子 < 親 < 右の子 と言う規則性があります。 これを利用して、root から順に検索したい値を比較し、小なら左の子へ、大なら右の子へと検索して、要素が見つかるか最後の子まで比較処理を繰り返します。

 補足ですが2分木探索法は、データが順に整列された配列に対して高速に検索処理が可能です。 (過去問題にも出題されています)
 以下の様な配列があったとします。

1 2 3 4 5 6 7 8

 例として「2」を探索したいとすると、2分木探索の基本は root から探索する。 つまり2分木の root は中間辺りのデータが来るので、配列の真ん中辺りから比較処理をします。 ここでは「5」を root としたら、「2」は小さいので左の子にあると判断します。 また同じように値の中間を取って比較処理を繰り返す事によって、目的の要素への探索を行います。 全ての配列を比較する線形探索法の半分ぐらいの比較処理で済むというわけです。


◆ ハッシュ探索法

 ハッシュ探索法は、データがハッシュ法(別ページで記述)によって格納された配列が対象になります。 検索したいキー値をハッシュ関数に渡し、取得したハッシュ値をそのまま配列の格納位置としてデータを持ってきます。
 ただし、ハッシュ値は衝突をすると言う事を忘れてはいけません。なので格納位置が分かっても、それが正しいデータなのか比較処理が必要です。 もし違っていた場合は、衝突した時の手順に従って順次に検索をしていかないといけません。 ここで言う手順は、実は特に決まっていません。(開発する人が自由に決めていいのです。) ハッシュ法の箇所では+αの位置に格納していくと記述しました。 その場合で言うと、ハッシュ値+αの位置を順次検索して比較する処理を繰り返します。
 下は「EEEEEE」のデータを検索しようとして、ハッシュ値が 1 だった場合の例です。(αは 3 とします)

配列
0
1AAAA← ハッシュ値が1と出たがデータが違う。ので+3の位置に検索しよう。
2BBCCDD
3ABCD
4EEEEEE← 比較結果正しいデータだったので取得
5


TOPページに戻る