时间复杂度算法分析
時(shí)間復(fù)雜度
時(shí)間復(fù)雜度是描述算法運(yùn)行的時(shí)間。我們把算法需要運(yùn)算的次數(shù)用輸入大小為 n 的函數(shù)來表示, 計(jì)作 T(n)。時(shí)間復(fù)雜度通常用O(n)來表示,公式為T(n)=O(f(n)),其中f(n)表示每行 代碼的執(zhí)行次數(shù)之和,注意是執(zhí)行次數(shù)。
O(1) 復(fù)雜度
算法執(zhí)行所需要的時(shí)間不隨著某個(gè)變量 n 的大小而變化,即此算法時(shí)間復(fù)雜度為一個(gè)常量,可表示
為 O(1)
O(1)表示常數(shù)級別的復(fù)雜度,不管你是O(幾),統(tǒng)一給你計(jì)作 O(1)
O(n) 復(fù)雜度
上面這段代碼,寫了一個(gè) for 循環(huán),從 0 到 n ,不管 n 是多少,都要循環(huán) n 次,而且只循環(huán) n 次,所以得到復(fù)雜度為 O(n)
O(n2) 復(fù)雜度
上面的程序嵌套了兩個(gè)循環(huán),外層是 0 到 n ,內(nèi)層基于每一個(gè)不同的 i ,也要從 0 到 n 執(zhí)行, 得到復(fù)雜度為 O(n2)。可以看出,隨著 n 增大,復(fù)雜度會成平方級別增加。
O(log(n)) 對數(shù)復(fù)雜度
講到這里順便來復(fù)習(xí)一下高中數(shù)學(xué)知識,函數(shù) y = loga x 叫做對數(shù)函數(shù), a 就是對數(shù)函數(shù)的底 數(shù)。
對數(shù)復(fù)雜度是比較常見的一種復(fù)雜度,也是比較難分析的一種復(fù)雜度。觀察上面的代碼, i 從 1 開 始,每循環(huán)一次就乘以 2,直到 i 大于 n 時(shí)結(jié)束循環(huán)。
21 ??>22 ??>23…??>2x
觀察上面列出 i 的取值發(fā)現(xiàn),是一個(gè)等比數(shù)列,要知道循環(huán)了多少次,求出 x 的值即可。由
2x =n得到,x=log2n,所以這段代碼的時(shí)間復(fù)雜度為log2n。 如果把上面的 i *= 2 改為 i *= 3 ,那么這段代碼的時(shí)間復(fù)雜度就是 log3 n 。
遞歸的時(shí)間復(fù)雜度
遞歸算法中,每個(gè)遞歸函數(shù)的的時(shí)間復(fù)雜度為O(s),遞歸的調(diào)用次數(shù)為 n,則該遞歸算法的時(shí) 間復(fù)雜度為 O(n) = n ? O(s)
我們先來看一個(gè)經(jīng)典的問題,斐波那契數(shù)列( Fibonacci sequence ):
F (0) = 1,F (2) = 1, F (n) = F (n ? 1) + F (n ? 2)(n ≥ 2, n ∈ N ? )
我們很容易寫出上面這樣一段遞歸的代碼,往往會忽略了時(shí)間復(fù)雜度是多少,換句話說調(diào)用多少 次。可以代一個(gè)數(shù)進(jìn)去,例如 n = 5,完了之后大概就能理解遞歸的時(shí)間復(fù)雜度是怎么來的。
總結(jié)
- 上一篇: 公司经营理念怎么写-公司经营理念标语文案
- 下一篇: 翻转整数算法