時間頻率乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為時間頻度。記為t(n)。t (n) = ο(f (n))表示存在乙個常數c,使得在當n趨於正無窮時總有 t (n) ≤ c * f(n)。簡單來說,就是t(n)在n趨於正無窮時最大也就跟f(n)差不多大。也就是說當n趨於正無窮時t (n)的上界是c * f(n)。其雖然對f(n)沒有規定,但是一般都是取盡可能簡單的函式。例如,o(2n2+n +1) = o (3n2+n+3) = o (7n2 + n) =o ( n2 ),一般都只用o(n2)表示就可以了。注意到大o符號裡隱藏著乙個常數c,所以f(n)裡一般不加係數。如果把t(n)當做一棵樹,那麼o(f(n))所表達的就是樹幹,只關心其中的主幹,其他的細枝末節全都拋棄不管。時間複雜度在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式。記作t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度,簡稱時間複雜度。
在各種不同演算法中,若演算法中語句執行次數為乙個常數,則時間複雜度為o(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如t(n)=n2+3n+4與t(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為o(n2)。 按數量級遞增排列,常見的時間複雜度有:常數階o(1),對數階o(log2n),線性階o(n),線性對數階o(nlog2n),平方階o(n2),立方階o(n3),..., k次方階o(nk),指數階o(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。
從圖中可見,我們應該盡可能選用多項式階o(nk)的演算法,而不希望用指數階的演算法。
常見的演算法時間複雜度由小到大依次為:ο(1)<ο(log2n)<ο(n)<ο(nlog2n)<ο(n^2)<ο(n^3)<…<ο(2^n)<ο(n!)
⑴ 找出演算法中的基本語句;
演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
⑵ 計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。
⑶ 用大ο記號表示演算法的時間效能。
將基本語句執行次數的數量級放入大ο記號中。
如果演算法中包含巢狀的迴圈,則基本語句通常是最內層的迴圈體,如果演算法中包含並列的迴圈,則將並列迴圈的時間複雜度相加。例如:
for(i=1;i第乙個for迴圈的時間複雜度為ο(n),第二個for迴圈的時間複雜度為ο(n^2),則整個演算法的時間複雜度為ο(n+n^2)=ο(n^2)。
(1).對於一些簡單的輸入輸出語句或賦值語句,近似認為需要o(1)時間
(2).對於順序結構,需要依次執行一系列語句所用的時間可採用大o下"求和法則"
求和法則:是指若演算法的2個部分時間複雜度分別為 t1(n)=o(f(n))和 t2(n)=o(g(n)),則 t1(n)+t2(n)=o(max(f(n), g(n)))
特別地,若t1(m)=o(f(m)), t2(n)=o(g(n)),則 t1(m)+t2(n)=o(f(m) + g(n))
(3).對於選擇結構,如if語句,它的主要時間耗費是在執行then字句或else字句所用的時間,需注意的是檢驗條件也需要o(1)時間
(4).對於迴圈結構,迴圈語句的執行時間主要體現在多次迭代中執行迴圈體以及檢驗迴圈條件的時間耗費,一般可用大o下"乘法法則"
乘法法則: 是指若演算法的2個部分時間複雜度分別為 t1(n)=o(f(n))和 t2(n)=o(g(n)),則 t1*t2=o(f(n)*g(n))
(5).對於複雜的演算法,可以將它分成幾個容易估算的部分,然後利用求和法則和乘法法則技術整個演算法的時間複雜度
另外還有以下2個運算法則:(1) 若g(n)=o(f(n)),則o(f(n))+ o(g(n))= o(f(n));(2) o(cf(n)) = o(f(n)),其中c是乙個正常數
(1)、o(1)
temp=i;
i=j;
j=temp;
以上三條單個語句的頻度均為1,該程式段的執行時間是乙個與問題規模n無關的常數。演算法的時間複雜度為常數階,記作t(n)=o(1)。注意:如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。(2)、o(n^2)
2.1. 交換i和j的內容
sum=0;// (一次)
for(i=1;i<=n;i++)// (n次)
sum++; //(n^2次)
解:因為θ(2n^2+n+1)=n^2(θ即:去低階項,去掉常數項,去掉高階項的常參得到),所以t(n)= =o(n2);2.2.
for (i=1;i該程式的時間複雜度t(n)=o(n^2).
當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。
(3)、o(n)
a=0;
b=1; ①
for (i=1;i<=n;i++) ②
解: 語句1的頻度:2,
語句2的頻度: n,
語句3的頻度: n-1,
語句4的頻度:n-1,
語句5的頻度:n-1,
t(n)=2+n+3(n-1)=4n-1=o(n).
(4)、o(log2n)
i=1; ①
while (i<=n)
解: 語句1的頻度是1,
設語句2的頻度是f(n), 則:2^f(n)<=n;f(n)<=log2n
取最大值f(n)=log2n,
t(n)=o(log2(n))
(5)、o(n3)
for(i=0;i解:當i=m, j=k的時候,內層迴圈的次數為k當i=m時, j 可以取 0,1,...,m-1 , 所以這裡最內迴圈共進行了0+1+...+m-1=(m-1)m/2次所以,i從0取到n, 則迴圈共進行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6所以時間複雜度為o(n3).
演算法時間複雜度空間複雜度
演算法 是解決某一類問題的通法,即一系列清晰無歧義的計算指令。每個演算法只能解決具有特定特徵的一類問題,但乙個問題可由多個演算法解決。乙個演算法應該有以下五個方面的特性 比較演算法的優劣我們從兩個維度去進行考量 時間 空間 時間複雜度,空間複雜度 找出基本語句 演算法中執行次數最多的那條語句就是基本...
演算法 時間複雜度 空間複雜度
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...
演算法的時間複雜度 空間複雜度
時間複雜度和空間複雜度是度量演算法效率的常用指標 事後統計,不常用 事前統計影響因素 演算法策略 問題規模 程式語言 質量 機器執行指令的速度 撇開軟硬體的影響,演算法執行工作量的大小只依賴於問題的規模 通常用整數n表示 乙個演算法是由控制結構 順序,分支,迴圈三種 和原操作 指固有資料型別的操作 ...