複雜度分析

2021-09-29 09:20:56 字數 2126 閱讀 6246

分析統計演算法的執行效率和記憶體資源消耗(時空複雜度分析)

資料結構和演算法解決的是的問題,那麼什麼樣的**執行得更快,什麼樣的**更省儲存空間便是複雜度分析的重點。

讓寫好的**跑一遍,通過統計和監控的手段獲得**執行時間以及記憶體占用情況的分析法叫事後估計法。事後估計法也是複雜度分析的一種手段,不過侷限性比較大:

不依賴具體的測試資料,對演算法的執行效率進行粗略估計的方法

前提:下面這個**片段,第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 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...