演算法分析的基礎知識

2021-06-06 01:07:07 字數 1506 閱讀 6281

《資料結構與演算法分析--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的和最大的非空連續子陣列 解決 按中點分成兩段,遞迴找左右段各自的最大段,再找跨越中點的最...