再帰を用いた二分探索をPythonで実装する方法
再帰(リカーシブ)処理を利用して二分探索を実装する場合、まずインデックス「high」が「low」以上であるかどうかを判定するメソッドを定義します。その後、中央位置を示す「mid」変数に格納された値と検索対象の要素を比較し、その結果に応じて関数自身を再度呼び出すことで、目的の要素を絞り込みながら探索していきます。
なお、Pythonのリストは整数、浮動小数点数、文字列など、異なるデータ型の値をひとつのコレクションにまとめて格納できる汎用的なデータ構造です。
二分探索の計算量は O(log n) と非常に効率的であり、要素数が多いソート済みリストから特定の値を高速に見つけたい場合に特に有効です。
以下に具体的な実装例を示します。
サンプルコード
def binary_search(my_list, low, high, elem):
if high >= low:
mid = (high + low) // 2
if my_list[mid] == elem:
return mid
elif my_list[mid] > elem:
return binary_search(my_list, low, mid - 1, elem)
else:
return binary_search(my_list, mid + 1, high, elem)
else:
return -1
my_list = [ 1, 9, 11, 21, 34, 54, 67, 90 ]
elem_to_search = 1
print("The list is")
print(my_list)
my_result = binary_search(my_list,0,len(my_list)-1,elem_to_search)
if my_result != -1:
print("Element found at index ", str(my_result))
else:
print("Element not found!")
実行結果
The list is
[1, 9, 11, 21, 34, 54, 67, 90]
Element found at index 0
コードの解説
- まず「binary_search」という名前の関数を定義します。
- この関数は、探索対象のリスト、下限を示す変数「low」、上限を示す変数「high」、および検索したい要素を引数として受け取ります。
- 次に、変数「mid」には「high」と「low」の中間値(平均値)が代入されます。
- 「mid」の位置にある要素が検索対象と一致した場合、そのインデックスを返して処理を終了します。
- 「mid」の位置にある要素が検索対象よりも大きい場合は、探索範囲を左半分に狭めて、異なる引数を渡しながら関数を再帰的に呼び出します。
- 逆に「mid」の位置にある要素が検索対象よりも小さい場合は、探索範囲を右半分に狭めて、同様に関数を再度呼び出します。
- この処理により、探索範囲は毎回半分ずつ縮小されていきます。
- その後、実際のリストを定義し、そのリストを引数として関数を呼び出します。
- 関数の戻り値(探索結果)は変数に格納され、条件分岐によって見つかったインデックスまたは「見つからなかった」旨のメッセージがコンソールに出力されます。
このように再帰を活用することで、ループ処理を明示的に書かなくても簡潔で読みやすい二分探索を実装できます。ただし、リストが非常に大きい場合は再帰の深さ制限に注意が必要です。Pythonではデフォルトの再帰上限があるため、必要に応じて反復処理版への書き換えも検討するとよいでしょう。
-
Pythonで学ぶ線形探索(リニアサーチ)の基本と実装方法
この記事では、最も基本的な検索アルゴリズムの一つである「線形探索(Linear Search)」の仕組みを理解し、Python 3.xでの実装方法をわかりやすく解説します。 線形探索のアルゴリズム 配列 arr[] の左端の要素から順に、目的の要素 x と各要素を一つずつ比較していきます x がいずれかの要素と一致した場合、そのインデックス(位置)を返します x が配列内のどの要素とも一致しなかった場合、-1 を返すか「要素が見つからない」ことを示します それでは、このアプローチの流れを視覚的に確認してみましょう。 実装例 def linearsearch(arr, x):
-
【Python入門】線形探索(リニアサーチ)の仕組みと実装方法
本記事では、最も基本的な探索アルゴリズムである「線形探索(リニアサーチ)」の仕組みと、Python 3.xでの実装方法について詳しく解説します。 線形探索とは 線形探索は、配列(リスト)の先頭から順番に要素を一つずつ調べ、目的の値と一致するかどうかを確認していくシンプルな探索手法です。データがソートされていなくても利用できるため、小規模なデータや整列されていないデータを扱う際に手軽で便利です。 アルゴリズムの手順 1. 配列 arr[] の左端(先頭)の要素から順に、目的の値 x と各要素を比較していく 2. x がいずれかの要素と一致した場合、そのインデックス(位置)を返す 3. 配列の最後