Preview
分治算法(分而治之)
設計思想:
將一個難以直接解決的大問題,分割成一些規模較小
的相同
問題,以便各個擊破
分治策略:
對於一個規模爲n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,
否則將其分解爲k個規模較小的子問題,這些子問題互相獨立
且與原問題形式相同
,
遞歸<具體解決問題的方法>
地解這些子問題,然後將各子問題的解合併
得到原問題的解。
這種算法設計策略
叫做分治法
分治法所能解決的問題一般具有以下幾個特徵:
1) 該問題的規模縮小到一定的程度就可以容易地解決
2) 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質。 3) 利用該問題分解出的子問題的解可以合併爲該問題的解;
4)該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。
分治法得基本步驟:
step1 分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題;
step2 解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題
step3 合併:將各個子問題的解合併爲原問題的解。
經典應用
(1)二分搜索(查找)
(2)大整數乘法
(3)Strassen矩陣乘法
(4)棋盤覆蓋
(5)合併排序
(6)快速排序
(7)線性時間選擇
(8)最接近點對問題
(9)循環賽日程表
(10)漢諾塔
Code
def b_search(arr: list, left: int, right: int, key): # 二分查找
# 前提: arr 數組是已排序的
# 中間位置
mid = (left + right) // 2
# 比較查找的key值的查找範圍
if arr[mid] == key:
return mid
elif left>right:
return 'opps,no such key'
elif arr[mid] < key:
return b_search(arr, mid + 1, right, key)
else:
return b_search(arr, left, mid - 1, key)
if __name__ == '__main__':
"""
查找元素:800,報錯
RecursionError: maximum recursion depth exceeded in comparison
"""
arr = [1, 5, 10, 20, 30, 50, 80]
print(b_search(arr, 0, len(arr) - 1, 800))