今天的演算法是乙個叫分而治之的思想,這個思想感覺對於程式優化,節約時間很有幫助,但是對於實際中的用途還是稍微差了點!這個思想很簡單即使把乙個大的程式,分成一小段一小段的區分步執行,這樣的好處就是減少複雜度,比如我們要計算2的100次方,我們通常的思想就是
for (int i = 0 ; i < 100 ; i++)
好吧這麼計算真的很麻煩,我們可以這樣
int step = 2*2 ;
for (int i = 0 ; i < 50 ; i++)
這樣可以節約一半的時間,所以他的效率還是蠻高的,但是除了這中比較簡單的例項以外,其他的分而治之的方法,真的是少子又少。下面講乙個歸併排序和快速排序的方法
歸併排序:
感覺歸併排序就是插入排序,但是可能複雜度要小一些,他的思路就是先將數列分成兩組,再將每一組分成兩組,直至將數列全部分成乙個數,再兩個兩次合併,再進行插入排序。由於不會插圖,這個排序本身並不好講,所以我也不說太多了。
快速排序:
就是選擇最後乙個數,比他大的放左邊,比他小的放右邊,在後再對剩下的陣列分別做這個方法的遞迴。
這裡面看到了乙個快速乘積的演算法叫做karasuba演算法:(這個網上自己搜尋去吧,他講的仔細)
下面是幾個分治演算法的例題
就是乙個籬笆上的木板高低不是很統一,要找出籬笆上最大的長方形面積?
#include
#include
using namespace std;
int main()
for (int i = 0; i < data.size(); i++)
break;
}temp_num += data.at(i);
if (temp_num > final_num && j == data.size()-1)}}
cout << "最大的和是" << final_num;
char ch;
cin >> ch;
return 0 ;}
以上是我的答案,但是我真的想說自己的演算法真的是太low了,因為是個人就能想得到,書上寫的演算法則是將這個問題分成3種情況
在選擇一塊木板的情況下,最大的長方形在左邊,在右邊,和在木板的兩邊
即我們對每個木板進行訪問,同時判斷如果在訪問一塊木板的時,發現木板兩邊的木板都高於該木板,則繼續往外擴充套件,以此類推。
粉絲見面會問題:
輸入乙個樂隊組合成員的男女順序,再輸入粉絲團的男女順序,粉絲團每個人依次走過樂團成員,並與之擁抱。其中出現粉絲是男的,樂團的隊員的男的情況則改擁抱為握手,請問樂團有多少次全體隊員都能擁抱:
#include
#include
#include
using namespace std;
int main()
for (string::iterator it = fans.begin(); it < fans.end(); it++)
for (int i = 0; i < vector_fans.size() - vector_team.size() + 1; i++)
vector_last.push_back(temp);
cout << endl << temp;
}for (vector::iterator it = vector_last.begin(); it < vector_last.end(); it++)
}cout << "同時擁抱次數" << num;
char a;
cin >> a;
return 0;}
大概思路就是把女的看作0 ,把男的看作1 ,然後將兩個序列看作兩個數,然後將其相稱,判斷其中結果中為0 的個數,其中比不包括不是全體隊員的情況。
分而治之演算法
演算法是問題的分步驟解決的方法。分而治之的思想是 有很多問題,可以劃分為多個小問題,而小問題本身是易於解決的,那麼就通過找到 劃分方法 得到小問題後,最終解決原問題。一 是否所有問題都能劃分成小問題?比如1 1 可以劃分麼?不行。因此並不是所有問題都能夠劃分。二 怎樣的問題能夠劃分?和規模n相關的,...
演算法設計與分析 分而治之演算法 金塊問題
目錄 題目描述 問題分析 編寫 列印結果 老闆有一袋金塊 共n塊,n是2的冪 n 2 最優秀的雇員得到其中最重的一塊,最差的雇員得到其中最輕的一塊。假設有一台比較重量的儀器,希望用最少的比較次數找出最重和最輕的金塊。對於一般思路 通過乙個函式max進行n 1次比較來找到最重的金塊,然後再從餘下的n ...
分而治之 D C)
分而治之 能將問題逐步分解,但並非可用於解決問題的演算法,而是一種解決問題的思路。分而治之演算法是遞迴的,使用分而治之 d c 解決問題的過程包括兩個步驟 找出遞迴邊界條件,這種條件必須盡可能簡單 不斷地將問題分解 或者說縮小規模 直到符合遞迴邊界條件。注意 假設要將一塊地均勻地分成方塊,確保分出的...