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

2021-10-16 06:48:37 字數 1830 閱讀 1803

如何評價一段**或演算法的效能和好壞?目前衡量**質量的指標主要有兩個:分別為時間複雜度和空間複雜度。其中時間複雜度指的是執行當前演算法所消耗的時間,空間複雜度指的是指執行當前演算法需要占用多少記憶體空間。有的時候時間和空間是不可兼得的,需要從中去取乙個平衡點。下面簡單描述一下如何計算時間複雜度和空間複雜度

一、時間複雜度

利用大o符號表示法來表示時間複雜度,即t(n) = o(f(n))。其中f(n) 表示每行**執行次數之和,而 o 表示正比例關係,這個公式的全稱是:演算法的漸進時間複雜度

for(i=1; i<=n; ++i)

(1+n+n)*time :t(n) = o(n) 。因為大o符號表示法並不是用於來真實代表演算法的執行時間的,它是用來表示**執行時間的增長變化趨勢的。假設n為無窮大時,倍數2和加數1可以忽略不計。

目前常見的時間複雜度量級有以下幾種,按照順序時間複雜度越來越大,執行的效率越來越低:

(1)常數階o(1);   (2)對數階o(logn);   (3)線性階o(n);        (4)線性對數階o(nlogn);

(5)平方階o(n²);  (6)立方階o(n³);       (7)k次方階o(n^k);   (8)指數階(2^n)。

下面主要介紹幾種常見的時間複雜度計算案例:

1、常數階o(1)

k=i; 

i=j;

j=k;

j++;

2、對數階o(logn)

int i = 1;

while(i上面的**可以發現迴圈並不是到n結束,因為i的值在變化,i每次都在乘以2,2^x=n為終止條件,此時x也就為logn。

3、線性階o(n)

for(i=1; i<=n; i++)

4、線性對數階o(nlogn)

for(m=1; m5、平方階o(n²)

for(x=1; i<=n; x++)

}

時間複雜度為 o(n²)。

for(x=1; i<=m; x++)

}

時間複雜度為 o(m*n)。

二、空間複雜度

空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的乙個量度,同樣反映的是乙個趨勢,我們用 s(n) 來定義。空間複雜度比較常用的有:o(1)、o(n)、o(n²)。

1、空間複雜度 o(1)

如果演算法執行所需要的臨時空間不隨著某個變數n的大小而變化,即此演算法空間複雜度為乙個常量,可表示為 o(1)。

int i = 1;

int j = 2;

++i;

j++;

int m = i + j;

**中的 i、j、m 所分配的空間都不隨著處理資料量變化,因此它的空間複雜度 s(n) = o(1)。

2、空間複雜度 o(n)

int m = new int[n]

for(i=1; i<=n; ++i)

這段**中,第一行new了乙個陣列出來,這個資料占用的大小為n,這段**的2-6行,雖然有迴圈,但沒有再分配新的空間,因此,這段**的空間複雜度主要看第一行即可,即 s(n) = o(n)。

3、空間複雜度o(n2)

int arr = new int[n][n];

for (int i = 0; i < n; i++)

}

隨著資料量的變化,記憶體消耗為平方變化。

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

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

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

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

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

演算法是指用來運算元據 解決程式問題的一組方法。對於同乙個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。那麼我們應該如何去衡量不同演算法之間的優劣呢?主要還是從演算法所占用的 時間 和 空間 兩個維度去考量。接下來主要介紹時間複雜度和空間複雜度的計算...