高橋  花子

高橋 花子

1658302080

Pythonでの二分探索–アルゴリズムのコーディング方法

私たちの日常生活の中で、私たちは常に情報を探したり、遭遇した問題の解決策を見つけようとしています。

ウェブ上の検索結果を調べるとき、私たちは私たちが役立つと思う最も関連性の高い記事やリソースを選びます。

私たちが常に答えを得ることができるとは限らないので、検索は私たちの生活のそのような部分です。また、プログラムをより効率的に実行し、データをより効果的に処理するのに役立つさまざまなアルゴリズムがあります。

検索アルゴリズムとは何ですか?

検索アルゴリズムは、任意のデータ構造からアイテムを取得するために機能します。入力として入力されたデータをデータベースに保存されている情報と比較し、結果を導き出します。例として、1,000の番号の連絡先リストで親友の番号を見つけることがあります。

検索アルゴリズムにはさまざまな種類があります。それらのいくつかは次のとおりです。

線形探索アルゴリズム

線形検索アルゴリズムは、すべての検索アルゴリズムの中で最も単純です。名前が示すように、それらは順番に動作します。

線形検索は、リスト内の要素を次々にチェックして、特定のキー値を見つけます。このキー値はリスト内の他の項目の中にあり、アルゴリズムはチェックを通過することによって位置を返します。

ダイクストラのアルゴリズム

ダイクストラの最短経路アルゴリズムは、より高度な検索で使用されます。ダイクストラのアルゴリズムは、2つのノード間の最短距離をマッピングします。これらのノードは多くの場合、ルートネットワークです。

このタイプの検索は、地図上でルートを検索する場合に便利です。可能な最短経路を見つけることに基づいたオプションを提供します。

二分探索アルゴリズム

二分探索アルゴリズムは、半区間探索とも呼ばれます。ソートされたリスト内のターゲット値の位置を返します。

これらのアルゴリズムは、「分割統治」手法を使用して値の位置を見つけます。

二分探索アルゴリズムと線形探索アルゴリズムは、単純な探索アルゴリズムの例です。

バイナリ検索では、検索しているキー値と比較する前に、リストの中央の要素が検出されます。ただし、線形検索では、要素はループしてキー値と比較することにより、リスト内で1つずつ取得されます。

違い-1

‌二分探索では、リストは2つの部分に分割され、中央の要素が取得されます。左側、中央の要素、および右側があります。

左側には中央の要素よりも小さい値が含まれ、右側には中央の要素よりも大きい値が含まれます。このメソッドは、ソートされたリストを使用して機能します。

ソートされたリストには、アイテムが特定の順序で配置されています。バイナリ検索で検索を効率的にするには、検索プロセスを満たすために、リスト内の値を正しい順序で配置する必要があります。リストの値が混在している場合は、検索を実行する前に、並べ替えアルゴリズムで並べ替える必要があります。

並べ替えアルゴリズム

並べ替えアルゴリズムは、並べ替えられていないリストを入力として受け入れ、要素が特定の順序(ほとんどの場合昇順)に配置されたリストを返します。

挿入ソート、クイックソート、バブルソート、マージソートなど、さまざまな種類のソートアルゴリズムがあります。

二分探索のしくみ–分割統治

二分探索アルゴリズムは、「分割統治」と呼ばれる手法を使用してそのタスクに取り組みます。マージソートアルゴリズムは、同じ手法を使用してリスト内のアイテムをソートします。

二分探索アルゴリズムでは、「分割統治」法は次のように機能します。

  • アルゴリズムは、リストを2つの部分に分割します。左側と右側で、中央の要素で区切られています。
  • 検索するアイテムの値を格納する変数を作成します
  • 真ん中の要素を選び出し、検索するアイテムと比較します
  • 比較した項目が等しい場合、プロセスは終了します
  • そうでない場合、中央の要素は検索しているアイテムよりも大きいか小さいかのどちらかです。中央の要素が大きい場合、アルゴリズムはリストを分割し、左側の要素を検索します。中央の要素が小さい場合は、リストを分割して、リストの右側にある要素を検索します。

このメソッドは、バイナリ検索プロセスで再帰または反復を使用して実装できます。

二分探索アルゴリズムのしくみ–ステップバイステップ

