程式設計珠璣第八章 演算法設計技術

2021-07-15 03:23:45 字數 1090 閱讀 7144

首先思考乙個問題,給定乙個含有n個元素的vector,找出其中最大的子向量(即所有元素之和為最大值)。如果是都為正數,那麼問題變得十分簡單,整個vector即是最大子向量,但是如果是正數負數混合的形式呢?問題將變得複雜,接下來將簡要介紹幾種演算法的思路。其複雜度由最初的立方演算法降低到最終的線性演算法!(提供的**細節處如資料型別例如int之類自己根據情況填加)

立方演算法,思想很簡單,即遍歷所有情況:

maxfactor = 0;

for (i = 0;ifor(j = i; j < n ; j++)

sum = 0;

for(k = i; k < j ; k++)

sum += x[k];

maxfactor = max(maxfactor,sum);//此處採用字元?:的形式更好

}

其實不必每有乙個[i,j]便重新求和一次,可以在遍歷的過程中進行求和,因此,可以降低演算法的複雜度為平方演算法:

maxfactor = 0;

for (i = 0;isum = 0;

for(j = i; j < n ; j++)

sum += x[j];

maxfactor = max(maxfactor,sum);

}

使用常見的分治演算法又可以進一步的降低演算法的複雜度o(nlogn):

float maxsum(1,u)

//the right

rightmax = sum = 0;

for(i = m ; i < n ; i++)

return

max(leftmax+rightmax,maxsum(1,m),max(m+1,n));

}

maxfactor = 0;

maxending = 0;

for (i = 0; i

< n; i++)

注意:複雜度低的演算法不意味著對於任何規模的問題,執行時間都低於複雜度高的演算法,若通過畫製時間曲線,會發現有乙個拐點,在拐點處相等,規模越大,低複雜度演算法的優勢越明顯。

程式設計珠璣第八章 演算法設計技術

本章就乙個小問題研究了四種不同的演算法,重點強調了這些演算法的設計技術,綜合本章內容,告訴我們 複雜深奧的演算法有時可以極大地提高程式效能。問題定義 具有n個浮點數的向量x,求出輸入向量的任何連續子向量的最大和。立方演算法 maxsofar 0 for i 0,n for j i,n sum 0 f...

程式設計珠璣 第八章 演算法設計技術

一,概述 問題 求一維陣列中連續子向量的最大和。例如 a 6 則最大連續子向量的和 為 10 8 18 1 解法一 簡單演算法 include define max a,b a b a b int main int i,j,k int sum 0 int maxsofar 0 for i 0 i 6...

《程式設計珠璣》學習記錄第八章演算法設計技術

演算法的設計這個問題太過龐大,對於乙個程式設計師來說,最好的辦法就是多接觸不同的演算法,並且時刻總結。問題 乙個一維的整數陣列,有n個元素,元素有正數也有負數。找到陣列中任意連續個元素最大和。方法一 使用暴力法找到所有的子串行,並計算出所有子串行的和,結果自然就得到了。這種方法的事件複雜度是o n ...