時間複雜度算法分析

時間複雜度

時間複雜度是描述算法運行的時間。我們把算法需要運算的次數用輸入大小爲 n 的函數來表示, 計作 T(n)。時間複雜度通常用O(n)來表示,公式爲T(n)=O(f(n)),其中f(n)表示每行 代碼的執行次數之和,注意是執行次數
在這裏插入圖片描述


O(1) 複雜度

算法執行所需要的時間不隨着某個變量 n 的大小而變化,即此算法時間複雜度爲一個常量,可表示
爲 O(1)

在這裏插入圖片描述

O(1)表示常數級別的複雜度,不管你是O(幾),統一給你計作 O(1)


O(n) 複雜度

在這裏插入圖片描述

上面這段代碼,寫了一個 for 循環,從 0 到 n ,不管 n 是多少,都要循環 n 次,而且只循環 n 次,所以得到複雜度爲 O(n)


O(n2) 複雜度

在這裏插入圖片描述

上面的程序嵌套了兩個循環,外層是 0 到 n ,內層基於每一個不同的 i ,也要從 0 到 n 執行, 得到複雜度爲 O(n2)。可以看出,隨着 n 增大,複雜度會成平方級別增加。


O(log(n)) 對數複雜度

在這裏插入圖片描述
講到這裏順便來複習一下高中數學知識,函數 y = loga x 叫做對數函數, a 就是對數函數的底 數。

對數複雜度是比較常見的一種複雜度,也是比較難分析的一種複雜度。觀察上面的代碼, i 從 1 開 始,每循環一次就乘以 2,直到 i 大於 n 時結束循環。

21 −−>22 −−>23…−−>2x
觀察上面列出 i 的取值發現,是一個等比數列,要知道循環了多少次,求出 x 的值即可。由
2x =n得到,x=log2n,所以這段代碼的時間複雜度爲log2n。 如果把上面的 i *= 2 改爲 i *= 3 ,那麼這段代碼的時間複雜度就是 log3 n 。

在這裏插入圖片描述


遞歸的時間複雜度

遞歸算法中,每個遞歸函數的的時間複雜度爲O(s),遞歸的調用次數爲 n,則該遞歸算法的時 間複雜度爲 O(n) = n ∗ O(s)

我們先來看一個經典的問題,斐波那契數列( Fibonacci sequence ):

F (0) = 1,F (2) = 1, F (n) = F (n − 1) + F (n − 2)(n ≥ 2, n ∈ N ∗ )

在這裏插入圖片描述

我們很容易寫出上面這樣一段遞歸的代碼,往往會忽略了時間複雜度是多少,換句話說調用多少 次。可以代一個數進去,例如 n = 5,完了之後大概就能理解遞歸的時間複雜度是怎麼來的。

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章