原題是乙個一維模式識別的題:求n個浮點數向量中連續若干個子向量中的最大和。
在書中共討論了四種演算法:
第一種演算法是最笨的辦法,利用三重迴圈求出每乙個子向量的和,然後求出其中的最大值,其時間複雜度為o(n3)
int maxvect(int *x,int n)
int mid = (start+end)/2;
int maxleftsum = maxsubsum2(num,start,mid);
int maxrightsum = maxsubsum2(num, mid+1, end);
res = maxleftsum > maxrightsum ? (maxleftsum) : (maxrightsum);
int leftboder = mid;
int leftbodersum = 0, leftsum = 0;
while (leftboder >= start)
int rightboder = mid+1;
int rightbodersum = 0, rightsum = 0;
while (rightboder <=end)
int maxcentersum = rightbodersum + leftbodersum;
if (maxcentersum > res)
res = maxcentersum;
return res;
}
第四種演算法掃瞄演算法。它的思想是只掃瞄一次,記下遇到的子向量的總和最大的子向量,它的問題是如何有x[0...i-1]擴充套件為x[0...i],,它的做法是設立乙個結束標誌maxending,它的時間複雜度為o(n)
int maxvect(int *x,int n)
{int maxsofar=0;
int maxendnig=0;
for(int i=0;i
在實際比較幾種演算法的執行時間時,我非常直觀的體會的演算法對於程式執行效能的影響。我用了10000個數的陣列,第四種演算法幾乎瞬間完成,而第一種演算法就需要若干分鐘,具體效能比較我沒有截圖,不過《程式設計珠璣》第8章有詳細的對比,有興趣的檢視,資料量越大,這種差距越大。
最後書中總結了幾種演算法設計的技術:
1.儲存中間狀態,避免重複計算。
2.預處理資料,存入乙個結構中,如演算法2中的累計表,是非常常用的乙個手段。
3. 分治演算法。
3. 掃瞄演算法。利用x[0...i],擴充套件到x[0...i+1]
演算法設計技術 程式設計珠璣
演算法設計技術 2010年10 月3日星期日 程式設計珠璣問題演算法 typedefstruct m voidsetm m m,int s,int e,int v voidcpym m des,m src 迭代演算法,演算法複雜度為o n m findmaxsubset int a,intarray...
2 程式設計珠璣筆記二演算法
2 程式設計珠璣筆記二演算法 本篇名言 真實與樸實是天才的寶貴品質。斯坦尼斯拉夫斯基 我一直認為程式設計師花再多時間在資料結構和演算法上都不為過,這也是當碼農昇華為碼神的關鍵。演算法對軟體系統影響非常巨大,工作很多時候是進行效能調優工作對此深有體會,乙個稍微少一點的演算法在高併發壓力的時候表現出來的...
程式設計珠璣第八章 演算法設計技術
本章就乙個小問題研究了四種不同的演算法,重點強調了這些演算法的設計技術,綜合本章內容,告訴我們 複雜深奧的演算法有時可以極大地提高程式效能。問題定義 具有n個浮點數的向量x,求出輸入向量的任何連續子向量的最大和。立方演算法 maxsofar 0 for i 0,n for j i,n sum 0 f...