分割統治法(Divide and Conquer)は、問題を小さな部分に分割し、それぞれを解決した後にそれらの解を統合するアルゴリズム設計の手法です。この手法は、多くのアルゴリズムにおいて利用されています。ここでは、分割統治法の基本的な概念といくつかの応用例について学びます。
分割統治法は、以下の3つのステップで構成されます。
このプロセスを通じて、複雑な問題をシンプルな部分問題に帰着させ、効率的に解決します。
マージソートは、分割統治法を用いたソートアルゴリズムの一つです。リストを半分に分け、それぞれをソートし、最後にマージします。
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left_half = merge_sort(arr[:mid])
right_half = merge_sort(arr[mid:])
return merge(left_half, right_half)
def merge(left, right):
sorted_array = []
left_index, right_index = 0, 0
while left_index < len(left) and right_index < len(right):
if left[left_index] < right[right_index]:
sorted_array.append(left[left_index])
left_index += 1
else:
sorted_array.append(right[right_index])
right_index += 1
sorted_array.extend(left[left_index:])
sorted_array.extend(right[right_index:])
return sorted_array
# 使用例
if __name__ == "__main__":
data = [38, 27, 43, 3, 9, 82, 10]
sorted_data = merge_sort(data)
print("Sorted array:", sorted_data)
merge_sort
関数は、リストを再帰的に分割します。リストの長さが1以下になると、そのまま返します。merge
関数を呼び出して、左右のソートされた配列をマージします。merge
関数は、二つのソートされたリストを結合し、一つのソートされたリストを返します。クイックソートも分割統治法を用いた高速なソートアルゴリズムです。基準値(ピボット)を選び、リストをそれより小さい部分と大きい部分に分割します。
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
# 使用例
if __name__ == "__main__":
data = [10, 7, 8, 9, 1, 5]
sorted_data = quick_sort(data)
print("Sorted array:", sorted_data)
quick_sort
関数は、基準値(ピボット)をリストの中央の要素として選択します。二分探索は、ソートされたリストに対して特定の値を効率的に検索するアルゴリズムです。
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 使用例
if __name__ == "__main__":
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
target = 7
result = binary_search(data, target)
if result != -1:
print("Element found at index:", result)
else:
print("Element not found.")
binary_search
関数は、リストの左端と右端のインデックスを設定します。分割統治法は、効率的なアルゴリズムを設計するための強力な手法です。マージソート、クイックソート、二分探索など、さまざまなアルゴリズムに応用されており、プログラミングの基本的なテクニックとして習得することが重要です。これらのアルゴリズムを通じて、分割統治法の考え方を実践的に理解することができます。