演算法 分治演算法

2021-07-06 08:01:41 字數 1139 閱讀 5917

分治策略主要利用遞迴來解決問題,它包括以下三個步驟:

分解:將問題分解為一與原問題類似並且比原問題規模更小的子問題

解決:當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解

合併:將子問題的解合成原問題的解

下面考慮乙個簡單的利用分治演算法的歸併排序的例子

問題的形式化描述如下:

輸入: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...

演算法思想 分治演算法

分而治之 大問題能夠拆成相似的小問題,記住這些小問題需要具有相似性。而後將小問題的每個解合成為大問題的解。所以說大問題如何拆,小問題如何合併才是這個演算法最主要的乙個思想。實際上很多演算法如貪心演算法,動態規劃等等都是要求把大問題拆成小問題。而分治演算法的重要一點就是要適用於能夠重新把小問題的解合併...