時間空間複雜度分析

2021-10-18 19:40:07 字數 2609 閱讀 2720

1、概念:演算法的時間複雜度記做t(n), t(n) = o(f(n))。o(f(n))表示**執行時間隨資料規模增長的變化趨勢。t(n)可以簡單理解為所有**的執行時間,它與每行**的執行次數n成正比。

使用o()法分析時只關注執行次數最多的那一行**

舉一下高斯求和的例子(求1+2+3+…+100結果)

常規法:

int i, sum =

0, n=

100;

//執行了1次

for(i =

1; i<=

100; i++

)//執行了n+1次

printf

("%d"

, sum)

;//執行了1次

根據定義,t1(

n)=o

(n)t_(n) = o(n)

t1​(n)

=o(n

) 高斯法:

int i, sum =

0, n=

100;

//執行了1次

sum =(1

+ n)

* n /2;

//執行了1次

printf

("%d"

, sum)

;//執行了1次

根據定義,t2(

n)=o

(1)t_(n) = o(1)

t2​(n)

=o(1

)需要說明,o(1) 只是常量級時間複雜度的一種表示方法,並不是指只執行了一行**。在這段**中,即便有 3 行,它的時間複雜度也是 o(1),而不是 o(3)。

2、常見的時間複雜度

時間複雜度由**從上往下遞增,分析時可忽略低階、忽略係數。

f(n)舉例

階非正式術語9o(1

)o(1)

o(1)

常數階3lo

g2n+

173log_2n+17

3log2​

n+17

o (l

ogn)

o(logn)

o(logn

)對數階

2 n+

32n + 3

2n+3

o (n

)o(n)

o(n)

線性階2n+

3nlo

g2n+

172n + 3nlog_2n+17

2n+3nl

og2​

n+17

o (n

logn

)o(nlogn)

o(nlog

n)nlogn階

n 2+

2n+3

n^2+2n + 3

n2+2n+3o(

n2)o(n^2)

o(n2

)平方階

3 n3

+n2+

2n+1

3n^3+n^2+2n + 1

3n3+n2

+2n+1o(

n3)o(n^3)

o(n3

)立方階

2 n+

32^n + 3

2n+3

o (2

n)o(2^n)

o(2n

)指數階

n!+5

o (n

!)o(n!)

o(n!

)階乘階

視覺化如下圖所示:

時間複雜度表示演算法的執行時間與資料規模之間的增長關係。

模擬一下,空間複雜度表示演算法的儲存空間與資料規模之間的增長關係。記做s(n

)=o(

f(n)

)s(n)=o(f(n))

s(n)=o

(f(n

))。我們常見的空間複雜度就是 o(1

)、o(

n)、o

(n2)

o(1)、o(n)、o(n^2 )

o(1)、o

(n)、

o(n2

), 要舉例子的話就是分別對應普通變數、一維陣列、二維陣列。要比時間複雜度分析簡單得多。

①最好時間複雜度就是,在最理想的情況下,執行這段**的時間複雜度。

②最壞時間複雜度就是,在最糟糕的情況下,執行這段**的時間複雜度。

③平均時間複雜度就是,在給所有情況進行概率加權時,執行這段**的時間複雜度。

④均攤時間複雜度就是,將複雜度較高的情況的**執行時間均攤給其他情況,所執行這段**的時間複雜度。

均攤時間複雜度是一種特殊的平均時間複雜度。

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

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

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

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

複雜度分析(上)時間複雜度 空間複雜度

為了肉眼 實時 快速地來分析出 的複雜度,我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。時間複雜度 空間複雜度 表示演算法的執行時間與資料規模之間的增長關係。每行 對應的 cpu 執行的個數 執行的時間都不一樣,但是,我們這裡只是粗略估計,所以可以假設每行 執行的時間...