まず、検索を実行する前に、リストを並べ替える必要があります。

次に、検索する値を格納する変数を作成します。

次に、リストは2つの部分に分かれています。最初と最後のインデックスを合計して、リストの中央の要素のインデックスを見つけます。

中央の要素インデックスの計算値がfloat(3.45など)の場合、全体をインデックスとします。

次に、検索している値と中央の要素を比較します。

プロセス1--2-

二分探索のユースケース

条件1

真ん中の要素が検索対象の値と等しい場合、値が返される位置が返され、プロセスが終了します。

if middle element == to_search 
    return position of middle element 
*code ends* 

例として上の画像を使用すると:

中央の要素=23、ターゲット値/ to_search =23。2つの値を比較すると、両側で等しいことがわかります。23はリストのインデックス2に表示されます。これがコードの出力であり、プロセスは終了します。

条件2

中央の要素が「to_search」と等しくない場合は、次のシナリオを確認します。

シナリオ1:中央の要素が検索対象の値より大きい場合:

if middle element > to_search

  • 値が中央の要素よりも小さいため、検索は左側に移動します
  • 中央の要素の位置が1だけ左にシフトします
  • new_position = index(中央の要素)-1
  • 新しい検索が開始され、検索はその新しい位置で終了し、その前のすべての値を取得します。

例として上の画像を使用すると:

middle element = 23
to_search = 4
if 23 > 4 
  • 23未満のすべての数値がそこに格納されているため、左側に移動します。インデックス(23)= 2
  • new_position = index(23)-1 = 2-1 = 1
  • 検索はインデックス1で終了し、インデックス1の前に他のすべての値を取得します

左側

新しい中間要素(4)を目標値(4)と比較すると、それらが等しいことがわかります。したがって、検索は終了し、出力はリスト内の「4」の位置(インデックス0)になります。

シナリオ2:中央の要素が検索対象の値よりも小さい場合:

if middle element < to_search

  • 値が中央の要素より大きいため、検索は右側に移動します
  • 中央の要素の位置が1だけ右にシフトします
  • new_position = index(中央の要素)+ 1
  • 新しい検索は新しい位置で始まり、リストの最後のインデックスで終わります
  • すべての値は、新しい位置からリストの最後まで取得されます

例として最初の画像を使用します。

middle element = 23 
to_search = 32 
if 23 > 32 
  • 23より大きいすべての数値がそこに格納されているため、右側に移動します。index(23)= 2、
  • new_position = index(23)+ 1 = 2 + 1 = 3
  • 検索はインデックス3から始まり、インデックス3以降の他のすべての値を取得します

右側

真ん中の要素(32)を目標値(32)と比較すると、それらが等しいことがわかります。したがって、検索は終了し、出力はリスト内の「4」の位置(インデックス4)になります。

‌‌二分探索アルゴリズムで使用される方法

検索で「分割統治」手法を実装できる方法は2つあります。それらは反復と再帰です。

イテレーションとは何ですか?

タプル、リスト、またはディクショナリから要素を取得するには、ループを使用してアイテムを反復処理します。

反復は、実行中に繰り返されるステートメントのシーケンスであり、カウント可能な数の値があります。たとえば、ランダムリストをループする場合、リストを含む実際の変数をループして値を取得します。

反復を伴う二分探索のコード実装

コードは次のとおりです。

def binary_search(list_num , to_search):
    first_index = 0
    size = len(list_num)
    last_index = size - 1
    mid_index = (first_index + last_index) // 2
    # print(mid_index)
    mid_element = list_num[mid_index]
    # print(mid_element)

    is_found = True
    while is_found:
        if first_index == last_index:
            if mid_element != to_search:
                is_found = False
                return " Does not appear in the list"

        elif mid_element == to_search:
            return f"{mid_element} occurs in position {mid_index}"

        elif mid_element > to_search:
            new_position = mid_index - 1
            last_index = new_position
            mid_index = (first_index + last_index) // 2
            mid_element = list_num[mid_index]
            if mid_element == to_search:
                return f"{mid_element} occurs in position {mid_index}"

        elif mid_element < to_search:
            new_position = mid_index + 1
            first_index = new_position
            last_index = size - 1
            mid_index = (first_index + last_index) // 2
            mid_element = list_num[mid_index]
            if mid_element == to_search:
                return f"{mid_element} occurs in position {mid_index}"



