二分探索
二分探索は、ソートされた配列や関数から値を効率よく検索するためのアルゴリズムです。
アルゴリズムの詳細については、Wikipediaなどを参照してください。
配列に対する二分探索
ソースコードは次の通り。
上記コードでも記載していますが、配列(正確にはイテレータ)に対する二分探索にはSTLの
algorithmヘッダにあるlower_bound関数や
upper_bound関数も使えます。
二分探索は考え方は理解しやすいものの、値の範囲の狭め方などコーディングの際にバグを仕込む要因が非常に多いです。
そのため、C++の標準ライブラリの関数を使えるようにするといいでしょう。
配列以外に対する二分探索
プログラムにおいては、二分探索は配列に対して行う場合が多いです。
それに加えて、二分探索は単調な関数、つまり戻り値が引数の値について常に非減少(非増加)である関数にも適用することができます。
蛇足ですが、数値解析の分野では関数に対する二分探索を二分法と言います。
ソースコードは次の通りです。
意外なことに、関数に対する二分探索は幅広く応用することができます。
問題をうまく単調関数の形に変換することで、素直に解くと時間がかかりすぎる問題でも効率よく解けることがあります。
具体的な二分探索の適用方法については、プログラミングコンテストチャレンジブックの「値の検索だけじゃない!”二分探索”」や
最強最速アルゴリズマー養成講座:トップクラスだけが知る「このアルゴリズムがすごい」――「探索」基礎最速マスター (3/4)を見てください。
問題