演算法設計技術 程式設計珠璣

2022-03-20 17:33:18 字數 2040 閱讀 5446

演算法設計技術

2023年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_size)

;

for( i = 1; i

else

if(array_m[i].val> _4ret.val)

}

free(array_m ); array_m = 0;

return _4ret;

}

int main()

;

m m = findmaxsubset(a, sizeof(a) / sizeof(a[0]));

printf("l = %d, r = %d, val = %d\n", m.st, m.ed, m.val);

return 0;

}

重要的演算法設計技術:

儲存狀態,避免重複計算

。演算法2和4使用了簡單的動態程式設計形式。通過使用一些空間來儲存各個結果,我們就可以避免因重新計算而浪費時間。

將資訊預處理到資料結構中

,演算法2b中的cum

arr結構允許對子向量中的總和進行快速計算。

分治演算法

。演算法3使用了簡單的分治法形式;有關演算法設計方面的教科書介紹了更多高階的分治法形式。

掃瞄演算法

。有關陣列的問題經常可以通過詢問「我如何可以將x[o..i-1 ]的解決方案擴充套件為

x[0..i]

的解決方案?」的方式得到解決。演算法4同時儲存舊的答案和一些輔助資料,以計算新答案。

累計

。演算法2b使用了累積表,在累積表中,第i個元素包含、中前i個值的總和;在處理範圍時,這一類表很常見。例如,從本年初到10

月份為止的銷售額中減去本年初到2月份為止的銷售額,業務分析師可以確定3月份到}d月份之間的銷售額。

下限

。只有了解到他們的演算法已經是可能演算法中的最佳時,演算法設計師才可能安安穩穩地睡個好覺。為此,他們必須證明某個匹配下限。本問題的線性下限就是問題

6的主題,更加複雜的下限的求解可能會十分困難。演算法複雜度計算

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

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

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

首先思考乙個問題,給定乙個含有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...