先読み

先読みまたはルックアヘッド（）は、アルゴリズムにおいて未処理の入力の一部を先に参照し、現在の処理での判断に利用することで効率化する方法。
先読みと遅延評価.
先読みは、実際に必要になるまで計算を遅延させる遅延評価という技法と対照的である。どちらの技法も時間やメモリ消費量を節約する目的で使われる。先読みは、予め判断を正しく行うことで、後で無駄なバックトラッキングが発生しないようにする。ただし、そのために先読みのオーバーヘッドが若干かかることになる。遅延評価は即座に必要とされないアルゴリズム上の計算を後回しにすることで、時間とメモリ使用量を節約しようとする。遅延評価の応用例として、オペレーティングシステムでのデマンドページングや、コンパイラでの構文解析表の遅延作成がある。
何らかの探索が必要な場合、両方の技法が使われる。アルゴリズム上次に見るべき経路がわかっている場合、遅延評価を使って探索すべき経路をキューやスタックに保持する。次に見るべき経路がわかっていない場合、新たな経路が見るべき経路かどうかを判断するために先読みを使う。
コンパイラも両方の技法を使う。構文解析表を規則から作成する場合は遅延評価が行われ、入力を構文解析する場合には先読みが行われる。
探索問題における先読み.
人工知能では、先読みは組合せ最適化の重要な要素であり、問題を表すグラフをどれだけ深く探索すべきかを示すものと言える。コンピュータチェスやコンピュータ囲碁などでは問題を表すグラフの先読みを制限する必要がある。素朴な幅優先探索を行うと、最新のコンピュータでもすぐに全メモリを消費してしまう。そのために先読みに制限を加えることで、アルゴリズムにかかる時間を注意深く制御する。先読みの制限が緩められると、それに対して指数関数的に処理時間が延びる。
より洗練された探索技法としてアルファ・ベータ法などは、部分木全体を考慮から除外することができる。このような技法を使う場合、先読みは単に量的に制限されるのではなく、深さを制限したり、何らかの平均値を制限する形で制限される。
構文解析における先読み.
先読みは、コンパイラでの構文解析でも重要な概念である。構文解析器が次に適用すべき生成規則を決定する際に入力トークン列を何個か先読みする。
LL法、LR法、LALR法などの構文解析では、後に括弧つきで先読みするトークン数を記することが多い（LALR(1)など）。
多くのプログラミング言語は、限定的な先読み（1個が典型的）で構文解析できるよう設計されている。というのも先読みを制限した方が構文解析器が効率化されるためである。1990年、Terence Parr は博士論文でANTLRを作成し、この傾向に重大な変化をもたらした。ANTLRは、効率的な LL("k") 構文解析器を生成するパーサジェネレータであり、"k" として任意の固定値が可能である。
構文解析器は、各トークンを参照したときにとりうるアクションが限られている。
先読みには次の2つの利点がある。
例として、"1 + 2 * 3" という式を構文解析する場合を示す。この場合の生成規則（構文規則）は次の通り。
APLなどの一部の例外を除いて、一般に加算よりも乗算が優先順位が高い。従って、上記の例は (1 + (2*3)) と解釈するのが正しい。上記のRule4は生成規則ではなく、意味論的規則である点に注意されたい。これを生成規則として表すことも可能である。しかし、意味論的規則が全て生成規則に変換できるわけではない。
単純な先読みのない構文解析器は次のように動作する。
これによって生成される構文木とコードは、Rule4 が考慮されていないため正しくない。
先読みなしで正しく構文解析するには、次のような対処法がある。
先読みのある構文解析器では、次のように動作する。
これによって生成される構文木は正しく、先読みしない場合よりも効率的に得られる。以上の方式はLALR法に基づいている。
ウェブ高速化ソフトにおける先読み.
ウェブ閲覧高速化ソフトにおいては、見ているページ内のハイパーリンクが示す先をあらかじめ読み込んでおくこと。