演算法設計的幾種思維(程式設計珠璣演算法學習總結)

2021-07-09 11:25:14 字數 1422 閱讀 5787

原題是乙個一維模式識別的題:求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...