高校情報Ⅰ 探索アルゴリズム(線形探索・二分探索)(5か月目第1週)

Pythonでインフォマティクス

まなびの目標🎯
・探索アルゴリズムの基本的な考え方を理解する。
・線形探索の仕組みと、Pythonでの書き方を学ぶ。
・二分探索の仕組みと、Pythonでの書き方を学ぶ。
・それぞれのアルゴリズムの長所・短所を理解し、使い分けを考える。
・確認テストで学びを復習!




1. 探索アルゴリズムとは

たくさんのデータの中から、目的のデータを見つけ出す手順のことを探索アルゴリズムと言います💡
例えば、
・辞書から特定の単語を探す
・たくさんの本が並んだ本棚から読みたい一冊を探す
・音楽アプリのプレイリストからお気に入りの曲を探す
といった、日常の探しものも、無意識に何かしらのアルゴリズム(手順)に沿って行っています。

今回は、探索アルゴリズムの基本である線形探索二分探索について学びます。

2. 線形探索

2.1 線形探索とは

線形探索(せんけいたんさく)は、リスト(配列)の先頭から順番に、目的のデータかどうかを探し出す方法です。

2.2 Pythonで線形探索

Pythonを例に、数字のリスト numbers の中から、探したい数字 target を見つけるプログラムを紹介します。

# Pythonの例:
numbers = [4, 8, 1, 9, 5, 2, 7] # 数字のリスト
target = 5 # 探したい数字

found = False # 見つかったかどうかの旗(最初はFalse:見つかっていない)

# リストの要素を一つずつ取り出して、i に代入
for i in numbers:
    print(i, "をチェック...")  # どの数字をチェックしているか表示
    if i == target:  # もし探している数字(target)と一致したら
        print(target, "を見つけました!")
        found = True  # 旗をTrue(見つけた)にする
        break  # ループを抜ける

# forループがすべて終わった後に実行される
if not found:  # ループが終わっても旗がFalseのままなら
    print(target, "は見つかりませんでした。")
# 出力結果
4 をチェック...
8 をチェック...
1 をチェック...
9 をチェック...
5 をチェック...
5 を見つけました!

このように、リストの先頭から順番に target である 5 と一致するかを調べていますね!

以前 for文(後からでてくるwhile文)、if文について紹介していますので、確認したい方は下記のサイトをご覧いただければと思います。

Pythonで「繰り返す」プログラムを作ろう!for文・while文・break・continue(情報Ⅰプログラミング③)
繰り返しの処理ってなに?⇒繰り返しとは、同じ処理を何回も行うことです!■目次 1. for文:決まった回数の繰り返し 2. while文:条件が続く限り繰り返す 3. break:条件を満たしたら途中で抜ける 4. continue:一部だ...
Pythonで「判断できる」プログラムを作ろう!条件分岐, if文(情報Ⅰプログラミング②)
Pythonで「判断できる」プログラムを作ろう!!判断できる、、たとえば、「80点以上なら合格」「IDとパスワードが正しいならログインを許可」など、“もし~なら” という判断を、どうやってしているのでしょうか??「ある条件のときに、特定の動...

ちなみに、探したい5がない場合は…

# Pythonの例:

# targetの数字がない場合
numbers_a = [4, 8, 1, 9, 2, 7] # 数字のリスト(5無し)
target = 5 # 探したい数字

found = False # 見つかったかどうかの旗(最初はFalse:見つかっていない)

# リストの要素を一つずつ取り出して、i に代入
for i in numbers:
    print(i, "をチェック...")  # どの数字をチェックしているか表示
    if i == target:  # もし探している数字(target)と一致したら
        print(target, "を見つけました!")
        found = True  # 旗をTrue(見つけた)にする
        break  # ループを抜ける

# forループがすべて終わった後に実行される
if not found:  # ループが終わっても旗がFalseのままなら
    print(target, "は見つかりませんでした。")
