如果對分治策略不懂的可以先看下這個:分治策略學習(一)
回顧一下分治策略的三步驟:
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 這是乙個子問題。設 ...