演算法篇 演算法分析

2021-10-06 09:02:53 字數 2288 閱讀 3272

一些數學定義

時間複雜度

最大子串行和問題

給定兩個函式f和g,

1. 如果有正的常數c和n,使得當n≥n時,f(n) ≤ g(n),那麼f(n) = o(g(n))

2. 如果有正的常數c和n,使得當n≥n時,f(n) ≥ g(n),那麼f(n) = ω(g(n))

3. 如果f(n) = o(g(n)),並且f(n) = ω(g(n)),那麼f(n) = θ(g(n))

以上的定義在函式之間建立了一種級別,增長率高的,級別要高,比如

對於我們比較兩個函式時,通常忽略係數和較低項,只保留最高項對比,比如

常用函式增長率

給定乙個整數序列a1, a2, a3, ... an,求其子序列和的最大值。[1]

例如:a = -8,14,5,-3,6,8,-14,10,最大值為30,從a2到a6。

解法1:

窮舉所有的子串行然後進行計算,如下:

}分析:

一共n個數,從第i個數開始的子串行有n-i個,一共要計算的加法次數是:

那麼n個數一共要計算的加法次數是:

解法2:

對於從乙個數開始的子串行,我們沒有必要反覆的從這個數開始計算,解法1中我們計算了:1,1+2,1+2+3,1+2+3+4....

我們可以表示為k = 1, k = k+2, k = k+3......這個演算法的時間複雜度是o(n^2)

int findmax2(vector& l)

int m = (start+end)/2;

//計算左半部分最大子串行

int left_max = findmax3(l,start,m);

//計算右半部分最大子串行

int right_max = findmax3(l,m+1,end);

int m2left = 0;

int m2right = 0;

int temp = 0;

//從中間逐步向左計算最大值

for(int i=m;i>=start;i--)

//從中間逐步向右計算最大值

temp = 0;

for(int i=m+1;i<=end;i++)

//m2left+m2right就是中間部分的最大子串行h值

if(left_max>right_max)

return max(left_max,m2left+m2right);

else

return max(right_max,m2left+m2right);

}

分析:

每次砍一半,所以一共砍logn次,為了計算中間的最大序列,我們要從middle開始分別向左向右掃瞄,這個複雜度是n。

第一層如下:

第二層劃分為兩段,每段掃瞄n/2個元素,還是n個

第三層劃分為4段,每段掃瞄n/4個元素,還是n個

所以一共logn層,每層掃瞄n個元素,複雜度為o(nlogn)

解法4

最大子串行的開頭肯定不是負數,同樣的,對於第i個和第j個元素,如果從i到j的子串行和為負值,那麼從i到j一定不是最優子串行的開頭。該演算法的複雜度顯然為o(n)

int findmax4(vector&l)

return max_value;

}

[1] mark allen weiss. 資料結構與演算法分析。北京:電子工業出版社,2016:45-

演算法設計 分析篇(攤銷分析)

攤銷分析 攤銷是一種,功過相抵的思想 中國古代,某大臣因為犯錯,看在立下汗馬功勞的份上,從輕發落。圖靈被發現時個同性戀者,但因破解了德國海軍密碼,抵消罪過。攤銷分析vs平均情況分析 以一場籃球比賽為例。平均情況分析 比賽結束後乙個隊伍的得分就是所有隊員得分的總分,除以隊員數,就是每個隊員平均得分。攤...

演算法篇 典型相關分析 CCA 理論

實際問題中,常常需要研究多個變數之間的相關關係,這個時候,可以試下典型相關分析 canonical correlation analysis 這種演算法由h hotelling於1936 年提出,在19世紀 70 年代臻於成熟。早期因為需要大量的矩陣計算,所以沒有廣泛應用。現代計算機提高了cca的地...

演算法設計與分析之 排序篇

本篇列出了以下演算法 1 二分查詢 2 氣泡排序 3 插入排序 4 二路歸併排序 5 快速排序 6 選擇排序 二分查詢 public static intarraybinarysearch int array,int key if key array mid else return 1 氣泡排序 p...