三、時間複雜度分析
上個章節中對大o時間複雜度分析做了闡述,這個章節看一下如何在具體的演算法中準確的分析出時間複雜度。
1.只關注執行次數最多的一段**
如前文說到,低階、常量、係數都會隨資料規模的增大而變的無關緊要因此被忽略。那麼在實際分析時間複雜度的時候,我們便可忽略這部分內容而直接去看**中執行次數最多的一段**。如上述示例一中,執行最多的就是for迴圈那部分執行了n次,因此它的時間複雜度就是o(n),示例二中執行最多的是巢狀內部的for迴圈,它執行了n²次,因此複雜度為o(n²)。
2.加法法則:總複雜度等於量級最大的那段**的複雜度
這個原則與上述原則實際相同,也就是在推倒開始到最後結果的過程,還是示例一種,第二行執行了一次,時間複雜度是o(1)常數級別,後邊的**時間複雜度是o(n),加一起之後取最大的就是o(n)。示例二也如此,可推出是o(n²)。
3.乘法法則:巢狀的**段時間複雜度等於巢狀內外**複雜度的乘積
在示例二中,巢狀了乙個**段,外層**時間複雜度o(n),內層**時間複雜度o(n),但是外層每執行1次,內層就要執行n次,因此最後的時間複雜度等於二者的乘積o(n²)。
四、幾種常見時間複雜度例項分析
雖然演算法有很多種,但是常見的時間複雜度量級並不多,按照量級可以分為兩種,一種是多項式量級:
常量階o(1)、對數階o(logn)、線性階o(n)、線性對數階(onlogn)、平方階o(n²)、立方階o(n³)....k次方階o(n^k)
另一種是非多項式量級:
指數階o(2^n)、階乘階o(n!)
對於非多項式量級,隨著執行次數增長,執行時間會急劇增加,因此暫不討論這種情況。主要看多項式量級的幾種複雜度。
1.o(1)
o(1)並不是表示只執行了一行**,而只是常量級用來表示時間複雜度的方式。即便如下三行**的**段,他的時間複雜度也是o(1)而不是o(3),o(1)時間複雜度常用於**的執行時間不會隨執行次數n線性增長的**段。通俗來說就是**中不存在複雜的邏輯結構,如迴圈、遞迴等。
int a = 9;
int b = 1;
int sum = a+b;
2.o(logn)、o(nlogn)
對數階複雜度比較常見,也相對複雜,看如下**:
public void sum(int n)
}空間複雜度分析的是儲存使用情況,因此無需分析執行時間,但是分析方式相同。第二行**中,我們申請了乙個空間儲存變數,他是常量階的,因此跟資料規模沒有關係。再看第三行**,申請了長度為n的陣列空間,因此它的空間複雜度為o(n),而後邊的**都沒有用到空間申請,因此這個**段的空間複雜度就是o(n)
資料結構時間複雜度和空間複雜度
1 演算法o n 關注n的階數,當數十分大的時候,常數可以忽略。o n 又稱為大o記法。2 t n o f n 隨著n變化而變化,f n 是某個函式,執行的次數等於時間,一般情況下,t n 增長最慢的演算法最優。4 推到o n 1,用1取代時間中所有加法常數 哪些可以忽略 2,在修改後的執行函式中,...
資料結構 時間複雜度和空間複雜度
通常我們衡量乙個演算法的複雜度時,會有兩種演算法效率分析方式 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,空間複雜度主要衡量一乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜...
資料結構 時間複雜度和空間複雜度
演算法 algorithm 是對特定問題求解步驟的一種描述。解決乙個問題往往有不止一種方法,演算法也是如此。那麼解決特定問題的多個演算法之間如何衡量它們的優劣呢?有如下的指標 1 時間複雜度 執行這個演算法需要消耗多少時間。2 空間複雜度 這個演算法需要占用多少記憶體空間。同乙個問題可以用不同的演算...