1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
コース一覧
アルゴリズム道場 カメ師範の十の巻
第四の巻 二分探索

アルゴリズム道場 カメ師範の十の巻

言語を問わず、考え方だけを問う演習専用コースです。解説はありません。巻物と完成条件だけを読み、白紙から自分で組み立てます。Python・JavaScript・TypeScript・Java のどれで解いても構いません。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。総和と最大から始まり、線形探索、整列、二分探索、再帰、スタックとキューを経て、最後は初見の疑似コードを読み解いて実装するところまで、10問でアルゴリズムの基礎を一巡します。1問15分から45分、全10問で約5時間です。いずれかの言語の入門を終えて「動くものは書けるが、考え方に自信がない」と感じている方に向いています。

1
初段
01. 第一の巻 総和と最大15分
02. 第二の巻 線形探索15分
03. 第三の巻 バブルソート20分
04. 第四の巻 二分探索25分
2
中段
01. 第五の巻 整列の途中経過25分
02. 第六の巻 再帰25分
03. 第七の巻 スタックを作れ30分
04. 第八の巻 キューを作れ30分
3
師範
01. 第九の巻 計算量を体感せよ35分
02. 免許皆伝 初見の巻物45分

第四の巻 二分探索

中段 / 目安 25分

四つめの巻物。師範は開く前に、こう前置きしました。「第二の巻で、なぜ比較回数まで数えさせたと思う。……布石よ」

巻物にはこうあります。「並んだ帳簿なら、真ん中から攻められる。low と high の二本の指で、範囲を半分ずつ潰せ。第二の巻と比較回数を比べてみよ」

第二の巻の帳簿は、実はもともと小さい順に並んでいました。並んでいる帳簿を先頭から1件ずつなぞるのは、五十音順の辞書を1ページ目からめくるのと同じです。真ん中を開けば、探している語が前半にあるか後半にあるかが一度で分かります。分かった時点で、もう半分は見なくてよくなります。

完成条件

小さい順に並んだ会員番号の配列と、探したい番号を受け取り、見つけた位置と比較回数を1つの文字列にして返す関数 binarySearch を作ってください。どの言語で解く場合も、関数名は binarySearch にしてください。

返す文字列の形は、第二の巻と同じです。位置は先頭を 0 とする番号です。

プレーンテキスト

位置 3 / 比較 4回
  • 最後まで見つからなかったときは、位置を -1 にします
  • 「位置」「/」「比較」「回」の前後の半角スペースまで一致させること
  • 配列は必ず小さい順に並んでおり、1つ以上の要素が入っています

数え方の約束

比較回数は、真ん中の1件を目当ての番号と照らし合わせた回数です。範囲を1回狭めるごとに 1 回増えます。等しいか、小さいか、大きいかを見るのは、まとめて 1 回と数えます。

比べてみよ

8件の帳簿から 1150 を探すと、第二の巻は 4 回、この巻は 1 回です。見つからない 1200 を探すと、第二の巻は 8 回、この巻は 3 回で「無い」と言い切れます。件数が増えるほど差は開き、1万件なら線形探索の1万回に対して、二分探索は14回で済みます。

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

二分探索でいちばん間違えやすいのは、範囲の狭め方です。真ん中を mid としたとき、次の範囲に mid 自身を含めてしまうと、範囲が狭まらず永遠に終わりません。

要件

  1. 関数名は binarySearch。どの言語で解く場合も同じ名前にすること
  2. low と high で範囲を持ち、真ん中と比べて範囲を半分に狭めること
  3. 真ん中と照らし合わせた回数を数えること
  4. 見つからなかったときは位置を -1 にすること
  5. 「位置 3 / 比較 1回」の形の文字列を1つ返すこと。印字ではなく return で返す

入出力例

binarySearch([1041,1078,1102,1150,1203,1266,1310,1355], 1150) → "位置 3 / 比較 1回" binarySearch([1041,1078,1102,1150,1203,1266,1310,1355], 1041) → "位置 0 / 比較 3回" binarySearch([1041,1078,1102,1150,1203,1266,1310,1355], 1355) → "位置 7 / 比較 4回" binarySearch([1041,1078,1102,1150,1203,1266,1310,1355], 1200) → "位置 -1 / 比較 3回" binarySearch([2001,2002], 2002) → "位置 1 / 比較 2回" binarySearch([777], 777) → "位置 0 / 比較 1回" binarySearch([777], 778) → "位置 -1 / 比較 1回"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 範囲の左端 low と右端 high を持ちます。真ん中を見て、目当てと同じなら終わり。真ん中のほうが小さければ答えは右半分にあるので left を動かし、大きければ左半分にあるので right を動かします。範囲が消えたら見つからなかったということです

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • 第五の巻 整列の途中経過

    選択ソートが3周を終えた時点の並びを答えます。1周で何が確定するかを追います。

  • 第九の巻 計算量を体感せよ

    同じ答えを出す2つのやり方で、比べた回数がどれだけ違うかを数えます。

  • 第三の巻 バブルソート

    隣同士を比べて入れ替える、古くから伝わる整列を自分で書きます。

  • 第二の巻 線形探索

    先頭から順に探し、見つけた位置と比べた回数を報告します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
  • 線形探索先頭から順に1つずつ照合する探索
  • 二分探索中央と比較して半分ずつ範囲を狭める探索
main.py
学習モード
エディタを読み込んでいます

メモ

第四の巻 二分探索

⌘S で保存