AIUnlimited
🌳

AI基礎

🌱
AI Seeds(種)

ゼロから始める

🌿
AI Sprouts(芽)

基礎を築く

🌳
AI Branches(枝)

実践に活かす

🏕️
AI Canopy(樹冠)

深く学ぶ

🌲
AI Forest(森)

AIをマスターする

🔨

AIマスタリー

✏️
AI Sketch(スケッチ)

ゼロから始める

🪨
AI Chisel(鑿)

基礎を築く

⚒️
AI Craft(制作)

実践に活かす

💎
AI Polish(磨き上げ)

深く学ぶ

🏆
AI Masterpiece(傑作)

AIをマスターする

📘

AI実践

📖
オープンソースモデルを理解する

オープンソースモデルの基礎とリソース

🎯
問題からモデルタスクへ

ビジネス問題をモデルタスクに変換

⚡
最初のモデルを実行する

30分で最初の結果を見る

🔧
ファインチューニングと評価

モデルをファインチューニングし、パフォーマンスを評価

🚀
アプリケーションシステム

実際のAIアプリケーションを構築

🎨
生成AI

オープンソースAIGCモデルを探索

🤖
エージェント

エージェントフレームワークとMCPツールを学ぶ

📐
補足基礎

LLMの基礎と評価

🎓

Claude アカデミー

🤖
Claude 101

Learn AI basics with Claude

💻
Claude Code 101

Code with Claude as your pair programmer

🤝
Introduction to Claude Cowork

Collaborate with Claude on complex projects

⚙️
Claude Platform 101

Build apps with the Claude API

ラボ

7つの実験がロード済み
🧬ニューラルネットワークサンドボックス🤖AI か人間か?🥋プロンプトエンジニアリング道場🏁アルゴリズムレース🧠AIトリビアチャレンジ🏗️システム設計キャンバス
🎯模擬面接ラボへ入る→
🚀

キャリア発展

🚀
面接ローンチパッド

旅を始めよう

🌟
行動面接マスター

ソフトスキルをマスター

💻
技術面接

コーディング面接を突破

🤖
AI・ML面接

ML面接をマスター

🏆
オファーとその先

最高のオファーを獲得

始める
AIUnlimited

MITライセンス

沪ICP备18025655号-11

学ぶ

  • AI基礎
  • AI実践
  • Claude アカデミー
  • ラボ
  • キャリア発展

コミュニティ

  • 概要
  • よくある質問

サポート

  • footer.terms
  • footer.privacy
  • footer.contact
AI & エンジニアリング アカデミックス›✏️ AI Sketch(スケッチ)›レッスン›二分探索パターン
🔍
AI Sketch(スケッチ) • 中級⏱️ 17 分で読める

二分探索パターン

古典的な二分探索 - 簡単なレビュー

二分探索では、ステップごとに探索空間が半分になります。 n 要素のソートされた配列上で、O(log n) 時間でターゲットを見つけます。

def binary_search(nums, target):
    lo, hi = 0, len(nums) - 1
    while lo <= hi:
        mid = (lo + hi) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid] < target:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1

シンプルですが、二分探索の真の力は、ソートされた配列をはるかに超えています。

検索スペースのコンセプト

二分探索は、範囲にわたって単調条件がある場合には常に機能します。 「配列」は存在する必要さえありません。範囲 [lo, hi] と、ある境界で False から True (またはその逆) を反転する関数が必要です。

Search space:  [lo .................. hi]
Condition:      F  F  F  F  T  T  T  T
                          ^-- answer
🤯
二分探索は 1946 年に初めて公開されましたが、バグのない最初のバージョンが作成されたのは 1962 年でした - 16 年間オフバイワン エラーが発生しました!

答えの二分探索

配列を検索する代わりに、回答スペースを検索します。 「結果 X を達成できますか?」と尋ねます。 「はい」の場合は、より小さくしてみてください。いいえの場合は、より大きくしてみてください。

例: バナナを食べるココ

