時間複雜度一直很迷。。。。 在網上找了看了一些博客,一句話,看不懂。。。。 因而本身去學了一下,總結爲下面的。算法
算法的效率,就是說一個算法的執行時間,它始終仍是由咱們執行每一行代碼的次數來決定。咱們可爲每個算法編寫一個測試程序,而後拿到機器上去跑,可是因爲除了算法本生,測試結果還受到不少其餘因素的影響,列如cpu
的執行速度等不肯定因素,並且咱們也不可能爲了每個算法去編寫一個測試程序這樣也不現實。函數
因此後來人們採用事前估算的方法,依據統計學。這種狀況下拋開了其餘全部的不肯定因素,一個算法的效率由一個算法的本生好壞和輸入規模來決定。測試
例如:
spa
當n
很大的時候,兩種算法的差距就大了起來,第一個是2n+2
次,第二個始終都是2
次。
上面的兩個算法分別能夠看作時間複雜度爲n
和1
,下面來解釋爲何是這樣。code
研究算法的複雜度,側重的研究輸入規模很大的狀況,在這種狀況下咱們就能夠忽略一個複雜度中的一些小項,也就是執行次數特別大的狀況,由於這樣才能斷定一個算法的在某種場景下的好與壞,這個時候就須要利用統計學知識。咱們接下來經過大量的例子來解釋。經過這幾個例子爲後面的算法時間複雜度作鋪墊。ip
將設A
算法要作2n+3
次計算,B
須要作3n+1
次操做,你以爲哪個更快一點呢。下面來看看統計的結果。博客
從結果來看最開始算法A1
不及B1
,當n
大於5
的時候,執行次數少於B1
,到後面徹底賽過它,這就是輸入規模的重要性,並且咱們看A二、B2
發現當輸入規模很大的時候常數項能夠徹底忽略。
函數的漸進增加: 給定兩個函數,f(n)、g(n)
,若是存在一個整數N
當n>N
的時候,f(n)
老是比g(n)
大,那麼咱們說f(n)
的漸進增加比g(n)
大。
當it
算法C
爲4n+8
,算法D
爲2n^2 + 8
class
圖上有錯,第二張圖爲C一、C2, D1,D2
。
從觀察當中能夠能夠發現,當n
很大的時候,相乘的係數,影響也很小了,好比4n+8和n
,在圖上都重疊到一起去了,可是對於C一、C2
,係數有影響,可是對比C、D
算法的時候,能夠看出係數並不影響比較。能夠得出結論係數不影響兩個算法之間的比較,所以也能夠去掉。效率
算法E
爲2n^2+3n+1
,算法F
爲2n^3+3n+1
經過圖中對比E、F
兩個算法,能夠看到指數對於測試結果影響很大。
算法G
爲2n^2
,算法H
爲3n+1
,算法I
爲2n^2+3n+1
所以咱們能夠得出結論: 判斷一個算法的效率的時候,函數中的常數和次要項均可以忽略,而更應改關注最高項的介數。
用大寫O()
來做爲時間複雜度的記法,稱爲大O
記法
那麼咱們怎麼來推導大O
階呢。首先咱們須要計算出程序執行的次數,再按照下面總結出來的方式來求解,這裏的總結均來自前面的例子
1
,獲得O(1)
其實就是這麼簡單。。。。,我在網上看到的其餘文章語言實在太官方,明明簡單的東西被這些糟老頭子給整複雜了。下面來看幾個計算的例子:
上面的時間複雜度爲O(1)
時間複雜度爲O(n)
時間複雜度爲o(n^2)
上面的例子爲對數階。假設程序執行x
次退出循環,那麼能夠獲得等式2^x=n
,因此當x=log(2底數)n
的時候推出循環,執行次數爲log(2)n + 1
,因此能夠獲得最終結果爲O(logn)
還有一個空間複雜度,空間能夠換取時間,時間也能夠換取空間,在實際當中每每要在兩者之間達到一個平衡