2分探索法
(イメージから憶える)
名のとおり,探索範囲を1/2,さらに1/2・・・と範囲を狭めながら探索する
方法です。

範囲を狭めていくために前提条件があります。
(過去問題から憶える)
データが昇順または降順に並んでいるときだけ正しく探索できる。
(H10 春 問16)
線形探索法と同じく,平均探索回数と最大探索回数を問われる問題がよく出題さ
れる。logが苦手な人は,まず結果だけを憶えた方が賢明です。
(クレバー方式から憶える)
| 2分探索法の平均探索回数とくれば データがN件の場合→log2N回 |
| 2分探索法の最大探索回数とくれば データがN件の場合→log2N+1回 |
(過去問題から憶える)
配列に昇順に整列されたデータn個格納されている。探索したい値を2分探索法
で探索する場合のおよその比較回数は,log2nである。
(H11 春 問30)
また,次のように憶えておくと理解しやすい。
2^k ≦ N < 2^(k+1)
↑ ↑
平均探索回数 最大探索回数
(注)2^kは,2のk乗を表す。
(問題)
10,000件のデータがある。2分探索法で探索するときの最大探索回数は何
回か。
ここで憶えておきたいテクニック。
電卓をもって,2×2×・・・・。何回目で10,000をこえるか。
14回目。これが最大探索回数です。
(イメージから憶える)
検索するデータ 変数 X
データ 配列 A(1)〜A(5)
探索範囲は,A(1)〜A(5)。

探索範囲を1/2に狭めるために,中央を求めます。
(1+5)÷2=3 よって,A(3)。
xとA(3)を比較する。

20<30なので,次の探索範囲はA(1)〜A(2)。

探索範囲を1/2に狭めるために,中央を求めます。
(1+2)÷2=1(小数点以下四捨五入) よって,A(1)。
xとA(1)を比較する。

10<20なので,次の探索範囲はA(2)〜A(2)。

探索範囲を1/2に狭めるために,中央を求めます。
(2+2)÷2=2 よって,A(2)。
xとA(2)を比較する。

20=20なので,xは存在する。
イメージがとれたかな?
フローチャート
昇順に整列されたn個のデータが格納されている配列Aがある。
流れ図は,配列Aからデータxを2分探索法を用いて探し出す処理である。
ここで,除算の結果は小数点以下切捨てとする。 (H11 春 問29)

(注)流れ図中の丸数字と解説の( )と対応する。
(1)探索範囲の最小【lo】と最大【hi】をセットする。
(2)探索範囲の中央【k】を計算する。
(3)データ【x】と探索範囲の中央のデータ【A(k)】を比較する。
比較して
=の時 → xは存在する。
<の時 → データ【x】が中央データ【A(k)】より大きい
(4)次の探索範囲の再セットをする。
探索範囲の最小【lo】は,探索範囲の中央【k】の次(+1)をセットする。
探索範囲の最大【hi】は,そのまま。
>の時 → データ【x】が中央データ【A(k)】より小さい
(5)次の探索範囲の再セットをする。
探索範囲の最小【lo】は,そのまま。
探索範囲の最大【hi】は,探索範囲の中央【k】の前(−1)をセットする。
(6)
≦の時 → まだ探索範囲を狭められる。
>の時 → もう探索範囲を狭められない。xは存在しない。
理解できない人は,再度イメージを見直そう。
H11 秋 問12
(注)ブラウザの戻るボタンをご利用下さい!