ココにはバナナがn山あり、あとh時間あります。彼女が時間内に食べ終わるように最小の食事速度を見つけてください。

def min_speed(piles, h):
    lo, hi = 1, max(piles)
    while lo < hi:
        mid = (lo + hi) // 2
        hours = sum((p + mid - 1) // mid for p in piles)
        if hours <= h:
            hi = mid      # speed works, try slower
        else:
            lo = mid + 1  # too slow, go faster
    return lo

回答スペースは [1, max(piles)] で、条件は単調です。速度が高いほど、常に時間が短くなります。

最小の食事速度の回答空間を狭める二分探索
答えの二分探索: 反復ごとに実行可能な速度範囲を狭めます。

回転ソートされた配列

いくつかのピボットで回転されたソートされた配列: [4, 5, 6, 7, 0, 1, 2]。半分は常に並べ替えられます。 mid と lo を比較してどちらの半分かを決定し、ターゲットがソートされた半分に該当するかどうかを確認します。

レッスン 7 / 100%完了
←ヒープと優先度キュー

ディスカッション

ログイン ディスカッションに参加

[4, 5, 6, 7, 0, 1, 2]
 L        M        R
Left half [4..7] is sorted.
Target 1 not in [4..7] → search right.
🧠クイックチェック

回転ソート配列 [3,4,5,1,2] では、mid=2 (値 5) の場合、どちらの半分がソートされますか?

最初と最後の出現

最初の出現を見つけるには、ターゲットに到達したら止まらず、hi = midを設定して左に検索し続けます。 最後については、lo = mid + 1を設定して右を検索します。

このペアの検索では、ターゲットの 数 も得られます: last - first + 1。

ピーク要素

隣接する両方の要素よりも大きい要素。ソートされていない配列でも二分探索は機能します。nums[mid] < nums[mid + 1]の場合、ピークは右側にあります。それ以外の場合は左側です。 O(log n)。

🤔
Think about it:配列がソートされていないにもかかわらず、二分探索でピーク検出が機能するのはなぜですか?ここでソート順を置き換えるプロパティは何ですか?

2D マトリックスでの検索

行が並べ替えられており、各行の最初の要素が前の要素の最後の要素より大きい場合、行列は m × n 要素の単一の並べ替えられた配列として扱われます。インデックス k を行 k // n、列 k % n にマップします。

ライブラリを使用しない平方根

x * x ≤ n の中で最大の整数 x を見つけます。検索スペース: [0, n]。答えに対する古典的な二分探索。

def sqrt(n):
    lo, hi = 0, n
    while lo <= hi:
        mid = (lo + hi) // 2
        if mid * mid <= n:
            lo = mid + 1
        else:
            hi = mid - 1
    return hi

「最大値を最小化する」パターン

「分割配列の最大合計」や「D 日以内に荷物を発送できる能力」などの問題では、最悪のケースを最小限に抑えることが求められます。答えは単調です。容量 C が機能する場合、C+1 も機能します。 C の二分探索。

🧠クイックチェック

「D 日で荷物を発送できる容量」の場合、二分探索の検索空間はどれくらいですか?

ユニバーサル テンプレート

lo, hi = min_possible, max_possible
while lo < hi:
    mid = (lo + hi) // 2
    if condition(mid):
        hi = mid        # mid works, try smaller
    else:
        lo = mid + 1    # mid fails, need larger
return lo

最初の True を求めるか 最後の True を求めるかに応じて、hi = mid 対 lo = mid を調整します。

🧠クイックチェック

O(n) の実現可能性チェックを伴うサイズ S の応答空間での二分探索の時間計算量はどれくらいですか?

🤔
Think about it:問題文で「可能な最小値」または「可能な最小値」というフレーズを見たとき、すぐに何を思い浮かべますか?

📚 続きを読む

  • NeetCode - 二分探索プレイリスト - 簡単な問題から難しい問題まで厳選した問題
  • 技術面接ハンドブック - 二分探索 - パターン、ヒント、落とし穴
  • LeetCode Binary Search 学習計画 - 進歩的な問題集セット]