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

2021-06-03 18:52:07 字數 1220 閱讀 4383

本章就乙個小問題研究了四種不同的演算法,重點強調了這些演算法的設計技術,綜合本章內容,告訴我們:複雜深奧的演算法有時可以極大地提高程式效能。

問題定義: 具有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 ...