list_container = [16 , 18 , 20 , 50 , 60 , 81 , 84 , 89]
print(binary_search(list_container , 81))
print(binary_search(list_container , 10))

ここで何が起こっているか見てみましょう:

  • まず、関数への入力として、検索するリストと値(to_search)を渡します。
  • この関数では、最初のインデックスの変数名を作成し、それを「0」に割り当てます。リストの最初のインデックスは常に「0」です。
  • 次に、4つの変数名を作成します。リストの長さを格納する「size」、最後の要素のインデックスを格納する「last_index」、中間要素のインデックスを検索する操作を格納する「mid_index」、および格納する「mid_element」です。中央のインデックスを位置として使用してリストから取得した中央の要素。
  • その後、whileループを導入して、条件を繰り返し実行します。whileループの上に、変数名「is_found」を作成し、「True」に設定します。この条件は、「検索するアイテム」が見つかったかどうかをチェックします。
  • whileループでは、すべての条件をチェックします。最初の条件は、中央の要素と変数「to_search」が等しいかどうかを確認することです。それらが等しい場合、アイテムの位置が返されます。
  • 次に、2番目の条件(中央の要素!=検索するアイテムの場合)を確認します。これにより、次の2つのシナリオが発生します。–
    中央の要素が検索するアイテムよりも大きい場合、新しい位置は1回左にシフトします。検索は最初のインデックスから始まり、新しい最後のインデックスである新しい位置で終了します。
    –中央の要素が検索対象のアイテムよりも小さい場合、新しい位置は1回右にシフトします。検索は、新しい最初のインデックスとしての新しい位置から開始され、最後のインデックスで終了します。

これらのシナリオの最後に、新しい中央の要素が検索対象のアイテムと同じであるかどうかを確認します。同じ場合は、アイテムの位置が返されます。そうでない場合は、値が等しくなるまで条件がチェックされます。

エラー処理のために、リストに表示されていない値を検索するとします。2つの条件で終了すると、ループは実行を継続し、最終的にシステムをクラッシュさせる可能性があります。

エラーをキャッチするために、最初のインデックスが最後のインデックスと等しいかどうかをチェックする条件を設定します。次に、中央の要素が検索対象のアイテムと等しいかどうかを確認します。等しくない場合、「見つかった」は「偽」になります。これを実行すると、空の配列が表示されます。私のコードでは、出力はステートメントです。

最後のステップは関数を呼び出すことであり、結果が表示されます。

そしてここに結果があります:

要素がリストにある場合、出力は位置です。

画像-194

要素がリストにない場合、出力は次のようなステートメントになります。

画像-195

‌‌再帰とは何ですか?

関数は、タスクを解決するためにそれ自体または前の用語を参照する場合、再帰的であると言われます。

再帰関数は反復的であり、順番に実行されます。それは複雑な問題から始まり、物事をより単純な形に分解します。

再帰を伴うバイナリ検索のコード実装

再帰を使用すると、少し単純になり、必要なコードが少なくなります。外観は次のとおりです。

def binary_search(list_num, first_index, last_index, to_search):
    if last_index >= first_index:
       
        mid_index = (first_index + last_index) // 2
        mid_element = list_num[mid_index]
       
 
        if mid_element == to_search:
            return f"{mid_element} occurs in position {mid_index}"
 
        elif mid_element > to_search:
            new_position = mid_index - 1
            # new last index is the new position
            return binary_search(list_num, first_index, new_position, to_search)
 
        elif mid_element < to_search:
            new_position = mid_index + 1
             # new first index is the new position
            return binary_search(list_num, new_position, last_index, to_search)
 
    else:
        return " Does not appear in the list"
       
list_container = [ 1, 9, 11, 21, 34, 54, 67, 90 ]
search = 34
first = 0
last= len(list_container) - 1
 
