複雜度分析

2021-09-29 12:46:34 字數 2508 閱讀 4719

對於剛羅列的複雜度量級,我們可以粗略地分為兩類,多項式量級和非多項式量級。其中,非多項式量級只有兩個:o(2n) 和 o(n!)。

我們把時間複雜度為非多項式量級的演算法問題叫作 np(non-deterministic polynomial,非確定多項式)問題。

當資料規模 n 越來越大時,非多項式量級演算法的執行時間會急劇增加,求解問題的執行時間會無限增長。所以,非多項式時間複雜度的演算法其實是非常低效的演算法。因此,關於 np 時間複雜度我就不展開講了。我們主要來看幾種常見的多項式時間複雜度。

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

int i =8;

int j =6;

int k =6;

int x =6;

int sum = i + j;

int cal = k * x;

只要**的執行時間不隨 n 的增大而增長,這樣**的時間複雜度我們都記作 o(1)。或者說,一般情況下,只要演算法中不存在迴圈語句、遞迴語句,即使有成千上萬行的**,其時間複雜度也是ο(1)。

直接看個例子

i=1;

while

(i <= n)

通過 2x=n 求解 x 這個問題我們想高中應該就學過了,我就不多說了。x=log2n,所以,這段**的時間複雜度就是 o(log2n)。

再看個例子:

i=1;

while

(i <= n)

很簡單就能看出來,這段**的時間複雜度為 o(log3n)。

實際上,不管是以 2 為底、以 3 為底,還是以 10 為底,我們可以把所有對數階的時間複雜度都記為 o(logn)。為什麼呢?

我們知道,對數之間是可以互相轉換的,log3n 就等於 log32 * log2n,所以 o(log3n) = o(c * log2n),其中 c=log32 是乙個常量。基於我們前面的乙個理論:在採用大 o 標記複雜度的時候,可以忽略係數,即 o(cf(n)) = o(f(n))。所以,o(log2n) 就等於 o(log3n)。因此,在對數階時間複雜度的表示方法裡,我們忽略對數的「底」,統一表示為 o(logn)。

如果一段**的時間複雜度是 o(logn),我們迴圈執行 n 遍,時間複雜度就是 o(nlogn) 了。

int

cal(

int m,

int n)

int sum_2 =0;

int j =1;

for(

; j < n;

++j)

return sum_1 + sum_2;

}

m 和 n 是表示兩個資料規模。我們無法事先評估 m 和 n 誰的量級大,所以我們在表示複雜度的時候,就不能簡單地利用加法法則,省略掉其中乙個。所以,上面**的時間複雜度就是 o(m+n)。

m*n的跟這個類似,這裡不再贅述。

void

print

(int n)

for(i = n-

1; i >=0;

--i)

}

跟時間複雜度分析一樣,我們可以看到,第 2 行**中,我們申請了乙個空間儲存變數 i,但是它是常量階的,跟資料規模 n 沒有關係,所以我們可以忽略。第 3 行申請了乙個大小為 n 的 int 型別陣列,除此之外,剩下的**都沒有占用更多的空間,所以整段**的空間複雜度就是 o(n)。

我們常見的空間複雜度就是 o(1)、o(n)、o(n2),像 o(logn)、o(nlogn) 這樣的對數階複雜度平時都用不到。而且,空間複雜度分析比時間複雜度分析要簡單很多。所以,對於空間複雜度,掌握剛我說的這些內容已經足夠了。

從低階到高階有:o(1)、o(logn)、o(n)、o(nlogn)、o(n2)。

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

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

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

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

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

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