本章就乙個小問題研究了四種不同的演算法,重點強調了這些演算法的設計技術,綜合本章內容,告訴我們:複雜深奧的演算法有時可以極大地提高程式效能。
問題定義: 具有n個浮點數的向量x,求出輸入向量的任何連續子向量的最大和。
立方演算法:
maxsofar = 0;
for i = [0,n)
for j=[i,n)
sum = 0;
for k=[i,j]
sum += x[k]
maxsofar = max(maxsofar,sum);
平方演算法:
maxsofar = 0;
for i =[0,n)
sum = 0;
for j=[i,n)
sum+= x[j]
maxsofar= max(maxsofar,sum);
分治演算法:
float maxsum3(l,u)
if(l>u)
return 0;
if(l==u)
return max(0,x[l]);
lmax= sum = 0;
for(i=m;i>=l;i--)
sum += x[i];
lmax=max(lmax,sum);
rmax = sum= 0;
fori=(m,u]
sum += x[i]
rmax = max(rmax,sum);
returnmax(lmax+rmax,maxsum3(l,m),maxsum3(m+1,u));
呼叫方法: answer = maxsum3(0,n-1)
線性演算法:
maxsofar = 0;
maxendinghere = 0;
for i =[0,n)
maxendinghere= max(maxendinghere+x[i],0);
maxsofar= max(maxsofar,maxendinghere);
本章故事中的這些演算法給出了幾個重要的演算法設計
技術:1.儲存狀態,避免重複計算。通過使用一些空間來儲存中間計算結果,我們避免了花時間來對其重複計算。
2.將資訊預處理到資料結構中。
3.分治演算法。
4.掃瞄演算法。與陣列相關的問題經常可以通過思考「如何將x[0...i-1]的解擴充套件為x[0...i]地解來解決。
5.累積。
6.下界。確定相匹配的下界。
程式設計珠璣第八章 演算法設計技術
首先思考乙個問題,給定乙個含有n個元素的vector,找出其中最大的子向量 即所有元素之和為最大值 如果是都為正數,那麼問題變得十分簡單,整個vector即是最大子向量,但是如果是正數負數混合的形式呢?問題將變得複雜,接下來將簡要介紹幾種演算法的思路。其複雜度由最初的立方演算法降低到最終的線性演算法...
程式設計珠璣 第八章 演算法設計技術
一,概述 問題 求一維陣列中連續子向量的最大和。例如 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 ...