怎樣理解時間複雜度和空間複雜度

2021-07-27 02:31:31 字數 2975 閱讀 6725

時間複雜度並不是表示乙個程式解決問題需要花多少時間,而是當問題規模擴大後,程式需要的時間長度增長得有多快。也就是說,對於高速處理資料的計算機來說,處理某乙個特定資料的效率不能衡量乙個程式的好壞,而應該看當這個資料的規模變大到數百倍後,程式執行時間是否還是一樣,或者也跟著慢了數百倍,或者變慢了數萬倍。不管資料有多大,程式處理花的時間始終是那麼多的,我們就說這個程式很好,具有o(1)的時間複雜度,也稱常數級複雜度;資料規模變得有多大,花的時間也跟著變得有多長,這個程式的時間複雜度就是o(n),比如找n個數中的最大值;而像氣泡排序、插入排序等,資料擴大2倍,時間變慢4倍的,屬於o(n^2)的複雜度。還有一些窮舉類的演算法,所需時間長度成幾何階數**,這就是o(a^n)的指數級複雜度,甚至o(n!)的階乘級複雜度。不會存在o(2*n^2)的複雜度,因為前面的那個「2」是係數,根本不會影響到整個程式的時間增長。同樣地,o (n^3+n^2)的複雜度也就是o(n^3)的複雜度。因此,我們會說,乙個o(0.01*n^3)的程式的效率比o(100*n^2)的效率低,儘管在n很小的時候,前者優於後者,但後者時間隨資料規模增長得慢,最終o(n^3)的複雜度將遠遠超過o(n^2)。我們也說,o(n^100)的複雜度小於o(1.01^n)的複雜度。要理解時間複雜度,我們先知道時間頻度。

(1)時間頻度: 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。

(2)時間複雜度 :在剛才提到的時間頻度中,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)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

時間頻度不同,但時間複雜度可能相同。如: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的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低

(3)求時間複雜度

o(1)

x=91; y=100;

while(y>0) if(x>100)

else x++;

解答: t(n)=o(1),因為這段程式的執行是和n無關的,也就是當n增大的時候,程式所需時間增長常數階的函式。

o(n)

a=0;b=1;                      

for (i=1;i

<=n;i++)

解答: t(n)=o(n),因為這段程式的執行是和n有關的,也就是當n增大的時候,程式需要執行的**與n成線性增長,也就是頻度為2n,時間複雜度為n。

o(n^2)

a =0;b=0;

for (i=1;i

i++)

}

解答: t(n)=o(n^2),a++**執行n-1次,b++執行n*(2n+1)次,t(n) = n-1 +n*(2n+1), 也就是當n增大的時候,程式需要執行的**與n2成線性增長,時間複雜度為o(n^2)。

o(log2n)

i=1;   

while (i

<=n)

i=i*2;

解答: t(n)=o(log2n),設i=i*2的頻度是f(n), 則:2^f(n)<=n;f(n)<=log2n ; 取最大值f(n)=log2n;

時間複雜度也就是o(log2n )。

(4)最壞時間複雜度和平均時間複雜度  

最壞情況下的時間複雜度稱最壞時間複雜度。一般不特別說明,討論的時間複雜度均是最壞情況下的時間複雜度。 這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上界,這就保證了演算法的執行時間不會比任何更長。

在最壞情況下的時間複雜度為t(n)=o(n),它表示對於任何輸入例項,該演算法的執行時間不可能大於o(n)。 平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,演算法的期望執行時間。

指數階0(2n),顯然,時間複雜度為指數階0(2n)的演算法效率極低,當n值稍大時就無法應用。

一般來說,如果乙個演算法的複雜度為c 、 log2n 、n 、 n*log2n ,那麼這個演算法時間效率比較高 ,如果是2^n ,3^n ,n!,那麼演算法所用的時間隨n的增大急劇增加,演算法的時間效率比較低。

(5)常用的演算法的時間複雜度和空間複雜度

乙個程式的空間複雜度是指執行完乙個程式所需記憶體的大小。利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。乙個程式執行時除了需要儲存空間和儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。程式執行時所需儲存空間包括以下兩部分。  

(1)固定部分。這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即**空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間。

(2)可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。

乙個演算法所需的儲存空間用f(n)表示。s(n)=o(f(n))  其中n為問題的規模,s(n)表示空間複雜度。

[2]

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...