分治策略學習(二)

2021-07-29 16:22:24 字數 2755 閱讀 3006

如果對分治策略不懂的可以先看下這個:分治策略學習(一)

回顧一下分治策略的三步驟:

1.分解步驟:將問題劃分為一些子問題,子問題的形式與原問題一樣,只是規模更小。

2.解決步驟:遞迴求解出子問題。如果子問題的規模足夠小,則停止遞迴,直接求解。

3.合併步驟:將子問題的解組合成原問題的解。

當子問題足夠大,需要遞迴求解時,我們稱之為遞迴情況。當子問題變得足夠小,不再需要遞迴時,我們說遞迴已經「觸底」,進入了基本情況

給定n(n>=1)個元素組成的集合,輸出該集合的所有可能的排列。例如,集合 的所有的可能的排列為

當我們運用分治策略的思想來解決這個問題的時候,你會發現問題變得很簡單。

首先是第一步:分解問題

我們考慮一下集合中存在4個元素的時候,例如,排列的組合如下:

1. 以a開頭後面跟著的所有排列

2. 以b開頭後面跟著的所有排列

3. 以c開頭後面跟著的所有排列

4. 以d開頭後面跟著的所有排列

此時,你會發現我們將問題從原來求解4個元素的全排列問題變為求解3個元素的全排列問題,而這只需要乙個for迴圈就可以達到目的

這裡我們拿(1)來說明問題,對於,排列的組合如下

1. 以b開頭後面跟著的所有排列

2. 以c開頭後面跟著的所有排列

3. 以d開頭後面跟著的所有排列

此時又由求解3個元素的全排列問題變為求解2個元素的全排列問題,問題進一步變小。

然後是第二步:解決問題

什麼時候子問題變得最小?當只剩下乙個元素的時候,問題變得最小,此時停止遞迴,直接求解。這裡又引發乙個問題,如何求解?你或許會想,這裡只有乙個元素,直接輸出就行了,但是你可能忘了,在第三步合併問題的時候,元素從乙個變為兩個時(或者更多的時候),不作為顯然是錯誤的。對於全排列問題,從觀察上,我們知道,如果不分解問題,只需要兩兩元素之間進行位置交換,我們就能得到所有的排列組合。因此,我們採取swap的方式。

最後是第三步:合併問題

將子問題組合成原問題

/*

全排列問題

*/#include

#include

#include

using

namespace

std;

void fullarrangement(vector

& vec, int begin, int end)

cout

<< endl;

}else

}}int main(int argc, char

const *argv)

; fullarrangement(vec, 0, vec.size() - 1);

return

0;}

二分搜尋演算法是乙個很簡單的演算法,它的解釋如下

在電腦科學中,二分搜尋(英語:binary search),也稱折半搜尋(英語:half-interval search)、對數搜尋(英語:logarithmic search),是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

實現二分搜尋演算法的方法有很多,常用的通過while迴圈或者for迴圈(由於過於簡單,這裡**就不貼出來了),又或者遞迴實現,這裡我們講遞迴實現的二分搜尋演算法。

對於二分搜尋,我們的目的是查詢該陣列是否存在某個值,如果運用分治方法,我們首先考慮它的三個步驟:

分解步驟

假設陣列為,我們要查詢這個元素,根據二分的思路,將陣列分為兩部分

解決步驟

比較當前中間值是否等於所需要查詢的值,再根據比較結果進行分解

合併步驟

通過解決子問題的解,返回原問題的解

步驟如下圖所示:

二分搜尋演算法

*/#include

#include

using

namespace

std;

// 返回val所在的下標

int binary_search(const

vector

& vec, int begin, int end, int val)

int mid = begin + (end - begin) / 2;

if (vec[mid] > val)

else

if (vec[mid] < val)

return mid;

}int main(int argc, char

const *argv)

; cout

<< binary_search(vec, 0, vec.size(), 4) + 1

<< endl;

return

0;}二分搜尋

大整數乘法

strassen矩陣乘法

歸排序快速排序

漢諾塔

分治策略(入門)

小編今天學習了一下 分治策略 參考 演算法導論 並用python 實現了一下 例項中的 方法。大家一起相互學習啦。首先是 插入排序的方法 時間複雜度為 n 2 實現如下 插入排序法 a 2,1,6,5,4,8,9 for i in range int len a for j in range int...

分治策略 快速排序

快速排序演算法是基於分治策略的另乙個排序演算法。其基本思想是 對輸入的子陣列a p r 按以下三個步驟進行排序。1 分解 divide 以a p 為基準元素將a p r 劃分成3段a p q 1 a q 和a q 1 r 使得a p q 1 中任何乙個元素小於等於a q 而a q 1 r 中任何乙個...

遞迴與分治策略

1 全排列問題 設r n 是要進行排列的n個元素。集合x中元素的全排列記為perm x 求r n 的全排列perm r n 用遞迴演算法求解 1 找出遞迴子結構性質 即原問題的解包含了子問題的解,且子問題的描述與原問題相同。這就可以用子問題的解來構造原問題的解。設r i r n 這是乙個子問題。設 ...