二分探索で素早く探そう
並べ替えられたリストを半分ずつにしぼって探します。
必須
これまでの内容から、3問を復習しよう
前回までの内容から、毎回ランダムに3問が選ばれます。同じ復習用ファイルの中身を書き換え、1問ずつ予想・実行します。
lesson10_review.pyレッスン番号と使う場面が分かる名前にして、あとで探しやすくします。
- VS Code上部の「ファイル」をクリック
- 「新しいテキスト ファイル」をクリック
- Ctrl+S(Macは⌘+S)を押す
lesson10_review.pyと入力して「保存」を押す
ここを確認:画面上のタブ、または左側のファイル一覧にlesson10_review.pyと表示されたら準備完了です。
表示
print(3 + 4)表示される数は?
変数
x = 5
x = x + 2
print(x)最後のxは?
条件分岐
n = 8
if n > 5:
print("大")表示される文字は?
実際に自分のパソコンで行ってから、チェックを入れてください。
二分探索の「真ん中を見る→半分を捨てる」を説明し、コードの変化を追える。
- ✓並べ替えが必要な理由を言える
- ✓left・right・midの場所を追える
- ✓線形探索との違いが分かる
なぜ半分ずつ探すの?
- 前回のwhileとbreakを思い出す
- 日常の例と図で二分探索を知る
- 短いリストで真ん中を調べる
- Pythonで二分探索を実行する
- 調べた場所を紙に書いて追う
- 必須問題で自分で確かめる
国語辞典で「りんご」を探すとき、最初のページから1ページずつ見ません。真ん中を開き、もっと前か後ろかを考えます。二分探索も同じです。
この講座では:3つの変数が「残った範囲の左・右・中央」を表すと読めれば十分です。
まず紙の上で探そう
小さい順のリストから8を探します。最初の真ん中は6です。8は6より大きいため、左半分はもう調べません。
6を見た次に調べる側は?
Pythonで二分探索を動かそう
lesson10_step03.pyレッスン番号と使う場面が分かる名前にして、あとで探しやすくします。
- VS Code上部の「ファイル」をクリック
- 「新しいテキスト ファイル」をクリック
- Ctrl+S(Macは⌘+S)を押す
lesson10_step03.pyと入力して「保存」を押す
ここを確認:画面上のタブ、または左側のファイル一覧にlesson10_step03.pyと表示されたら準備完了です。
lesson10_step03.pyへ、見本コードを一文字ずつ入力する- まだ実行せず、結果を予想する
- 保存して、VS Code右上の▶を押す
- 下のターミナルと教材の結果を比べる
A = [2, 4, 6, 8, 10]
target = 8
left = 0
right = len(A) - 1
while left <= right:
mid = (left + right) // 2
print("調べた値", A[mid])
if A[mid] == target:
print("見つけた")
break
elif A[mid] < target:
left = mid + 1
else:
right = mid - 1『調べた値』はどの順に表示される?
先に自分のパソコンで実行しましょう。画面に出た結果を見てから、下のボタンを押します。
ここまで分かったか確認しよう
lesson10_step04.pyこの回の必須問題で使うファイルです。問題ごとに中身を書き換えます。
- VS Code上部の「ファイル」をクリック
- 「新しいテキスト ファイル」をクリック
- Ctrl+S(Macは⌘+S)を押す
lesson10_step04.pyと入力して「保存」を押す
ここを確認:画面上のタブ、または左側のファイル一覧にlesson10_step04.pyと表示されたら準備完了です。
lesson10_step04.pyを作る- 問題のコードを入力して保存・実行する
- 同じファイルを書き換えて次の問題へ進む
4を探す
見本のtargetを4へ変え、調べる値の順番を確認します。
見つからない場合
targetを7にして、最後まで動かします。
線形探索と比べる
10を探すとき、先頭から探す場合と二分探索の回数を比べます。
実際に自分のパソコンで行ってから、チェックを入れてください。
共通テスト型の問題を3問解こう
Pythonで動かした経験を思い出し、コードを上から読みます。まず自分で考え、困ったときだけボタンを開きましょう。
最初に調べる値
A = [2, 4, 6, 8, 10, 12, 14]
二分探索で12を探す最初に調べる値は?
次に残す範囲
A = [2, 4, 6, 8, 10]
target = 4
最初に6を調べた次に残す範囲は?
調べた回数
A = [1, 3, 5, 7, 9]
二分探索で9を探す
調べた値:5 → 7 → 9何回調べた?
できるだけ解いてみよう
全部終わらなくても大丈夫です。上から順番に挑戦しましょう。
- 1. [1,3,5,7,9]から7を探す
- 2. [2,4,6,8,10]から2を探す
- 3. 9がないことを確かめる
- 4. 並べ替えていないリストで使えない理由
- 5. leftの役割を説明する
- 6. rightの役割を説明する
- 7. midの計算を書く
- 8. targetが真ん中より大きい場合
- 9. targetが真ん中より小さい場合
- 10. 線形探索と二分探索を使い分ける