1. 中央の要素
  2. 先頭の要素
  3. 末尾の要素
  4. 見つからない
  5. 要素 1 個 (見つかる)
  6. 要素 1 個 (見つからない)
コース一覧
コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
二分探索 (反復版)

コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ソート、探索、再帰などのアルゴリズムに加え、OS (プロセス、メモリ、ファイルシステム)、ネットワーク (TCP/IP、HTTP、DNS、CDN)、データベースまで、Web エンジニアに必要な CS の基礎を一本で学べる総合コースです。エンジニア転職を目指す学習者や、CS 出身でない現役エンジニアを対象としています。約 34 時間 (1 日 30 分 × 68 日) で 135 レッスンを修了でき、修了後は技術選定やシステム設計の議論に自信を持って参加できるようになります。

1
再帰の基礎
01. 階乗(再帰)5分
02. フィボナッチ数(再帰)5分
03. 累乗(再帰)5分
04. 配列の合計(再帰)5分
05. 桁数を数える(再帰)5分
06. 文字列を逆順(再帰)5分
07. ユークリッドの互除法(GCD)5分
08. 第1章まとめクイズ — 再帰の基礎5分
2
第2章 探索
01. 線形探索で位置を返す5分
02. 二分探索 (反復版)5分
03. 二分探索 (再帰版)5分
04. lower_bound (最初に >= target の位置)5分
05. ピーク要素検索5分
06. 回転ソート配列での探索5分
07. 第2章まとめクイズ5分
3
ソート
01. バブルソート実装5分
02. 選択ソート5分
03. 挿入ソート5分
04. マージソート5分
05. クイックソート5分
06. カウントソート5分
07. 比較関数つきソート5分
08. 第3章まとめクイズ5分
4
配列 / 文字列の応用
01. 双方向ポインタで和 = K5分
02. スライド窓の最大和5分
03. 回文判定5分
04. 重複なし最長部分文字列5分
05. 大きな数の文字列乗算5分
06. アナグラムグルーピング5分
07. 第4章まとめクイズ — 配列 / 文字列の応用5分
5
クラスと OOP
01. 長方形クラス(面積と周長)5分
02. スタッククラス(push と pop)5分
03. キュークラス(enqueue と dequeue)5分
04. 単方向リンクリスト5分
05. 二分探索木 (BST) への挿入5分
06. カウンタクラス(機能合成)5分
07. 第 5 章クイズ — クラスと OOP5分
6
動的計画法 (基礎)
01. メモ化フィボナッチ5分
02. DP配列でフィボナッチ5分
03. 階段の登り方5分
04. コイン両替最小枚数5分
05. 0/1 ナップサック問題5分
06. 最長共通部分列 (LCS)5分
07. 第6章まとめクイズ5分
7
総合演習
01. ソート済み 2 配列のマージ5分
02. 配列の k 回転5分
03. カッコの妥当性5分
04. ローマ数字を整数に5分
05. 整数をローマ数字に5分
06. 雨水を溜める5分
07. 最終総まとめクイズ5分
8
[OS] Section 1. OS とは
01. コンピューターとOSの役割15分
02. OSの歴史(バッチ→マルチタスク→マルチユーザー)15分
03. カーネルとユーザーランド15分
04. システムコールの仕組み15分
05. Linux / macOS / Windows のアーキ比較15分
9
[OS] Section 2. プロセスとスレッド
01. プロセスとは15分
02. スレッドとプロセスの違い15分
03. コンテキストスイッチ15分
04. スケジューラとアルゴリズム15分
05. プロセス間通信(IPC)15分
10
[OS] Section 3. メモリ管理
01. メモリ階層(レジスタ→キャッシュ→RAM→ディスク)15分
02. 仮想メモリ15分
03. ページングとスワップ15分
04. mmap とメモリマップトファイル15分
05. ガベージコレクション概要15分
11
[OS] Section 4. ファイルシステム
01. ファイルシステムとは15分
02. i-node とディレクトリ15分
03. ext4 / APFS / NTFS の違い15分
04. ジャーナリングと耐障害性15分
05. パーミッションと所有者15分
12
[OS] Section 5. 同期と並行性
01. レースコンディション15分
02. Mutex と Semaphore15分
03. デッドロック15分
04. 非同期と並行15分
05. イベントループと epoll15分
13
[ネットワーク] ネットワークの全体像
01. ネットワークとは8分
02. OSI 7階層モデル10分
03. TCP/IP 4階層モデル9分
04. パケットとフレーム9分
05. ルーター・スイッチ・ハブ9分
14
[ネットワーク] IP とルーティング
01. IPアドレス (IPv4 / IPv6)10分
02. サブネットマスクと CIDR11分
03. NAT とプライベートIP9分
04. ルーティングと経路選択10分
05. ファイアウォール基礎9分
15
[ネットワーク] TCP / UDP
01. TCP と UDP の違い9分
02. 3-way ハンドシェイク9分
03. 輻輳制御と再送10分
04. UDP の用途 (DNS / 動画 / ゲーム)8分
05. ポート番号と well-known port9分
16
[ネットワーク] HTTP / HTTPS
01. HTTP の基本10分
02. HTTP メソッド9分
03. HTTPS と TLS ハンドシェイク10分
04. HTTP/2 と HTTP/3 (QUIC)10分
05. REST API の設計原則10分
17
[ネットワーク] DNS とドメイン
01. DNS とは8分
02. レコードタイプ10分
03. 名前解決の流れ10分
04. DNS キャッシュと TTL9分
05. CDN の仕組みと Anycast10分
18
[ネットワーク] 応用
01. ロードバランサ (L4 / L7)10分
02. プロキシとリバースプロキシ9分
03. WebSocket とリアルタイム通信9分
04. gRPC と HTTP/2 利用10分
19
[データベース] データベースの基礎
01. データベースとは8分
02. RDB と NoSQL の違い8分
03. データベースの歴史8分
04. エンティティ関係モデル (ER)8分
05. 主キー・外部キー・候補キー8分
20
[データベース] 正規化
01. 正規化とは何か8分
02. 第1正規形8分
03. 第2正規形8分
04. 第3正規形8分
05. 非正規化のトレードオフ8分
21
[データベース] インデックスと B-tree
01. インデックスの役割8分
02. B-tree の仕組み8分
03. B+tree(実際の DB 実装)8分
04. ハッシュインデックス8分
05. カバリングインデックス8分
22
[データベース] トランザクションと ACID
01. トランザクションとは8分
02. ACID 特性8分
03. 分離レベル8分
04. MVCC(マルチバージョン同時実行制御)8分
05. デッドロックと回避8分
23
[データベース] クエリ最適化
01. クエリプランナの役割8分
02. EXPLAIN の読み方8分
03. Nested Loop / Hash / Merge Join8分
04. インデックスチューニング8分
05. 統計情報とカーディナリティ8分
24
[データベース] スケーリング
01. レプリケーション8分
02. シャーディング8分
03. CAP 定理8分
04. 結果整合性8分
05. NewSQL と分散 SQL8分

