1658302080
私たちの日常生活の中で、私たちは常に情報を探したり、遭遇した問題の解決策を見つけようとしています。
ウェブ上の検索結果を調べるとき、私たちは私たちが役立つと思う最も関連性の高い記事やリソースを選びます。
私たちが常に答えを得ることができるとは限らないので、検索は私たちの生活のそのような部分です。また、プログラムをより効率的に実行し、データをより効果的に処理するのに役立つさまざまなアルゴリズムがあります。
検索アルゴリズムは、任意のデータ構造からアイテムを取得するために機能します。入力として入力されたデータをデータベースに保存されている情報と比較し、結果を導き出します。例として、1,000の番号の連絡先リストで親友の番号を見つけることがあります。
検索アルゴリズムにはさまざまな種類があります。それらのいくつかは次のとおりです。
線形検索アルゴリズムは、すべての検索アルゴリズムの中で最も単純です。名前が示すように、それらは順番に動作します。
線形検索は、リスト内の要素を次々にチェックして、特定のキー値を見つけます。このキー値はリスト内の他の項目の中にあり、アルゴリズムはチェックを通過することによって位置を返します。
ダイクストラの最短経路アルゴリズムは、より高度な検索で使用されます。ダイクストラのアルゴリズムは、2つのノード間の最短距離をマッピングします。これらのノードは多くの場合、ルートネットワークです。
このタイプの検索は、地図上でルートを検索する場合に便利です。可能な最短経路を見つけることに基づいたオプションを提供します。
二分探索アルゴリズムは、半区間探索とも呼ばれます。ソートされたリスト内のターゲット値の位置を返します。
これらのアルゴリズムは、「分割統治」手法を使用して値の位置を見つけます。
二分探索アルゴリズムと線形探索アルゴリズムは、単純な探索アルゴリズムの例です。
バイナリ検索では、検索しているキー値と比較する前に、リストの中央の要素が検出されます。ただし、線形検索では、要素はループしてキー値と比較することにより、リスト内で1つずつ取得されます。
二分探索では、リストは2つの部分に分割され、中央の要素が取得されます。左側、中央の要素、および右側があります。
左側には中央の要素よりも小さい値が含まれ、右側には中央の要素よりも大きい値が含まれます。このメソッドは、ソートされたリストを使用して機能します。
ソートされたリストには、アイテムが特定の順序で配置されています。バイナリ検索で検索を効率的にするには、検索プロセスを満たすために、リスト内の値を正しい順序で配置する必要があります。リストの値が混在している場合は、検索を実行する前に、並べ替えアルゴリズムで並べ替える必要があります。
並べ替えアルゴリズムは、並べ替えられていないリストを入力として受け入れ、要素が特定の順序(ほとんどの場合昇順)に配置されたリストを返します。
挿入ソート、クイックソート、バブルソート、マージソートなど、さまざまな種類のソートアルゴリズムがあります。
二分探索アルゴリズムは、「分割統治」と呼ばれる手法を使用してそのタスクに取り組みます。マージソートアルゴリズムは、同じ手法を使用してリスト内のアイテムをソートします。
二分探索アルゴリズムでは、「分割統治」法は次のように機能します。
このメソッドは、バイナリ検索プロセスで再帰または反復を使用して実装できます。
まず、検索を実行する前に、リストを並べ替える必要があります。
次に、検索する値を格納する変数を作成します。
次に、リストは2つの部分に分かれています。最初と最後のインデックスを合計して、リストの中央の要素のインデックスを見つけます。
中央の要素インデックスの計算値がfloat(3.45など)の場合、全体をインデックスとします。
次に、検索している値と中央の要素を比較します。
真ん中の要素が検索対象の値と等しい場合、値が返される位置が返され、プロセスが終了します。
if middle element == to_search
return position of middle element
*code ends*
中央の要素=23、ターゲット値/ to_search =23。2つの値を比較すると、両側で等しいことがわかります。23はリストのインデックス2に表示されます。これがコードの出力であり、プロセスは終了します。
中央の要素が「to_search」と等しくない場合は、次のシナリオを確認します。
シナリオ1:中央の要素が検索対象の値より大きい場合:
if middle element > to_search
middle element = 23
to_search = 4
if 23 > 4
新しい中間要素(4)を目標値(4)と比較すると、それらが等しいことがわかります。したがって、検索は終了し、出力はリスト内の「4」の位置(インデックス0)になります。
シナリオ2:中央の要素が検索対象の値よりも小さい場合:
if middle element < to_search
middle element = 23
to_search = 32
if 23 > 32
真ん中の要素(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))
ここで何が起こっているか見てみましょう:
これらのシナリオの最後に、新しい中央の要素が検索対象のアイテムと同じであるかどうかを確認します。同じ場合は、アイテムの位置が返されます。そうでない場合は、値が等しくなるまで条件がチェックされます。
エラー処理のために、リストに表示されていない値を検索するとします。2つの条件で終了すると、ループは実行を継続し、最終的にシステムをクラッシュさせる可能性があります。
エラーをキャッチするために、最初のインデックスが最後のインデックスと等しいかどうかをチェックする条件を設定します。次に、中央の要素が検索対象のアイテムと等しいかどうかを確認します。等しくない場合、「見つかった」は「偽」になります。これを実行すると、空の配列が表示されます。私のコードでは、出力はステートメントです。
最後のステップは関数を呼び出すことであり、結果が表示されます。
そしてここに結果があります:
要素がリストにある場合、出力は位置です。
要素がリストにない場合、出力は次のようなステートメントになります。
関数は、タスクを解決するためにそれ自体または前の用語を参照する場合、再帰的であると言われます。
再帰関数は反復的であり、順番に実行されます。それは複雑な問題から始まり、物事をより単純な形に分解します。
再帰を使用すると、少し単純になり、必要なコードが少なくなります。外観は次のとおりです。
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))
最後のステップは関数を呼び出すことであり、結果が表示されます。
そしてここに結果があります:
要素がリストにある場合、出力は次の位置になります。
要素がリストにない場合、出力は次のステートメントになります。
気づかないかもしれませんが、私たちは常に二分探索を行っています。日常生活や仕事でそれをどのように使用したり、遭遇したりする可能性があるかのいくつかの例を次に示します。
この記事の最後では、バイナリ検索アルゴリズムがどのように機能し、コードでそれらを実装する方法に精通している必要があります。
一度にすべてを把握できなくても問題ありません。少し時間を取って練習してください。
ソース:https ://www.freecodecamp.org/news/binary-search-in-python-with-examples/
1658302080
私たちの日常生活の中で、私たちは常に情報を探したり、遭遇した問題の解決策を見つけようとしています。
ウェブ上の検索結果を調べるとき、私たちは私たちが役立つと思う最も関連性の高い記事やリソースを選びます。
私たちが常に答えを得ることができるとは限らないので、検索は私たちの生活のそのような部分です。また、プログラムをより効率的に実行し、データをより効果的に処理するのに役立つさまざまなアルゴリズムがあります。
検索アルゴリズムは、任意のデータ構造からアイテムを取得するために機能します。入力として入力されたデータをデータベースに保存されている情報と比較し、結果を導き出します。例として、1,000の番号の連絡先リストで親友の番号を見つけることがあります。
検索アルゴリズムにはさまざまな種類があります。それらのいくつかは次のとおりです。
線形検索アルゴリズムは、すべての検索アルゴリズムの中で最も単純です。名前が示すように、それらは順番に動作します。
線形検索は、リスト内の要素を次々にチェックして、特定のキー値を見つけます。このキー値はリスト内の他の項目の中にあり、アルゴリズムはチェックを通過することによって位置を返します。
ダイクストラの最短経路アルゴリズムは、より高度な検索で使用されます。ダイクストラのアルゴリズムは、2つのノード間の最短距離をマッピングします。これらのノードは多くの場合、ルートネットワークです。
このタイプの検索は、地図上でルートを検索する場合に便利です。可能な最短経路を見つけることに基づいたオプションを提供します。
二分探索アルゴリズムは、半区間探索とも呼ばれます。ソートされたリスト内のターゲット値の位置を返します。
これらのアルゴリズムは、「分割統治」手法を使用して値の位置を見つけます。
二分探索アルゴリズムと線形探索アルゴリズムは、単純な探索アルゴリズムの例です。
バイナリ検索では、検索しているキー値と比較する前に、リストの中央の要素が検出されます。ただし、線形検索では、要素はループしてキー値と比較することにより、リスト内で1つずつ取得されます。
二分探索では、リストは2つの部分に分割され、中央の要素が取得されます。左側、中央の要素、および右側があります。
左側には中央の要素よりも小さい値が含まれ、右側には中央の要素よりも大きい値が含まれます。このメソッドは、ソートされたリストを使用して機能します。
ソートされたリストには、アイテムが特定の順序で配置されています。バイナリ検索で検索を効率的にするには、検索プロセスを満たすために、リスト内の値を正しい順序で配置する必要があります。リストの値が混在している場合は、検索を実行する前に、並べ替えアルゴリズムで並べ替える必要があります。
並べ替えアルゴリズムは、並べ替えられていないリストを入力として受け入れ、要素が特定の順序(ほとんどの場合昇順)に配置されたリストを返します。
挿入ソート、クイックソート、バブルソート、マージソートなど、さまざまな種類のソートアルゴリズムがあります。
二分探索アルゴリズムは、「分割統治」と呼ばれる手法を使用してそのタスクに取り組みます。マージソートアルゴリズムは、同じ手法を使用してリスト内のアイテムをソートします。
二分探索アルゴリズムでは、「分割統治」法は次のように機能します。
このメソッドは、バイナリ検索プロセスで再帰または反復を使用して実装できます。
まず、検索を実行する前に、リストを並べ替える必要があります。
次に、検索する値を格納する変数を作成します。
次に、リストは2つの部分に分かれています。最初と最後のインデックスを合計して、リストの中央の要素のインデックスを見つけます。
中央の要素インデックスの計算値がfloat(3.45など)の場合、全体をインデックスとします。
次に、検索している値と中央の要素を比較します。
真ん中の要素が検索対象の値と等しい場合、値が返される位置が返され、プロセスが終了します。
if middle element == to_search
return position of middle element
*code ends*
中央の要素=23、ターゲット値/ to_search =23。2つの値を比較すると、両側で等しいことがわかります。23はリストのインデックス2に表示されます。これがコードの出力であり、プロセスは終了します。
中央の要素が「to_search」と等しくない場合は、次のシナリオを確認します。
シナリオ1:中央の要素が検索対象の値より大きい場合:
if middle element > to_search
middle element = 23
to_search = 4
if 23 > 4
新しい中間要素(4)を目標値(4)と比較すると、それらが等しいことがわかります。したがって、検索は終了し、出力はリスト内の「4」の位置(インデックス0)になります。
シナリオ2:中央の要素が検索対象の値よりも小さい場合:
if middle element < to_search
middle element = 23
to_search = 32
if 23 > 32
真ん中の要素(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))
ここで何が起こっているか見てみましょう:
これらのシナリオの最後に、新しい中央の要素が検索対象のアイテムと同じであるかどうかを確認します。同じ場合は、アイテムの位置が返されます。そうでない場合は、値が等しくなるまで条件がチェックされます。
エラー処理のために、リストに表示されていない値を検索するとします。2つの条件で終了すると、ループは実行を継続し、最終的にシステムをクラッシュさせる可能性があります。
エラーをキャッチするために、最初のインデックスが最後のインデックスと等しいかどうかをチェックする条件を設定します。次に、中央の要素が検索対象のアイテムと等しいかどうかを確認します。等しくない場合、「見つかった」は「偽」になります。これを実行すると、空の配列が表示されます。私のコードでは、出力はステートメントです。
最後のステップは関数を呼び出すことであり、結果が表示されます。
そしてここに結果があります:
要素がリストにある場合、出力は位置です。
要素がリストにない場合、出力は次のようなステートメントになります。
関数は、タスクを解決するためにそれ自体または前の用語を参照する場合、再帰的であると言われます。
再帰関数は反復的であり、順番に実行されます。それは複雑な問題から始まり、物事をより単純な形に分解します。
再帰を使用すると、少し単純になり、必要なコードが少なくなります。外観は次のとおりです。
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))
最後のステップは関数を呼び出すことであり、結果が表示されます。
そしてここに結果があります:
要素がリストにある場合、出力は次の位置になります。
要素がリストにない場合、出力は次のステートメントになります。
気づかないかもしれませんが、私たちは常に二分探索を行っています。日常生活や仕事でそれをどのように使用したり、遭遇したりする可能性があるかのいくつかの例を次に示します。
この記事の最後では、バイナリ検索アルゴリズムがどのように機能し、コードでそれらを実装する方法に精通している必要があります。
一度にすべてを把握できなくても問題ありません。少し時間を取って練習してください。
ソース:https ://www.freecodecamp.org/news/binary-search-in-python-with-examples/