时间复杂度算法分析
時間復雜度
時間復雜度是描述算法運行的時間。我們把算法需要運算的次數用輸入大小為 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,完了之后大概就能理解遞歸的時間復雜度是怎么來的。
總結
- 上一篇: 公司经营理念怎么写-公司经营理念标语文案
- 下一篇: 翻转整数算法