# 出力結果
4 をチェック...
8 をチェック...
1 をチェック...
9 をチェック...
2 をチェック...
7 をチェック...
5 は見つかりませんでした。

全部チェックして、なかった場合はそのままbreakで抜けて、見つからなかった場合のif not foundの指示を実行して、終了します!

2.3 線形探索の長所と短所

■長所
・アルゴリズムがシンプルで分かりやすい!
・データが整列(ソート)されていなくても使える。
■短所
・データの数が多いと、探すのに時間がかかる場合がある。(探したいデータが一番最後にある、そもそも無い、と、全てのデータを確認しないとだめなため)

3. 二分探索

3.1 二分探索とは

二分探索(にぶんたんさく)は、高速の探索アルゴリズムです。
この方法を使う場合はデータがあらかじめ小さい順(または大きい順)に整列(ソート)されていることが条件になります💡

★手順
① 探索範囲の真ん中のデータを見る。
② 真ん中のデータが探したいデータでなければ、大小を比較する。
③ 探したいデータの方が大きければ後半に、小さければ前半に範囲を絞る。
④ ①~③を、データが見つかるか、探索範囲がなくなるまで繰り返す。

まず適当に真ん中あたりを開き、目的の単語がそのページより前にあるか後にあるかで、探す範囲を半分に絞り込んでいきますよね!

3.2 Pythonで二分探索

小さい順に整列済みのnumbers のリストでの二分探索をやってみます。

# Pythonの例:
小さい順に整列されたリスト
numbers = [10, 20, 30, 40, 50, 60, 70, 80, 90]
target = 70 # 探したい数字

left = 0 # 探索範囲の左端のインデックス(リストは1つめを0番目(インデックス0)と数える)
right = len(numbers) - 1 # 探索範囲の右端のインデックス(len()はリスト内の要素の個数)
found = False # 見つかったかどうかの旗

while left <= right:  # 探索範囲がある間、繰り返す
    mid = (left + right) // 2  # 探索範囲の真ん中のインデックスを計算(//は、小数点以下を切り捨てて、整数にする)
    print("チェック中:", numbers[mid])

    if numbers[mid] == target:  # 真ん中の値が探している数字だったら
        print(target, "をインデックス", mid, "で見つけました!")
        found = True
        break
    elif numbers[mid] < target:  # 真ん中の値より探している数字が大きい場合
        left = mid + 1  # 探索範囲を右半分に絞る
    else:  # 真ん中の値より探している数字が小さい場合
        right = mid - 1  # 探索範囲を左半分に絞る

# whileがすべて終わった後に実行される 
if not found:
    print(target, "は見つかりませんでした。")
# 出力結果
チェック中: 50 
チェック中: 70 
70 をインデックス 6 で見つけました!

最初に、10~90(インデックス0~8)の真ん中の 50 (インデックス4)を見て、探している 70 の方が大きいので後半の60~90(インデックス5~8)に絞った。
次に、60~90の真ん中 70 をみたら、探してる値だった。
この、60, 70, 80, 90(インデックス5~8)で要素が4つの真ん中は、mid = (left + right) // 2 のところが(5+8)//2になると、小数点以下切り捨て、ということで(5+8)÷2で6.5 ⇒6 ということで、インデックス6の70になって、探していた値が見つかった!ということです!

このように、どんどん範囲を狭めて効率的に探しています!

3.3 二分探索の長所と短所

■長所
・データ数が多くても、高速に探索できる。

■短所
・データがあらかじめ整列(ソート)されている必要がある。
・データの追加や削除が頻繁にあると、その都度整列し直す必要がある。

4. どっちが速い?線形探索 vs 二分探索

2つのアルゴリズムの速さは、データ量が増えるほど劇的に変わります。

仮に100万個のデータがあった場合…
線形探索: 運が悪いと100万回チェックする必要があります。
二分探索: 約20回(※)のチェックで探し出せます!