二分探索 (反復版)

並び替え済みの配列から値を探します。前回のように先頭から順に見ていくと、100 万件なら最悪 100 万回です。今回は「毎回半分を捨てる」という 1 つの考え方だけで、これを 20 回まで減らします。

100 万件を 1 つずつ見ると、100 万回

順に見ていく方法は、目当ての値が末尾にあると全部を見ることになります。件数が増えれば、そのぶん素直に時間も増えます。

紙の辞書で algorithm を引くとき、1 ページ目から順にめくる人はいません。真ん中あたりを開いて、目的の語がそれより前か後ろかを見て、片側をまるごと無視します。二分探索はこれをそのままコードにしたものです。

半分を捨てると、20 回で終わる

真ん中を 1 か所見るだけで、残りの半分は「見なくてよい」と分かります。これを繰り返すと、候補はこう減っていきます。

プレーンテキスト

1000000 -> 500000 -> 250000 -> 125000 -> ... -> 2 -> 1

1 回の比較で候補が半分になるので、100 万件は 20 回で 1 件まで絞れます。10 億件でも 30 回です。件数が 1000 倍になっても、回数は 10 回しか増えません。これが O(log n) の増え方です。

大事なのは、半分の要素を調べているのではない、というところです。真ん中の 1 件を見ただけで、一度も見ていない残り半分をまとめて候補から外しています。速さの正体はここにあります。

