探索

探索

探索(英: search)とは、特定の制約条件を満たす物を見つけ出す行動のことである。

探索アルゴリズム

探索アルゴリズムとは、大まかに言えば、問題を入力として、考えられるいくつもの解を評価した後、解を返すアルゴリズムである。

まず解くべき問題を状態(英: state)と状態変化(行動、英: action)に分ける。 最初に与えられる状態を初期状態(英: initial state)といい、目的とする状態は最終状態(ゴール、英: final state, goal)と呼ばれる。 初期状態から最終状態に至る、状態及び状態変化の並びが解である。 将棋ならば、盤面の駒の配置と指し手の持ち駒が状態であり、交互に駒を動かすことが状態変化に当たる。

問題を解く類として研究されているアルゴリズムの多くは探索アルゴリズムである。ある問題の考えられるあらゆる解の集合を探索空間と呼ぶ。力まかせ探索や素朴な(知識を用いない)探索アルゴリズムは、探索空間を探索する手法としては最も単純で直観的である。一方、知識を用いた探索アルゴリズムヒューリスティクスを使って探索空間の構造に関する知識を利用し、探索にかかる時間を削減しようとする。

知識を用いない探索

知識を用いない探索(英: uninformed search)アルゴリズムは、その問題の性質を考慮しない手法である。そのため汎用的に実装可能であり、抽象化のおかげで幅広い問題に同じ実装を適用可能である。問題は、探索空間が一般に非常に大きいため、問題が小さいものでもそれなりの時間がかかる点である。処理を高速化するため、知識を用いた探索だけを行う場合がある。

線形探索

線形探索は、配列の先頭から各要素が目的の値と等しいかどうかを順番に調べる。等しいものが見つかった時点でその位置を返し探索を終了する。末尾まで調べて目的の値が存在しなかった場合はそのことを示す特別な値を返す。アルゴリズムの効率は悪いが、線形探索はデータの並び方に関係なく適用することができる。

二分探索

二分探索やバイナリサーチとは、ソート済み配列に対する探索アルゴリズムの一つである。コンピュータで扱うデータは、多くの場合ある項目によって整列され管理されており、そのような場合はより効率的なアルゴリズムを適用することができる。二分探索は、データの大小関係を利用した高速な探索アルゴリズムである。

ソート済みのリストや配列に入ったデータ(同一の値はないものとする)に対する検索を行うにあたって、 中央の値を見て、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断して、片側には存在しないことを確かめながら検索していく。大小関係を用いるため、未ソートのリストや大小関係の定義されない要素を含むリストには二分探索を用いることはできない。

ハッシュ法

ハッシュ法は、ハッシュ関数と呼ばれる関数値によって、要素の格納場所を決定する。これはデータ構造の一種でもあり、ハッシュテーブルと呼ばれる表を用いるアルゴリズムである。要素のキーを引数とした関数を呼び出すだけでその位置を特定することができるので、データの種類によってはより高速なデータの検索が可能になる。

参考:探索 - Wikipedia