《資料結構與演算法分析--c語言描述》第二章筆記
主要記錄演算法分析的一些理論基礎,包括數學定義以及時間複雜度分析法等。
數學知識
關於時間複雜度的定義(目的在於建立乙個相對的級別關係):
定義一:θ(g(n)) =
定義三:ω(g(n)) =
幾條法則:
1/ 若t1(n)=o(f(n)), t2(n)=o(g(n)),
則t1(n)+t2(n)=o(max(f(n), g(n)))
t1(n)*t2(n)=o(f(n)* g(n))
2/若t(n)是以k次多項式,則t(n) = θ(n^k)
3/對於任意常數k,log以k為底n=o(n)
常見時間複雜度推論:
ο(1)<ο(log2(n))<ο(n)<ο(n*log2(n))<ο(n^2)<ο(n^3)<…<ο(2^n)<ο(n!)
程式語言中對於時間的估計
簡單語句
t=1;迴圈
一次for迴圈的執行時間至少是**塊內**執行時間總和t乘以迴圈次數n,t=t(迴圈裡面的語句複雜度)*n(迴圈次數);
特例:
int sum = 1;
while ( sum < n )
時間複雜度為o(log n)。
巢狀的for迴圈
從裡向外分析,假設兩層巢狀,執行的總時間為t=t*n1(外層迴圈次數)*n2(內層迴圈次數);
特例:
for ( i = 0; i < n; i++ )
}
時間複雜度為o(n^2)
順序語句
將各個語句的執行時間求和,t=t1+t2+...+tn;
分支語句
執行時間不超過判斷時間加上if...else...中的長者,t=t_if+t_ex;
遞迴函式
對於能拆解為for形式的遞迴,按for計算。如果不行則須列式計算。
時間複雜度的分析原則
1/例**:
for(i = 0; i < n; i++)
a[i]++;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
a[i][j]++;
相加後其時間為n+n^2,但是
低次項通常忽略,記為o(n^2).
2/例**
for(i = 0; i < n; i++)
其時間為2*n,但是
常數項通常忽略,記為o(n)
(完)
演算法 基礎知識
插入排序法示例 將想要插入的值搜尋找到合適的位置,之前的數值一一向後移動乙個位置,騰出乙個空位置給想要插入的數值。偽 instert sort a for j 2 to a.length key a j i j 1 while i 0 and a i key a i 1 a i i i 1 a i ...
演算法基礎知識
o 1 稱為不變複雜性 1項 1秒 10項 1秒 100個專案 1秒 專案的數量仍然增加10倍,但o 1 的比例因子總是1。o log n 稱為對數複雜度 1項 1秒 10項 2秒 100項 3秒 1000項 4秒 10000項 5秒 計算次數只會增加輸入值的對數。因此,在這種情況下,假定每個計算需...
演算法基礎知識
一 插入排序 撲克牌原理 n 2 原址 a 1,n 1 是排好序的,把第n個往前 二 分治法 歸併 nlgn 非原址 先分解 sort a,p,r if pa or b 三 分治法 最大子陣列問題 描述 尋找a的和最大的非空連續子陣列 解決 按中點分成兩段,遞迴找左右段各自的最大段,再找跨越中點的最...