print(binary_search(list_container,first,last,search))
  • まず、関数は、最初のインデックス、最後のインデックス、リスト、およびto_search(検索されるアイテム)の4つの入力を受け入れます。
  • 次に、最後のインデックスの値が最初のインデックスの値以上であるかどうかを確認します。条件が真の場合、中間要素のインデックスを検索する操作を変数名「mid_index」に割り当てます。次に、中央のインデックスを位置として使用して、リストから中央の要素を取得します。
  • 最初の「if」ブロックの下に「if」ステートメントを作成して、中央の要素と変数「to_search」が等しいかどうかを確認します。それらが等しい場合、アイテムの位置が返されます。
  • 次に、2番目の条件(中央の要素!=検索するアイテムの場合)を確認します。これにより、2つのシナリオが発生します。–
    中央の要素が検索するアイテムよりも大きい場合、新しい位置は1回左にシフトします。検索は最初のインデックスから始まり、新しい位置で終わります。関数を返し、最後のインデックス値として新しい位置を渡します。
    –中央の要素が検索対象のアイテムよりも小さい場合、新しい位置は1回右にシフトします。検索は新しい位置から始まり、最後のインデックスで終わります。関数を返し、新しい位置を最初のインデックス値として渡します。
  • 最後の条件は、最初の「if」ステートメントと同じインデントになります。to_searchがリストにない場合は、ステートメントを返します

最後のステップは関数を呼び出すことであり、結果が表示されます。

そしてここに結果があります:

要素がリストにある場合、出力は次の位置になります。

画像-196

要素がリストにない場合、出力は次のステートメントになります。

画像-197

二分探索の実際の例‌

気づかないかもしれませんが、私たちは常に二分探索を行っています。日常生活や仕事でそれをどのように使用したり、遭遇したりする可能性があるかのいくつかの例を次に示します。

  • 辞書で単語を検索する
  • 図書館の文学セクションで文学の教科書を検索する
  • ソートされたリストで要素を検索する
  • 身長に応じて配置された生徒の列で、5フィート3インチより背の高い生徒を検索します。

結論

この記事の最後では、バイナリ検索アルゴリズムがどのように機能し、コードでそれらを実装する方法に精通している必要があります。

一度にすべてを把握できなくても問題ありません。少し時間を取って練習してください。

ソース:https ://www.freecodecamp.org/news/binary-search-in-python-with-examples/

#python 

What is GEEK

Buddha Community

Pythonでの二分探索–アルゴリズムのコーディング方法
高橋  花子

高橋 花子

1658302080

Pythonでの二分探索–アルゴリズムのコーディング方法

私たちの日常生活の中で、私たちは常に情報を探したり、遭遇した問題の解決策を見つけようとしています。

ウェブ上の検索結果を調べるとき、私たちは私たちが役立つと思う最も関連性の高い記事やリソースを選びます。

私たちが常に答えを得ることができるとは限らないので、検索は私たちの生活のそのような部分です。また、プログラムをより効率的に実行し、データをより効果的に処理するのに役立つさまざまなアルゴリズムがあります。

検索アルゴリズムとは何ですか?

検索アルゴリズムは、任意のデータ構造からアイテムを取得するために機能します。入力として入力されたデータをデータベースに保存されている情報と比較し、結果を導き出します。例として、1,000の番号の連絡先リストで親友の番号を見つけることがあります。

検索アルゴリズムにはさまざまな種類があります。それらのいくつかは次のとおりです。

線形探索アルゴリズム

線形検索アルゴリズムは、すべての検索アルゴリズムの中で最も単純です。名前が示すように、それらは順番に動作します。

線形検索は、リスト内の要素を次々にチェックして、特定のキー値を見つけます。このキー値はリスト内の他の項目の中にあり、アルゴリズムはチェックを通過することによって位置を返します。

ダイクストラのアルゴリズム

ダイクストラの最短経路アルゴリズムは、より高度な検索で使用されます。ダイクストラのアルゴリズムは、2つのノード間の最短距離をマッピングします。これらのノードは多くの場合、ルートネットワークです。

このタイプの検索は、地図上でルートを検索する場合に便利です。可能な最短経路を見つけることに基づいたオプションを提供します。

二分探索アルゴリズム

二分探索アルゴリズムは、半区間探索とも呼ばれます。ソートされたリスト内のターゲット値の位置を返します。

これらのアルゴリズムは、「分割統治」手法を使用して値の位置を見つけます。

二分探索アルゴリズムと線形探索アルゴリズムは、単純な探索アルゴリズムの例です。