※2を何回かけたら100万になるか?を計算する式として log₂(1,000,000)  ≒ 19.93 ⇒20回

毎回半分に範囲を絞れる二分探索は効率が良いです。
ただ、これはデータが整列されているという前提があってこそ使用できる方法であり、状況に応じた適切なアルゴリズム選択が重要です!

5. まとめ

探索アルゴリズムは、大量のデータから目的のデータを見つけるための手順。
線形探索は、シンプルで未整列データにも使えるが、データが多いと遅い。
二分探索は、高速だが、データが整列済みである必要がある。
・問題の条件(データの状態、量など)に合わせて最適なアルゴリズムを選ぶことが大切!

6. 確認テスト

Q1. 線形探索の特徴として、正しいものはどれですか?

  • データが数字でないといけない
  • 整列されている必要はない
  • 整列されている必要がある

正解!正解!

不正解!不正解!

整列されている必要はない

ヒント:線形探索は、どんな状態のリストでも、端から順番に見ていく方法でした。

Q2. 100万件のような大量のデータの中から、できるだけ高速にデータを探したい場合、より適しているのはどちらですか?(データは整列済みとします)

  • 線形探索
  • 二分探索
  • どちらも同じ

正解!正解!

不正解!不正解!

二分探索

ヒント:効率よく探せるのはどちらだったでしょうか?

Q3. 二分探索において、最初にチェックするデータはリストのどの位置のデータですか?

  • リストの先頭のデータ
  • リストの真ん中のデータ
  • リストの末尾のデータ

正解!正解!

不正解!不正解!

リストの真ん中のデータ

ヒント:二分探索は、探す範囲を半分に絞り込んでいく手法です。

Q4. 二分探索を利用するための、最も重要な前提条件は何ですか?

  • データが整列されていること
  • データが文字列であること
  • データが100個以上あること

正解!正解!

不正解!不正解!

データが整列されていること

ヒント:この条件がないと、二分探索は正しく機能しません。

確認クイズは、いかがでしたでしょうか?今回の学習内容が、皆さんの情報活用能力を高める一助となれば幸いです。閲覧いただき、ありがとうございました!

※本記事 教科書該当範囲

教科書名 該当章
新編情報Ⅰ(東京書籍)
最新情報I(実教出版) 第6章 2節 3. 探索と整列のプログラム
高校情報ⅠPython(東京書籍) 第6章 34. 探索のプログラム

本サイトは、教科書をベースに構成しています。使える「情報Ⅰ」を目指し、毎週月曜日に新しい記事を発信予定です。

高校情報Ⅰ プログラミングの関数・モジュール・ライブラリ(Python)(4か月目第4週)
まなびの目標🎯・プログラミングに重要なコードの再利用について知る。・プログラミングにおける関数・モジュール・ライブラリを理解する。・Pythonを例に関数・モジュール・ライブラリを使ってみる。・確認テストで学びを復習!■目次1. はじめに2...
高校情報Ⅰ プログラミング言語, Pythonで制御構造・リスト(4か月目第3週)
まなびの目標🎯・コンピュータが理解できる機械語について理解する。・プログラミング言語の役割や種類について理解する。・基本となる3つの制御構造(順次・分岐・反復)、リスト(配列)をPythonを例に働きや記述方法を学ぶ。・確認テストで学びを復...
高校情報Ⅰ 時系列分析と回帰分析(4か月目第1週)
まなびの目標🎯・時間と共に変化する時系列データから、時系列分析を行って将来を予測してみよう!・2つの異なるデータの関係性(相関関係)を調べよう!・散布図と回帰直線を使って、データ間の関係を説明しよう!・相関関係と因果関係の重要な違いを理解し...

本記事に対し、お気づきの点ございましたらお問い合わせよりご連絡頂けますと幸いです。




コメント

タイトルとURLをコピーしました