分治策略主要利用遞迴來解決問題,它包括以下三個步驟:
分解:將問題分解為一與原問題類似並且比原問題規模更小的子問題
解決:當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解
合併:將子問題的解合成原問題的解
下面考慮乙個簡單的利用分治演算法的歸併排序的例子
問題的形式化描述如下:
輸入:a是 乙個全序關係,a[p,q]是這個全序關係上的一部分
輸出:將a[p,q]部分進行排序
下面是分治策略的偽**:
merge(a,p,q,r)
1n1 = q-p+1
2n2 = r-q
3let l[1..n1=1] and r[1..n2+1] be new arrays
4for i = 1 to n1
l[i ] = a[p + i -1]
5for j = 1 tp n2
r[j] = a[q +j]
6l[n1 + 1] = ∞
7r[n2 +1] = ∞
8i = 1
9j = 1
10for k= p to r
if l[i] <=r[j]
a[k] = l[i]
i++11else a[k] = r[j]
j++merge-sort(a,p,r)
1if p < r
2q = [(p = q)]/2
3merge-sort(a,p,q)
4merge-sort(a,q+1,r)
5merge(a,mp,q,r)
下面按照上面的三個步驟分析該演算法
第一步:分解
merge-sort函式中的第二行將陣列分成了兩個元素較少的子陣列,分別是從p-q和q+1 - r
第二步:解決
merge-sort函式中的第三第四行分別對兩個子陣列進行遞迴呼叫,當陣列中只有乙個元素時,結束方法,排序完畢
第三步:合併:
merge函式將兩個已經排好序的子陣列合併成乙個排序的大陣列,在merge-sort函式中呼叫此方法來將兩個子陣列合併成乙個大的陣列
我們可以用樹的形式來表示演算法的執行過程,利用遞迴樹來進行分治演算法的分析是乙個十分有效的方法
通過遞迴樹,我們可以得出此演算法的時間複雜度o(nlgn)
演算法 分治演算法
leetcode 169.多數元素 應用舉例 通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中 卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。相關概念 一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序...
演算法複習 分治演算法
先來看乙個經典的二分查詢例子。int binarysearch vector nums,int target return 1 時間複雜度是 o logn 我們看到,二分查詢貫徹了分治的思想。當我們要解決乙個輸入規模較大 不妨設為 n 的問題時,可以將這個問題分解成 k 個不同的子集,如果能得到 k...
演算法思想 分治演算法
分而治之 大問題能夠拆成相似的小問題,記住這些小問題需要具有相似性。而後將小問題的每個解合成為大問題的解。所以說大問題如何拆,小問題如何合併才是這個演算法最主要的乙個思想。實際上很多演算法如貪心演算法,動態規劃等等都是要求把大問題拆成小問題。而分治演算法的重要一點就是要適用於能夠重新把小問題的解合併...