時間 空間複雜度學習筆記

2021-09-29 09:20:56 字數 2133 閱讀 8168

五、空間複雜度分析

六、複雜度分析高階

把**跑一遍,通過統計、監控,就能得到演算法執行的時間和占用的記憶體大小,

並且能夠正確評估執行效率的方法,但是有非常大的侷限性。

int

cal(

int n)

return sum;

}

假設每行**執行的時間都一樣,為 unit_time。第 2、3 行**分別需要 1 個 unit_time 的執行時間,第 4、5 行都執行了 n 遍,

所以需要 2n*unit_time 的執行時間,總的執行時間就是 (2n+2)*unit_time。

int

cal(

int n)

}}

第 2、3、4 行**,每行都需要 1 個 unit_time 的執行時間,第 5、6 行**迴圈執行了 n 遍,需要 2n * unit_time 的執行時間,

第 7、8 行**迴圈執行了 n2遍,所以需要 2n2 * unit_time 的執行時間。整段**總的執行時間 t(n) = (2n2+2n+3)*unit_time。

所有**的執行時間 t(n) 與每行**的執行次數 n 成正比,轉換成大 o 複雜度表示法:

t(n) = o(f(n))

其中t(n)它表示**執行的時間;n 表示資料規模的大小;f(n)表示每行**執行的次數總和。替換 unit_time,第乙個例子中的 t(n) = o(2n+2),第二個例子中的 t(n) = o(2n2+2n+3);當 n 很大時,就可以記為:t(n) = o(n); t(n) = o(n2);

**note:**大 o 時間複雜度實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,也叫作漸進時間複雜度,簡稱時間複雜度;

主要分為多項式量級和非多項式量級。非多項式量級只有兩個:o(2^n) 和 o(n!),其複雜度計算機往往不能承受。

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

(一般情況下,只要演算法中不存在迴圈語句、遞迴語句,即使有成千上萬行的**,其時間複雜度也是ο(1))

i=1;

while

(i <= n)

時間複雜度計算得到: 2x=n —> x=log2n —> o(log2n)

不管是以 2 為底、以 3 為底,還是以 10 為底,我們可以把所有對數階的時間複雜度都記為 o(logn),對數之間是可以互相轉換的,同時常量可以忽略不記。

o(nlogn) 也是一種非常常見的演算法時間複雜度。比如,歸併排序、快速排序的時間複雜度都是 o(nlogn)

無法事先評估 m 和 n 誰的量級大,所以我們在表示複雜度的時候,就不能簡單地利用加法法則,省略掉其中乙個,可以使用 o(m+n)

常見的複雜度並不多,從低階到高階有:o(1)、o(logn)、o(n)、o(nlogn)、o(n2)

跟時間複雜度分析一樣,第2行申請了乙個空間儲存變數i,常量階的不影響資料規模n的值可以忽略,所以**的空間複雜度就是 o(n)。

常見的空間複雜度就是 o(1)、o(n)、o(n2 ),像 o(logn)、o(nlogn) 這樣的對數階複雜度平時都用不到。

// n 表示陣列 array 的長度

intfind

(int

array,

int n,

int x)

}return pos;

}

上面的例子是在乙個無序的陣列(array)中,查詢變數 x 出現的位置:

大部分情況下,我們並不需要區分最好、最壞、平均三種複雜度。平均複雜度只在某些特殊情況下才會用到,而均攤時間複雜度應用的場景比它更加特殊、更加有限。

時間複雜度 空間複雜度

時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...

時間複雜度 空間複雜度

演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...

時間複雜度 空間複雜度

一 時間複雜度 實際是指程式執行次數,而不是程式執行時間 1.我們一般討論的是最壞時間複雜度,這樣做的原因是 最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上限,以最壞代表最全。2.時間複雜度的書寫規則 忽略常數項,用o 1 表示 選取最壞時間複雜度即選取增長最快的項 遞迴的時間複雜度 遞...