時間 空間複雜度分析 01

2021-10-05 09:53:40 字數 2212 閱讀 4649

分析乙個演算法指的是確定其執行時所需要使用的資源的量(如時間和記憶體)

演算法大多被設計用來擔任處理大量輸入的工作,所以演算法的效率和複雜度取決於時間和空間複雜度。

時間複雜度就是乙個演算法在一定輸入量下的執行時間。相似的,空間複雜度是在程式執行期間是需要使用的計算機記憶體的大小。

總的來說,程式所需要的空間取決於以下兩個部分:

最壞情況、平均情況、最優情況

以陣列排序為例

考慮這樣乙個陣列

source:1 2 3 4 5 6 7 8 9 10

我們要將其按逆序排序。應該的結果為:10 9 8 7 6 5 4 3 2 1

source陣列與我們排序後的結果相比,是完全逆序的。在這一情況下,我們稱之為最壞情況。最壞情況複雜度

而如果source為:10 9 8 7 6 5 4 3 2 1

我們可以發現,這一陣列已經完全排序好了,這稱之為最優情況。最優情況複雜度

平均情況複雜度:是指在輸入為隨機的情況下的執行時間。

均攤情況複雜度:在**執行的所有複雜度情況中絕大部分是低階別的複雜度,個別情況是高階別複雜度且發生具有時序關係時,可以將個別高階別複雜度均攤到低級別複雜度上。基本上均攤結果就等於低級別複雜度。

最好的演算法毋庸置疑,是花費最少情況和最少記憶體的演算法。但是,在很多情況下,我們設計不出這樣的演算法。不同的演算法大多有不同的特點。有的花費更少的時間,有點花費更少的空間。

我們一般根據應用場景選擇合適的演算法,比如在可用記憶體有限的情況下,我們不得不優先考慮空間占有率低的。

而在記憶體充足的情況下,我們更關心時間,特別是現在。你可以想象乙個軟體,對乙個**排序就要花費你喝一杯咖啡的情況嗎?

我們如何來評估時間複雜度呢。

我們用乙個函式f(n)來表示,n是輸入量的大小。

這樣我們可以評估執行時間隨著輸入量的變化。

最常使用的就是o(big o notation)

如果這個函式是線性的(沒有循壞和遞迴),它的時間複雜度就是其輸入量的大小。然而,當乙個演算法包含迴圈的時候,演算法的效率會因為輸入量的變化而發生很大的變化。我們設計演算法的目的就是盡可能地減少這種變化。

for

(i=0

;i<

100;i++

) statement block

我們可以知道這個迴圈迭代了100次。在這一情況下,f(n) = n

再考慮如下**

for

(i=0

;i<

100;i+=2

) statement block

這一迴圈僅迭代了50次。f(n) = n/2

for

(i=1

;i<

1000

;i*=2)

statement block;

for(i=

1000

;i>=

1;i/=2

) statement block;

在第乙個裡面,i每次被乘以2。這個迴圈僅執行了10次而不是1000次。

第二個也類似。

f(n) = log n

for

(i=0

;i<

10;i++

)for

(j=1

; j<

10;j*=2

) statement block

f(n) = nlog n

for

(i=0

;i<

10;i++

)for

(j=0

; j<

10;j++

) statement block;

f(n) = n*n

for

(i=0

;i<

10;i++

)for

(j=0

; j<=i;j++

) statement block

1+2+3+…+9+10 = 55

f(n) = n (n + 1)/2

未完…

01 複雜度分析(上) 時間 空間複雜度講解

我們都知道,資料結構和演算法本身解決的是 快 和 省 的問題,即如何讓 執行得更快,如何讓 更省儲存空間。所以,執行效率是演算法乙個非常重要的考量指標。那如何來衡量你編寫的演算法 的執行效率呢?這裡就要用到時間 空間複雜度分析。1 什麼是複雜度分析?複雜度也叫漸進複雜度,包括時間複雜度和空間複雜度,...

複雜度分析 時間複雜度 空間複雜度

執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...

複雜度分析 時間複雜度分析和空間複雜度分析

其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...