時間複雜度

時間複雜度一直很迷。。。。 在網上找了看了一些博客,一句話,看不懂。。。。 因而本身去學了一下,總結爲下面的。算法

算法的效率,就是說一個算法的執行時間,它始終仍是由咱們執行每一行代碼的次數來決定。咱們可爲每個算法編寫一個測試程序,而後拿到機器上去跑,可是因爲除了算法本生,測試結果還受到不少其餘因素的影響,列如cpu的執行速度等不肯定因素,並且咱們也不可能爲了每個算法去編寫一個測試程序這樣也不現實。函數

因此後來人們採用事前估算的方法,依據統計學。這種狀況下拋開了其餘全部的不肯定因素,一個算法的效率由一個算法的本生好壞和輸入規模來決定。測試

例如:
clipboard.pngspa

n很大的時候,兩種算法的差距就大了起來,第一個是2n+2次,第二個始終都是2次。
上面的兩個算法分別能夠看作時間複雜度爲n1,下面來解釋爲何是這樣。code

時間複雜度

研究算法的複雜度,側重的研究輸入規模很大的狀況,在這種狀況下咱們就能夠忽略一個複雜度中的一些小項,也就是執行次數特別大的狀況,由於這樣才能斷定一個算法的在某種場景下的好與壞,這個時候就須要利用統計學知識。咱們接下來經過大量的例子來解釋。經過這幾個例子爲後面的算法時間複雜度作鋪墊。ip

例一

將設A算法要作2n+3次計算,B須要作3n+1次操做,你以爲哪個更快一點呢。下面來看看統計的結果。博客

clipboard.png

clipboard.png
從結果來看最開始算法A1不及B1,當n大於5的時候,執行次數少於B1,到後面徹底賽過它,這就是輸入規模的重要性,並且咱們看A二、B2發現當輸入規模很大的時候常數項能夠徹底忽略。
函數的漸進增加: 給定兩個函數,f(n)、g(n),若是存在一個整數Nn>N的時候,f(n)老是比g(n)大,那麼咱們說f(n)的漸進增加比g(n)大。
it

例二

算法C4n+8,算法D2n^2 + 8class

clipboard.png

clipboard.png
圖上有錯,第二張圖爲C一、C2, D1,D2
從觀察當中能夠能夠發現,當n很大的時候,相乘的係數,影響也很小了,好比4n+8和n,在圖上都重疊到一起去了,可是對於C一、C2,係數有影響,可是對比C、D算法的時候,能夠看出係數並不影響比較。能夠得出結論係數不影響兩個算法之間的比較,所以也能夠去掉。效率

例三

算法E2n^2+3n+1,算法F2n^3+3n+1

clipboard.png

clipboard.png
經過圖中對比E、F兩個算法,能夠看到指數對於測試結果影響很大。

例四

算法G2n^2,算法H3n+1,算法I2n^2+3n+1

clipboard.png

clipboard.png

clipboard.png
所以咱們能夠得出結論: 判斷一個算法的效率的時候,函數中的常數和次要項均可以忽略,而更應改關注最高項的介數。

時間複雜度的計算

用大寫O()來做爲時間複雜度的記法,稱爲大O記法

那麼咱們怎麼來推導大O階呢。首先咱們須要計算出程序執行的次數,再按照下面總結出來的方式來求解,這裏的總結均來自前面的例子

  • 只有常數項,將常數看作1,獲得O(1)
  • 對於多項表達式,只保留最高項,且去除與這個項相乘的常數

其實就是這麼簡單。。。。,我在網上看到的其餘文章語言實在太官方,明明簡單的東西被這些糟老頭子給整複雜了。下面來看幾個計算的例子:

clipboard.png
上面的時間複雜度爲O(1)

clipboard.png
時間複雜度爲O(n)

clipboard.png
時間複雜度爲o(n^2)

clipboard.png
上面的例子爲對數階。假設程序執行x次退出循環,那麼能夠獲得等式2^x=n,因此當x=log(2底數)n的時候推出循環,執行次數爲log(2)n + 1,因此能夠獲得最終結果爲O(logn)

還有一個空間複雜度,空間能夠換取時間,時間也能夠換取空間,在實際當中每每要在兩者之間達到一個平衡

相關文章
相關標籤/搜索