一些數學定義
時間複雜度
最大子串行和問題
給定兩個函式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...