分析統計演算法的執行效率和記憶體資源消耗(時空複雜度分析)資料結構和演算法解決的是快和省的問題,那麼什麼樣的**執行得更快,什麼樣的**更省儲存空間便是複雜度分析的重點。
讓寫好的**跑一遍,通過統計和監控的手段獲得**執行時間以及記憶體占用情況的分析法叫事後估計法。事後估計法也是複雜度分析的一種手段,不過侷限性比較大:
不依賴具體的測試資料,對演算法的執行效率進行粗略估計的方法前提:下面這個**片段,第2行需要乙個unit_time, 第3行執行了n遍所以需要n*unit_time,
第4,5行各執行了n
2n^2
n2遍所以共需要2n2
2n^2
2n2*unit_time。所以整個**片需要t(n
)=(2
n2+n
+1)t(n)=(2n^2+n+1)
t(n)=(
2n2+
n+1)
*unit_time。
1. def cal
(n):
2. sum =03.
for i in
range
(n):
4.for j in
range
(n):
5. sum = sum + i * j
結論:
也即,演算法中所有**的執行時間 t(n) 與演算法中所有**的執行總次數f(n
)f(n)
f(n)
成正比:
t (n
)=o(
f(n)
)(2.1)
t(n) = o(f(n)) \tag
t(n)=o
(f(n
))(2
.1)式(2.1)就是大o複雜度表示法,其中n
nn為資料規模,o
oo 表示正比於。所以借助大o複雜度表示法,我們就可以簡單地以**執行的總次數來估計演算法執行時間。比如上面的例子中就是:t(n
)=o(
2n2+
n+1)
t(n)=o(2n^2+n+1)
t(n)=o
(2n2
+n+1
)大 o 時間複雜度也叫漸進時間複雜度(簡稱:時間複雜度),實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢。
另外,如果n 很大(特別特別大)時,所匯出的複雜度表示式中的常量、係數以及低階這三部分對於增長趨勢的影響都可以忽略。所以2.1中的例子的時間複雜度可表示為t(n
)=o(
n2)t(n)=o(n^2)
t(n)=o
(n2)
。王爭老師給出了三個分析**複雜度時實用的方法:
實際上,不用刻意去套用,這些都是很自然的,只要記得最後忽略掉常量、係數和低階三部分,以最大量級作為結果即可。
來自《資料結構與演算法之美》 王爭
上圖給出了常見的時間複雜度量級,大致可以分為以下兩類:
我們常說的np問題(non-deterministic polynomial,非確定多項式)也就是時間複雜度為非多項式量級的演算法問題。
注:空間複雜度(全稱:漸進空間複雜度),表演算法的儲存空間與資料規模之間的增長關係。
常見空間複雜度量級: 常量階o(1
)o(1)
o(1)
、線性階o(n
)o(n)
o(n)
、平方階o(n
2)o(n^2)
o(n2)等
複雜度分析 時間複雜度分析和空間複雜度分析
其實,只要講到資料結構與演算法,就一定離不開時間 空間複雜度分析。而且我個人認為,複雜度分析是整個演算法學習的精髓,只要掌握了它,資料結構和演算法的內容基本上就掌握了一半。1.時間複雜度分析 對於剛才羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個 o ...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...
複雜度分析(上)時間複雜度 空間複雜度
為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...