本文へ移動
目次へ
たくさんのデータから、どうやってすばやく探すの?:内容をイメージした挿絵
コンピューター

たくさんのデータから、どうやってすばやく探すの?

数字カードを一枚ずつ見なくても、目当ての一枚を探せる? 真ん中を手がかりに、候補を半分ずつ減らす「二分探索」を試してみよう。

まず、ひとことで

順番に並んだデータなら、真ん中の値と比べて、探す範囲を半分ほどに絞れるよ。この手順をくり返すのが二分探索。並び順があるから、調べなくてよい場所を決められるんだ。

速いのは、機械だけのおかげ?

図書館で一冊の本を探すとき、すべての本を最初から読む必要はないよね。棚の並び方が分かれば、探す場所を絞れるよ。コンピューターの中でも、たくさんのデータから必要なものを見つける仕事があるんだ。データは、数字や文字など、記録された情報のことだよ。

コンピューターは速く働くけれど、やり方を工夫することも大切なんだ。同じ答えを探す場合でも、一つずつ確認する手順と、見なくてよい範囲を先に決める手順では、必要な確認の回数が違ってくるよ。

仕事を進めるための、はっきりした手順を「アルゴリズム」と呼ぶよ。難しそうな名前だけれど、何を比べ、次にどこへ進み、いつ終えるかを決める約束なんだ。今回は数字が小さい順に並んだカードから、一枚を探す仕組みを考えてみよう。

真ん中を見ると、半分を外せる

説明用に、3、8、12、17、23、31、46という七枚のカードを並べるよ。目当ては31。まず真ん中の17を見るんだ。31は17より大きいね。小さい順に並んでいるので、17より左にある3、8、12も、目当てではないと分かるよ。

17自身も違ったので、残る候補は23、31、46の三枚だよ。この残った範囲の真ん中を見ると31。これで見つかったね。実際に値を確認したカードは、17と31の二枚だけ。外した四枚を一枚ずつ確認する必要はなかったんだ。

このように、真ん中の値と比べて探す範囲を半分ほどに絞り、残った範囲で同じ手順をくり返す方法を「二分探索」と呼ぶよ。「二分」は、二つに分けるという意味なんだ。コンピューターの0と1の表し方とは、別の話だよ。

3、8、12、17、23、31、46の七枚から31を探す。最初に17を確認して左側と17を外し、残った23、31、46の真ん中の31で見つかる。
真ん中の一枚が、次の場所を教える

本文用に作った数字の例。黄色は今確認するカード、ミント色は残った候補、灰色はもう探さなくてよいカードだよ。

出典資料に基づきEggplanetが作成した模式図

番号の大きさより、並び順が大切

さっきの数字は、1、2、3と続く番号ではなかったね。8と12の間に9がなくても、小さい順なら二分探索はできるよ。必要なのは、値の間隔が同じことではなく、左から右へ小さくならないという並び方なんだ。

たとえば七枚が3、31、12、17、23、8、46の順だったらどうかな。真ん中の17より目当ての31が大きくても、31は左側にあるよ。この並びで左を調べないことにすると、見つけられるはずのカードを見落としてしまうね。

真ん中の一枚だけを見て、多くのカードについて判断できるのは、並び順という約束があるからなんだ。「どうして左側を外してよいの?」と聞かれたら、「見た数字より小さい値しかないと分かるから」と答えてみよう。手順と、その手順を使える条件はセットだよ。

枚数が増えると、違いが見える

一枚ずつ見る方法は「線形探索」と呼ばれるよ。並んでいないカードにも使えて、運がよければ一枚目で見つかるね。でも、目当てが最後にあれば、そこまで全部を見ることになるよ。七枚なら最大七枚、十五枚なら最大十五枚だね。

一方、七枚の二分探索では、真ん中を見て外れた後の候補は三枚、次に外れたら一枚になるよ。目当てがある場合は、最大三枚を確認すれば見つかるんだ。十五枚なら、候補は七枚、三枚、一枚と減るので、最大四枚の確認になるよ。

下の図は、目当てが一枚だけ含まれる、並べ終えたカードについての計算だよ。一回とは「一枚の値を見て、目当てより小さい・同じ・大きいのどれかを確かめること」。秒数を測った実験ではないし、いつも最大回数が必要という意味でもないんだ。

目当てが含まれる並べ終えたカードでの最大確認回数。7枚では線形探索7回・二分探索3回、15枚では15回・4回、31枚では31回・5回。
カードが増えても、確認は少しずつ

