分治算法(Divide ans conquer ,D&C)

一.基本概念

在計算機科學中,分治算法(Divide ans conquer ,D&C)是一種基於多分支遞歸的算法設計範例。“分而治之”,它通過將複雜的問題分解(devide)成兩個或多個同類型(或相關類型)的子問題,直至達到能直接解決(conquer)的程度(否則繼續分解或遞歸),最終合併(combine)成原始問題的解來實現分治。

https://en.wikipedia.org/wiki/Divide_and_conquer_algorithms

二.分治法的適用特徵

分治法所能解決的問題一般具有以下幾個特徵:

    1) 該問題通過分解(devide)將問題規模縮小到一定的程度就可以容易地解決

    2) 該問題分解爲的若干個規模同類型(或相關類型)的子問題具有最優子結構性質

    3) 利用該問題分解出的子問題的解可以合併爲該問題的解;(不具備,可以考慮貪心(greedy algorithm)或者動態規劃(DP)

    4) 該問題所分解出的各個子問題是互斥的,即子問題之間不包含公共的子子問題(若有,動態規劃更優(DP))

三.分治法的基本思想與步驟

在分治策略中,在每個層次遞歸中應用了三個步驟:

1.分解(Divide):將P分解爲較小的子問題 P1 ,P2 ,...,Pk

    2.解決(Conquer):

If Pi is enough small to solve, thensolve.(直接解決)

Else for i←1 to k,do yi ← Divide-and-Conquer(Pi)遞歸解決Pi

    3.合併(Combine): T ← MERGE(y1,y2,...,yk)合併子問題, return(T)

    子問題足夠大需要遞歸時,稱遞歸情況(recursive case)。足夠小可以直接解決,遞歸“觸底”,稱基本情況(base case)。如果除了與原問題形式完全一樣的規模更小的子問題外,還需求解不一樣的子問題,將其看做合併。

遞歸與分治緊密相關,遞歸式很容易刻畫分治算法的時間複雜度。一個遞歸式是一個等式或者不等式,通過更小的輸入上的函數值來描述。

通常,解決這類問題(一直遞歸式,找答案)有三種方法:

1)  數學歸納法(Mathematical Induction)

2)  遞歸樹找規律(Recursion Tree)

3)  主定理(Master Theorem)

 

四.分治法的複雜性分析

一個分治法將規模爲n的問題分成k個規模爲n/m的子問題去解。設分解閥值n0=1,且adhoc解規模爲1的問題耗費1個單位時間。再設將原問題分解爲k個子問題以及用merge將k個子問題的解合併爲原問題的解需用f(n)個單位時間。用T(n)表示該分治法解規模爲|P|=n的問題所需的計算時間,則有:

   T(n)= k T(n/m)+f(n)

通過迭代法求得方程的解:

遞歸方程及其解只給出n等於m的方冪時T(n)的值,但是如果認爲T(n)足夠平滑,那麼由n等於m的方冪時T(n)的值可以估計T(n)的增長速度。通常假定T(n)是單調上升的,從而當       mi≤n<mi+1時,T(mi)≤T(n)<T(mi+1)。 

發佈了31 篇原創文章 · 獲贊 21 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章