順に見る方法との差は、件数が増えるほど広がります。100 件なら 100 回と 7 回でそれほど困りませんが、100 万件では 100 万回と 20 回です。同じ「探す」でも、比べものにならない差になります。

並んでいないと、半分を捨てられない

半分を捨てられるのは、「真ん中より前には、真ん中以下の値しか無い」と言い切れるからです。この言い切りは、配列が昇順に並んでいることだけを根拠にしています。

Python

arr = [3, 7, 1, 9, 4] # 並んでいない

この配列で 9 を探すと、真ん中は 1 です。9 は 1 より大きいので右半分に進みますが、9 は左寄りにいるので見つかりません。しかもエラーにはならず、静かに「無い」と答えます。この間違いが厄介なのは、動いてしまうところです。

二分探索を書く前に、その配列が本当に並んでいるかを確かめてください。並んでいないなら、先に並び替えるか、順に見ていく方法を選びます。

候補が空になったら、無い

探す範囲は毎回狭まっていき、いつか 1 件になり、それも違えば 0 件になります。範囲が空になった時点で、配列のどこにも無いと確定します。

範囲をどう持つか、狭めるときに端を 1 つずらすかどうか。ここが二分探索でいちばん間違えやすい部分です。真ん中は違うと分かったのに、その真ん中を次の範囲に残したままにすると、範囲が縮まらず終わらなくなります。

要素が 1 個だけの配列、目当ての値が先頭にある場合、末尾にある場合、そもそも無い場合。この 4 つを紙の上で追ってから書き始めると、書き直しが減ります。特に要素が 1 個の場合は、範囲の持ち方を間違えているとすぐに表面化するので、真っ先に試す価値があります。

要件

  1. while ループ (反復) で実装する
  2. 計算量は O(log n) になっていること
  3. 見つからない場合は -1 を返す

入出力例

binarySearchIter([1,3,5,7,9,11], 7) → 3 binarySearchIter([1,3,5,7], 1) → 0 binarySearchIter([2,4,6,8], 8) → 3 binarySearchIter([1,3,5,7], 4) → -1 binarySearchIter([5], 5) → 0 binarySearchIter([5], 3) → -1

ヒント

low と high の 2 つのポインタを使って区間を表現する

mid = low + (high - low) / 2 とするとオーバーフロー安全

ループ条件は low <= high。等しいときも処理することを忘れずに

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 二分探索 (再帰版)

    二分探索を再帰関数で実装します。区間 [low, high] を引数で渡しながら半分ずつに分割していく方式です。

  • lower_bound (最初に >= target の位置)

    ソート済み配列で target 以上の値が最初に現れる index を返す lower_bound を二分探索で実装します。

  • ピーク要素検索

    両隣より大きい要素 (ピーク) の index を二分探索で O(log n) で見つけます。

  • 回転ソート配列での探索

    昇順ソートされた配列がある位置で回転している配列に対し、target の index を O(log n) で探します。

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

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

  • 配列サイズ固定の同型データの集まり
  • 二分探索中央と比較して半分ずつ範囲を狭める探索
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 反復色やフォントを繰り返して秩序を生む
  • 計算量入力サイズに対する処理時間の伸び方
main.py
学習モード
エディタを読み込んでいます

メモ

二分探索 (反復版)

⌘S で保存