1. 程式人生 > >資料結構時間複雜度和空間複雜度

資料結構時間複雜度和空間複雜度

(1)演算法O(n),關注n的階數,當數十分大的時候,常數可以忽略。O(n)又稱為大O記法。

(2)T(n)=O(f(n)),隨著n變化而變化,f(n)是某個函式,執行的次數等於時間,一般情況下,T(n)增長最慢的演算法最優。

(3)3個求和演算法時間複雜度:O(1),O(n),O(n^2)甚至更多


(4)推到O(n):

1,,用1取代時間中所有加法常數(哪些可以忽略)。

2,在修改後的執行函式中,只保留最高項。

3,如果最高項存在且不是1,去除這個最高項相乘的常數。例如:3n^3  變成n^3,n的三次方。

4,得到最後結果是大O階

(一)常數階:

例如:

System.out.println("m 轉換為String型後與整數20的求和結果為: "+(str1+20));
System.out.println("str2和str3轉換成字串後相加結果: "+(str2+str3));

時間複雜度是:O(1)而不是O(2),只關注與n有關的。所有的加法常數,只給O(1)就可以了。

(二)線性階

 for(int j=0;j<n;j++)
{
System.out.println("m 轉換為String型後與整數20的求和結果為: "+(str1+20)); 
}

時間複雜度是:O(n)執行了n次,如果是100,則是100次,n=1000則是1000次

(三)平方階

例如:n=100,外層執行一次,內層執行100次,兩個迴圈則是100*100

for(int i=0;i<100;i++){
for(int j=0;j<100;j++)
System.out.print("下標【"+i+"】:"+number[i]+" ");
}

因此,時間複雜度是:O(n^2),如果是三個巢狀迴圈,則是O(n^3)。

例如:

for(int i=0;i<n;i++){
for(int j=i;i<n;j++)
System.out.print("下標【"+i+"】:"+number[i]+" ");
}

當外層i=0,n=100則內層迴圈執行n次,當i=1時候,記憶體迴圈執行n-1次。

於是:n+(n-1)+(n-2)+...+1=n(n+1)/2.高斯先生演算法。=n^2/2+n/2,根據大O推算,時間複雜度是:O(n^2),只算最高階。

(四)對數階

2^x=n,得出:x=log(2)n,x是迴圈的次數,log 2為底,小寫n)因此時間複雜度是:O(logn)

空間複雜度:

S(n)=O(f(n)),f(n)為語句關於n所佔儲存空間的函式。