分而治之策略

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

猜你喜欢

转载自blog.csdn.net/sinat_40701582/article/details/105858023