バイナリ検索では、検索しているキー値と比較する前に、リストの中央の要素が検出されます。ただし、線形検索では、要素はループしてキー値と比較することにより、リスト内で1つずつ取得されます。

違い-1

‌二分探索では、リストは2つの部分に分割され、中央の要素が取得されます。左側、中央の要素、および右側があります。

左側には中央の要素よりも小さい値が含まれ、右側には中央の要素よりも大きい値が含まれます。このメソッドは、ソートされたリストを使用して機能します。

ソートされたリストには、アイテムが特定の順序で配置されています。バイナリ検索で検索を効率的にするには、検索プロセスを満たすために、リスト内の値を正しい順序で配置する必要があります。リストの値が混在している場合は、検索を実行する前に、並べ替えアルゴリズムで並べ替える必要があります。

並べ替えアルゴリズム

並べ替えアルゴリズムは、並べ替えられていないリストを入力として受け入れ、要素が特定の順序(ほとんどの場合昇順)に配置されたリストを返します。

挿入ソート、クイックソート、バブルソート、マージソートなど、さまざまな種類のソートアルゴリズムがあります。

二分探索のしくみ–分割統治

二分探索アルゴリズムは、「分割統治」と呼ばれる手法を使用してそのタスクに取り組みます。マージソートアルゴリズムは、同じ手法を使用してリスト内のアイテムをソートします。

二分探索アルゴリズムでは、「分割統治」法は次のように機能します。

  • アルゴリズムは、リストを2つの部分に分割します。左側と右側で、中央の要素で区切られています。
  • 検索するアイテムの値を格納する変数を作成します
  • 真ん中の要素を選び出し、検索するアイテムと比較します
  • 比較した項目が等しい場合、プロセスは終了します
  • そうでない場合、中央の要素は検索しているアイテムよりも大きいか小さいかのどちらかです。中央の要素が大きい場合、アルゴリズムはリストを分割し、左側の要素を検索します。中央の要素が小さい場合は、リストを分割して、リストの右側にある要素を検索します。

このメソッドは、バイナリ検索プロセスで再帰または反復を使用して実装できます。

二分探索アルゴリズムのしくみ–ステップバイステップ

まず、検索を実行する前に、リストを並べ替える必要があります。

次に、検索する値を格納する変数を作成します。

次に、リストは2つの部分に分かれています。最初と最後のインデックスを合計して、リストの中央の要素のインデックスを見つけます。

中央の要素インデックスの計算値がfloat(3.45など)の場合、全体をインデックスとします。

次に、検索している値と中央の要素を比較します。

プロセス1--2-

二分探索のユースケース

条件1

真ん中の要素が検索対象の値と等しい場合、値が返される位置が返され、プロセスが終了します。

if middle element == to_search 
    return position of middle element 
*code ends* 

例として上の画像を使用すると:

中央の要素=23、ターゲット値/ to_search =23。2つの値を比較すると、両側で等しいことがわかります。23はリストのインデックス2に表示されます。これがコードの出力であり、プロセスは終了します。

条件2

中央の要素が「to_search」と等しくない場合は、次のシナリオを確認します。

シナリオ1:中央の要素が検索対象の値より大きい場合:

if middle element > to_search

  • 値が中央の要素よりも小さいため、検索は左側に移動します
  • 中央の要素の位置が1だけ左にシフトします
  • new_position = index(中央の要素)-1
  • 新しい検索が開始され、検索はその新しい位置で終了し、その前のすべての値を取得します。

例として上の画像を使用すると:

middle element = 23
to_search = 4
if 23 > 4 
  • 23未満のすべての数値がそこに格納されているため、左側に移動します。インデックス(23)= 2
  • new_position = index(23)-1 = 2-1 = 1
  • 検索はインデックス1で終了し、インデックス1の前に他のすべての値を取得します

左側

新しい中間要素(4)を目標値(4)と比較すると、それらが等しいことがわかります。したがって、検索は終了し、出力はリスト内の「4」の位置(インデックス0)になります。

シナリオ2:中央の要素が検索対象の値よりも小さい場合:

if middle element < to_search

  • 値が中央の要素より大きいため、検索は右側に移動します
  • 中央の要素の位置が1だけ右にシフトします
  • new_position = index(中央の要素)+ 1
  • 新しい検索は新しい位置で始まり、リストの最後のインデックスで終わります
  • すべての値は、新しい位置からリストの最後まで取得されます

例として最初の画像を使用します。

middle element = 23 
to_search = 32 
if 23 > 32 
  • 23より大きいすべての数値がそこに格納されているため、右側に移動します。index(23)= 2、
  • new_position = index(23)+ 1 = 2 + 1 = 3
  • 検索はインデックス3から始まり、インデックス3以降の他のすべての値を取得します

右側

真ん中の要素(32)を目標値(32)と比較すると、それらが等しいことがわかります。したがって、検索は終了し、出力はリスト内の「4」の位置(インデックス4)になります。

‌‌二分探索アルゴリズムで使用される方法

検索で「分割統治」手法を実装できる方法は2つあります。それらは反復と再帰です。

イテレーションとは何ですか?

タプル、リスト、またはディクショナリから要素を取得するには、ループを使用してアイテムを反復処理します。

反復は、実行中に繰り返されるステートメントのシーケンスであり、カウント可能な数の値があります。たとえば、ランダムリストをループする場合、リストを含む実際の変数をループして値を取得します。

反復を伴う二分探索のコード実装

コードは次のとおりです。

def binary_search(list_num , to_search):
    first_index = 0
    size = len(list_num)
    last_index = size - 1
    mid_index = (first_index + last_index) // 2
    # print(mid_index)
    mid_element = list_num[mid_index]
    # print(mid_element)

    is_found = True
    while is_found:
        if first_index == last_index:
            if mid_element != to_search:
                is_found = False
                return " Does not appear in the list"

        elif mid_element == to_search:
            return f"{mid_element} occurs in position {mid_index}"

        elif mid_element > to_search:
            new_position = mid_index - 1
            last_index = new_position
            mid_index = (first_index + last_index) // 2
            mid_element = list_num[mid_index]
            if mid_element == to_search:
                return f"{mid_element} occurs in position {mid_index}"

        elif mid_element < to_search:
            new_position = mid_index + 1
            first_index = new_position
            last_index = size - 1
            mid_index = (first_index + last_index) // 2
            mid_element = list_num[mid_index]
            if mid_element == to_search:
                return f"{mid_element} occurs in position {mid_index}"



list_container = [16 , 18 , 20 , 50 , 60 , 81 , 84 , 89]
print(binary_search(list_container , 81))
print(binary_search(list_container , 10))

ここで何が起こっているか見てみましょう:

  • まず、関数への入力として、検索するリストと値(to_search)を渡します。
  • この関数では、最初のインデックスの変数名を作成し、それを「0」に割り当てます。リストの最初のインデックスは常に「0」です。
  • 次に、4つの変数名を作成します。リストの長さを格納する「size」、最後の要素のインデックスを格納する「last_index」、中間要素のインデックスを検索する操作を格納する「mid_index」、および格納する「mid_element」です。中央のインデックスを位置として使用してリストから取得した中央の要素。
  • その後、whileループを導入して、条件を繰り返し実行します。whileループの上に、変数名「is_found」を作成し、「True」に設定します。この条件は、「検索するアイテム」が見つかったかどうかをチェックします。
  • whileループでは、すべての条件をチェックします。最初の条件は、中央の要素と変数「to_search」が等しいかどうかを確認することです。それらが等しい場合、アイテムの位置が返されます。
  • 次に、2番目の条件(中央の要素!=検索するアイテムの場合)を確認します。これにより、次の2つのシナリオが発生します。–
    中央の要素が検索するアイテムよりも大きい場合、新しい位置は1回左にシフトします。検索は最初のインデックスから始まり、新しい最後のインデックスである新しい位置で終了します。
    –中央の要素が検索対象のアイテムよりも小さい場合、新しい位置は1回右にシフトします。検索は、新しい最初のインデックスとしての新しい位置から開始され、最後のインデックスで終了します。

これらのシナリオの最後に、新しい中央の要素が検索対象のアイテムと同じであるかどうかを確認します。同じ場合は、アイテムの位置が返されます。そうでない場合は、値が等しくなるまで条件がチェックされます。

