さがす——半分に切る

よみもの+手を動かす時間:およそ25分

辞書の引き方に、戻る

前のレッスンの最後に、種をまいておきました。もし数列が小さい順にそろっていたら——まんなかを1回見るだけで、半分を捨てられるはずです。

これは、最初のレッスンの辞書の引き方そのものです。「みどり」を引くとき、まんなかへんを開いて「は行か——行きすぎ」と戻る。あのとき捨てているのは1ページではなく、開いたページから手前ぜんぶです。

なぜそんな大胆なことができるのでしょうか。辞書のことばが五十音順にそろっているからです。「は行」のページより手前に「みどり」はない——見もしないで、そう言い切れます。

まんなかとくらべて、半分にしぼる

この引き方を、曖昧さのない手順にします。

  1. 残っている範囲の、まんなかの数と探し物をくらべる
  2. 同じなら、見つかり。終わり
  3. まんなかの数が探し物より小さければ、探し物は右側にしかいない——左半分をまとめて捨てる
  4. 大きければ、右半分をまとめて捨てる
  5. 範囲がなくなるまで、くりかえす

「半分に切ってさがす」——**二分探索(にぶんたんさく)**と呼びます。前のレッスンと同じ数列で、68をさがしてみてください。

半分に切ってさがすくらべた回数 1
381421304257687591

まんなかの 30 は 68 より小さい——右半分にしぼる

1 / 2 場面

2回で見つかりました。薄くなったセルが「捨てた範囲」です。1歩目でまんなかの30とくらべ、「68より小さい」のひとことで、30より左の4個は一度も見られないまま消えました。

探し物を打ちかえて、遊んでみてください。この数列では、どの数をさがしても4回を超えません。どこにもない数(たとえば50)でも4回で「ありません」と言い切れます——範囲がなくなったことが、そのまま「居場所がどこにもない」の証明になるからです。

並走させてみる

ほんとうに速いのか、前のレッスンの「まっすぐさがす」と同じ土俵で競わせましょう。探し物は91——まっすぐ派にとって最悪の、いちばん奥の数です。

まっすぐさがすくらべた回数 1
381421304257687591

1番目は 3。91 ではない

半分に切ってさがすくらべた回数 1
381421304257687591

まんなかの 30 は 91 より小さい——右半分にしぼる

1 / 10 場面

まっすぐ10回、半分切り4回。ただし探し物を3に打ちかえると、まっすぐ派が1回対3回で勝ちます——運くらべなら、負けることもあるのです。それでも前のレッスンで決めたとおり最悪の場合でくらべれば、10回対4回です。

倍にしても、1回増えるだけ

10個で最大4回なら、1,000個ではどうでしょう。まっすぐなら最悪1,000回のところ、半分切りは最大10回です。

からくりはこうです。1回くらべるたびに残りが半分になるので、数列の長さをにしても、最悪の回数は1回増えるだけ。1,000個が2,000個になっても、10回が11回になるだけです。

だから100万個でも、約20回で済みます。この信じがたいほど平らなかたちには**対数(log)**という名前がついています。いまは名前だけで十分です——かたちどうしの本格的な力くらべは、あとのレッスンでやります。

この速さは、何で買ったのか

ここまでが、よい知らせでした。ここからが、このレッスンでいちばん大事な話です。

二分探索の1歩は、「まんなかより左はぜんぶ小さい」という約束を当てにして、見もせずに半分を捨てています。では、約束が破れていたら——そろっていない数列にこの手順をかけたら、何が起きるでしょうか。実験室は、止めてくれません。

同じ10個の数をバラバラにならべた列で、42をさがしてみてください。42は、列の先頭に見えています。

半分に切ってさがすくらべた回数 1
428913572175146830

まんなかの 57 は 42 より大きい——左半分にしぼる

1 / 4 場面

3回くらべて、「42はありません」。手順が、嘘をつきました。1歩目で57とくらべて「42は左にいるはず」と右半分を捨てた——その判断が正しいのは、そろっている列の上だけです。

42は目の前の先頭にいたのに、手順は最後までそこを見ませんでした。さらにたちが悪いことに、嘘は毎回ではありません。同じ列で8をさがすと2回で正しく見つかります——切る方向が、たまたま当たっただけなのですが。

よりみち:人間は、まんなかを開かない

辞書で「みどり」を引くとき、あなたはたぶん後ろ寄りを開きます。「み」は五十音の終わりのほうだと知っているからです。この勘を手順にしたもの(補間探索)もあって、当たれば二分探索より速い——ただし「ことばの散らばり方」への信頼を、さらに上乗せして買う速さです。辞書のたとえは、ここから先は二分探索と少しずれます。

演習:嘘をつかれる数、つかれない数

実験室のバラバラの列はそのままで、探し物を打ちかえながら調べてください。

  1. 列の中にあるのに「ありません」と言われる数を、42のほかに1つ見つける
  2. 正しく見つかる数を1つ見つける
  3. その数が正しく見つかった理由を、場面を1歩ずつ見て説明する
ヒント1(考え方)

この列では、1歩目はかならず5番目の57とくらべます。「57より小さいから左へ」という判断が、結果として正しい方向になる数は、どれでしょう。

こたえ

あるのに「ありません」と言われるのは、42のほかに3・14・21・30・75・91。正しく見つかるのは8・57・68の3つだけです。57はまんなかにいるので1回で当たります。8は「57より小さい→左へ」と切った先のまんなかが、たまたま8だったから——方向の判断がぜんぶ偶然当たった、というだけです。10個中7個に嘘をつく手順が、3個ではちゃんと動く。数回ためして通ったくらいでは、この壊れ方は見つかりません。

このレッスンで分かったこと

  • 半分に切ってさがす(二分探索):まんなかとくらべて、半分をまとめて捨てる。10個なら最大4回
  • 長さを倍にしても、最悪の回数は1回増えるだけ。100万個でも約20回——このかたちの名前は対数
  • そろっていない列にかけると、あるものを「ありません」と言うことがある。しかも毎回ではない
  • 速さは、「そろっている」という前提への信頼で買っている