1. 程式人生 > >【資料結構】演算法的度量

【資料結構】演算法的度量

時間複雜度

T(n) = O(f(n))

它表示隨問題規模n的增大,演算法的時間增長率和f(n)的增長率相同,稱為演算法的時間漸進複雜度。其中f(n)是問題規模n的某個函式。

一般來說,隨著n的增長,T(n)增長最慢的演算法為最優演算法

要在 hash 表中找到一個元素是 O(1)

要在無序陣列中找到一個元素是 O(n)

訪問陣列的第 n 個元素是 O(1)

訪問連結串列的第 n 個元素是 O(n)

把輸入規模看成x軸,所花時間/空間看成y軸。

O(n) 就是 y = x, y隨x的增長而線性增長。一條斜線

O(1) 就是 y = 1,不管x如何變,y不變。一條與x平行的線

1. 常數階

O(1) 平行於x軸的線

var a = 1;	//執行一次
var b = 1;	//執行一次
var c = a + b;	//執行一次

2. 線性階 O(n) 一條斜線


3. 對數階 O(logn) 一漸近線


var count = 1;
while(count < n){
count = count * 2;
}

表示count乘以一次2就距離n更近一些,那麼乘以多少次2才能大於n退出迴圈就是2^x = n推出x = log2n

4. 平方階 O(n^2)


一條U形的拋物線,隨著問題規模n的增大,執行效率也會極大的下降

如下,對於外層迴圈來說執行了n次,為O(n),內層迴圈又執行了n次,共執行了n*n次,所以為n^2,即O(n^2)

var i, j;
for (i = 0; i < n; i++) {
for(j = 0; j < n; j++){
/* 時間複雜度為O(1)的內容 */
}
}

若將外迴圈的n改為m那麼它的複雜度為O(m * n)

var i, j;
for (i = 0; i < m; i++) {
for(j = 0; j < n; j++){
/* 時間複雜度為O(1)的內容 */
}
}


常見時間複雜度


時間複雜度的效率


空間複雜度

S(n)=O(f(n))

我們在判斷閏年的時候可以通過各種演算法來計算某一年是否是閏年,當然也可以事先算好某個範圍內的閏年儲存到資料庫中,當我們判斷在進行判斷的時候只需到資料庫中去查詢一下這個數值是否存在即可完成判斷。這就是傳說中的以空間換時間。