エラー処理のために、リストに表示されていない値を検索するとします。2つの条件で終了すると、ループは実行を継続し、最終的にシステムをクラッシュさせる可能性があります。

エラーをキャッチするために、最初のインデックスが最後のインデックスと等しいかどうかをチェックする条件を設定します。次に、中央の要素が検索対象のアイテムと等しいかどうかを確認します。等しくない場合、「見つかった」は「偽」になります。これを実行すると、空の配列が表示されます。私のコードでは、出力はステートメントです。

最後のステップは関数を呼び出すことであり、結果が表示されます。

そしてここに結果があります:

要素がリストにある場合、出力は位置です。

画像-194

要素がリストにない場合、出力は次のようなステートメントになります。

画像-195

‌‌再帰とは何ですか?

関数は、タスクを解決するためにそれ自体または前の用語を参照する場合、再帰的であると言われます。

再帰関数は反復的であり、順番に実行されます。それは複雑な問題から始まり、物事をより単純な形に分解します。

再帰を伴うバイナリ検索のコード実装

再帰を使用すると、少し単純になり、必要なコードが少なくなります。外観は次のとおりです。

def binary_search(list_num, first_index, last_index, to_search):
    if last_index >= first_index:
       
        mid_index = (first_index + last_index) // 2
        mid_element = list_num[mid_index]
       
 
        if mid_element == to_search:
            return f"{mid_element} occurs in position {mid_index}"
 
        elif mid_element > to_search:
            new_position = mid_index - 1
            # new last index is the new position
            return binary_search(list_num, first_index, new_position, to_search)
 
        elif mid_element < to_search:
            new_position = mid_index + 1
             # new first index is the new position
            return binary_search(list_num, new_position, last_index, to_search)
 
    else:
        return " Does not appear in the list"
       
list_container = [ 1, 9, 11, 21, 34, 54, 67, 90 ]
search = 34
first = 0
last= len(list_container) - 1
 
print(binary_search(list_container,first,last,search))
  • まず、関数は、最初のインデックス、最後のインデックス、リスト、およびto_search(検索されるアイテム)の4つの入力を受け入れます。
  • 次に、最後のインデックスの値が最初のインデックスの値以上であるかどうかを確認します。条件が真の場合、中間要素のインデックスを検索する操作を変数名「mid_index」に割り当てます。次に、中央のインデックスを位置として使用して、リストから中央の要素を取得します。
  • 最初の「if」ブロックの下に「if」ステートメントを作成して、中央の要素と変数「to_search」が等しいかどうかを確認します。それらが等しい場合、アイテムの位置が返されます。
  • 次に、2番目の条件(中央の要素!=検索するアイテムの場合)を確認します。これにより、2つのシナリオが発生します。–
    中央の要素が検索するアイテムよりも大きい場合、新しい位置は1回左にシフトします。検索は最初のインデックスから始まり、新しい位置で終わります。関数を返し、最後のインデックス値として新しい位置を渡します。
    –中央の要素が検索対象のアイテムよりも小さい場合、新しい位置は1回右にシフトします。検索は新しい位置から始まり、最後のインデックスで終わります。関数を返し、新しい位置を最初のインデックス値として渡します。
  • 最後の条件は、最初の「if」ステートメントと同じインデントになります。to_searchがリストにない場合は、ステートメントを返します

最後のステップは関数を呼び出すことであり、結果が表示されます。

そしてここに結果があります:

要素がリストにある場合、出力は次の位置になります。

画像-196

要素がリストにない場合、出力は次のステートメントになります。

画像-197

二分探索の実際の例‌

気づかないかもしれませんが、私たちは常に二分探索を行っています。日常生活や仕事でそれをどのように使用したり、遭遇したりする可能性があるかのいくつかの例を次に示します。

  • 辞書で単語を検索する
  • 図書館の文学セクションで文学の教科書を検索する
  • ソートされたリストで要素を検索する
  • 身長に応じて配置された生徒の列で、5フィート3インチより背の高い生徒を検索します。

結論

この記事の最後では、バイナリ検索アルゴリズムがどのように機能し、コードでそれらを実装する方法に精通している必要があります。

一度にすべてを把握できなくても問題ありません。少し時間を取って練習してください。

ソース:https ://www.freecodecamp.org/news/binary-search-in-python-with-examples/

#python