如果乙個演算法的執行次數是 t(n),那麼只保留最高次項,同時忽略最高項的係數後得到函式 f(n),此時演算法的時間複雜度就是 o(f(n))。為了方便描述,下文稱此為 大o推導法。
由此可見,由執行次數 t(n) 得到時間複雜度並不困難,很多時候困難的是從演算法通過分析和數**算得到 t(n)。對此,提供下列四個便利的法則,這些法則都是可以簡單推導出來的,總結出來以便提高效率。
對於乙個迴圈,假設迴圈體的時間複雜度為 o(n),迴圈次數為 m,則這個
迴圈的時間複雜度為 o(n×m)。
此時時間複雜度為 o(n × 1),即 o(n)。void
afunc
(int n)
}
對於多個迴圈,假設迴圈體的時間複雜度為 o(n),各個迴圈的迴圈次數分別是a, b, c…,則這個迴圈的時間複雜度為 o(n×a×b×c…)。分析的時候應該由里向外分析這些迴圈。
此時時間複雜度為 o(n × n × 1),即 o(n^2)。void
afunc
(int n)
}}
對於順序執行的語句或者演算法,總的時間複雜度等於其中最大的時間複雜度。
此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。void afunc(int n)
}// 第二部分時間複雜度為 o(n)
for(int j = 0; j < n; j++)
}
對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。
此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。void afunc(int n)
}} else
}}
斐波那契數列:
執行次數,t(0) = t(1) = 1,同時 t(n) = t(n - 1) + t(n - 2) + 1,這裡的 1 是其中的加法算一次執行。long
afunc
(int n)
else
}
顯然 t(n) = t(n - 1) + t(n - 2) 是乙個斐波那契數列,通過歸納證明法可以證明,當 n >= 1 時 t(n) < (5/3)^n,同時當 n > 4 時 t(n) >= (3/2)^n。
所以該方法的時間複雜度可以表示為 o((5/3)^n),簡化後為 o(2^n)。
對數階o(nlogn)
在while迴圈裡面,每次都將 i 乘以 2,乘完之後,i 距離 n 就越來越近了。我們試著求解一下,假設迴圈x次之後,i 就大於 2 了,此時這個迴圈就退出了,也就是說 2 的 x 次方等於 n,那麼 x = log2n【這裡是log 2的n次方,符號不會敲】int i =1;
while
(i
也就是說當迴圈 log2n【這裡是log 2的n次方,符號不會敲】 次以後,這個**就結束了。因此這個**的時間複雜度為:o(logn)線性對數階o(nlogn)
線性對數階o(nlogn) 其實非常容易理解,將時間複雜度為o(logn)的**迴圈n遍的話,那麼它的時間複雜度就是 n * o(logn),也就是了o(nlogn)。
就拿上面的**加一點修改來舉例:
時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。for
(m=1
; m)}
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的乙個量度,同樣反映的是乙個趨勢,我們用 s(n) 來定義。
空間複雜度比較常用的有:o(1)、o(n)、o(n²),我們下面來看看:
空間複雜度 o(1)
如果演算法執行所需要的臨時空間不隨著某個變數n的大小而變化,即此演算法空間複雜度為乙個常量,可表示為 o(1)
舉例:
**中的 i、j、m 所分配的空間都不隨著處理資料量變化,因此它的空間複雜度 s(n) = o(1)int i =1;
int j =2;
++i;
j++;
int m = i + j;
空間複雜度 o(n)
我們先看乙個**:
這段**中,第一行new了乙個陣列出來,這個資料占用的大小為n,這段**的2-6行,雖然有迴圈,但沒有再分配新的空間因此主要看第一行 o(n)int
m = new int
[n]for
(i=1
; i<=n;
++i)
演算法的複雜度 時間複雜度與空間複雜度
通常,對於乙個給定的演算法,我們要做 兩項分析。第一是從數學上證明演算法的正確性,這一步主要用到形式化證明的方法及相關推理模式,如迴圈不變式 數學歸納法等。而在證明演算法是正確的基礎上,第二步就是分析演算法的時間複雜度。演算法的時間複雜度反映了程式執行時間隨輸入規模增長而增長的量級,在很大程度上能很...
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
1 if i 1 2 a 1 result 3 4 result n 2 result 1000 1000 3 array.push a array.pop 4 map.set 1,1 map.get 1,1 在計算複雜度的時候,o 1 一般會被忽略。1 for let i 0 i n i 2 wh...