値の確認回数を数えた計算上の比較。目当ては一枚だけ含まれるとするよ。並べる作業や移動の時間、実際の秒数は含めていないよ。

出典資料に基づきEggplanetが作成した模式図

見つからないときにも、終わりがある

手順には、見つけたときだけでなく、見つからないときの終わり方も必要だよ。最初の七枚から20を探してみよう。17より大きいので、残るのは23、31、46。真ん中の31より小さいので、次の候補は23だけになるね。

23を確認すると、20より大きいよ。でも、残った範囲には23より左のカードはもうないんだ。候補が空になったところで「この並びの中に20はない」と終えられるよ。地球のどこにも20という数字がない、という話ではないね。調べた範囲をはっきりさせよう。

もし範囲を狭めず、何度も同じ真ん中を見ていたら、仕事は終わらないかもしれないよ。一回比べるごとに、確認済みの一枚と、目当てを含まない側を外す。候補が確実に減ることが、最後まで進むための大切な約束なんだ。

先に並べる手間も、忘れずに

二分探索を使うために、ばらばらのカードを順番に並べ直すなら、その作業にも時間がかかるよ。一度だけ探す小さな山なら、一枚ずつ見たほうが全体では早く済む場合もあるんだ。探す回数だけを比べて、準備の手間を消してしまわないようにしよう。

同じ並びから何度も探すなら、先に整理した手間を、くり返し使えるね。逆にカードをたびたび追加したり、数字を書き換えたりするなら、並び順を保つ仕事も必要になるよ。データの使われ方によって、ふさわしい準備と手順は変わるんだ。

さらに、真ん中のカードへすぐ手を伸ばせるかも大切だよ。順番に一枚ずつたどらないと真ん中へ行けない仕組みなら、値を比べる回数が少なくても、移動には手間がかかるね。コンピューターの実際の速さは、比較回数だけで全部決まるわけではないよ。

紙のカードで、探し方を競べよう

七枚の紙へ違う数字を書き、小さい順に机へ置こう。一人が探す数字を決め、もう一人はまず端から順に見て、確認した枚数を記録するよ。次は同じ並びと同じ目当てで、真ん中から探してみよう。カードを見たら、その一枚を指して一回と数えるんだ。

一つの目当てで終わらず、先頭の数字、最後の数字、真ん中の数字でも試してみよう。一度だけの勝敗だと、たまたま最初に見たカードが当たりだった影響が大きいよ。どんな場合に何回必要かを表にすると、二つの手順の特徴が見えてくるね。

候補が偶数枚になった場合は、真ん中の二枚のうち、左側を選ぶなどの約束を先に決めよう。カードは伏せてもよいけれど、並べた本人が順番を確認しておいてね。数字の見当だけで場所を選ばず、残った候補の位置から真ん中を決めるのが、この活動のポイントだよ。

どっとと考えよう:並び方が変わったら?

今度は、数字が大きい順に並んだカードを想像してみよう。真ん中の値が目当てより小さかったら、どちら側を残せばよいかな。これまでと同じ向きに進むと、必要な候補を外してしまうかもしれないね。何が同じで、どの約束を変える必要があるか考えてみよう。

答えは、大きい値が左側に集まっているので、この場合は左側を残す、だよ。真ん中と比べて候補を絞る考え方は同じだけれど、残す側は並び方に合わせる必要があるんだ。手順を丸暗記するより、なぜ候補を外せるのかを説明できると応用しやすいね。

検索という言葉で呼ばれる仕組みが、すべて二分探索というわけではないよ。ここで分かったのは、順序のあるデータを探す一つの方法なんだ。機械を速くするだけでなく、調べなくてよい場所を理由つきで減らす。そんな工夫も、コンピューターの科学の大切な仕事だよ。

ことばのメモ

アルゴリズム
何を確かめ、次に何をして、いつ終えるかを決めた、仕事を進める手順。
二分探索
順番に並んだデータの真ん中と比べ、候補を半分ほどへ絞ることをくり返す探し方。
線形探索
データを一つずつ確認していく探し方。順番に並んでいなくても使えるよ。
候補
まだ目当てかもしれないと考えているもの。比べた結果を使って数を減らしていくよ。

もとになった資料・もっと知りたい人へ

下記の資料をもとに、説明と考える問題を独自に構成しています。外部資料には英語のページもあります。どっとの画像は案内用のイラストで、観測写真や科学的な図ではありません。

分かりやすくするために、説明を短くしたり、たとえ話を使ったりしています。まちがいを見つけたらお問い合わせへお寄せください。制作方法は編集方針、いっしょに読むときのヒントは保護者・先生へで紹介しています。