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))