分而治之策略

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章