时间复杂度
時間復(fù)雜度一直很迷。。。。 在網(wǎng)上找了看了一些博客,一句話,看不懂。。。。 于是自己去學(xué)了一下,總結(jié)為下面的。
算法的效率,就是說一個算法的執(zhí)行時間,它始終還是由我們執(zhí)行每一行代碼的次數(shù)來決定。我們可為每一個算法編寫一個測試程序,然后拿到機器上去跑,但是由于除了算法本生,測試結(jié)果還受到很多其他因素的影響,列如cpu的執(zhí)行速度等不確定因素,而且我們也不可能為了每一個算法去編寫一個測試程序這樣也不現(xiàn)實。
所以后來人們采用事前估算的方法,依據(jù)統(tǒng)計學(xué)。這種情況下拋開了其他所有的不確定因素,一個算法的效率由一個算法的本生好壞和輸入規(guī)模來決定。
例如:
當(dāng)n很大的時候,兩種算法的差距就大了起來,第一個是2n+2次,第二個始終都是2次。
上面的兩個算法分別可以看做時間復(fù)雜度為n和1,下面來解釋為什么是這樣。
時間復(fù)雜度
研究算法的復(fù)雜度,側(cè)重的研究輸入規(guī)模很大的情況,在這種情況下我們就可以忽略一個復(fù)雜度中的一些小項,也就是執(zhí)行次數(shù)特別大的情況,因為這樣才能判定一個算法的在某種場景下的好與壞,這個時候就需要利用統(tǒng)計學(xué)知識。我們接下來通過大量的例子來解釋。通過這幾個例子為后面的算法時間復(fù)雜度做鋪墊。
例一
將設(shè)A算法要做2n+3次計算,B需要做3n+1次操作,你覺得哪一個更快一點呢。下面來看看統(tǒng)計的結(jié)果。
從結(jié)果來看最開始算法A1不及B1,當(dāng)n大于5的時候,執(zhí)行次數(shù)少于B1,到后面完全勝過它,這就是輸入規(guī)模的重要性,而且我們看A2、B2發(fā)現(xiàn)當(dāng)輸入規(guī)模很大的時候常數(shù)項可以完全忽略。
函數(shù)的漸進增長: 給定兩個函數(shù),f(n)、g(n),如果存在一個整數(shù)N當(dāng)n>N的時候,f(n)總是比g(n)大,那么我們說f(n)的漸進增長比g(n)大。
當(dāng)
例二
算法C為4n+8,算法D為2n^2 + 8
圖上有錯,第二張圖為C1、C2, D1,D2。
從觀察當(dāng)中可以可以發(fā)現(xiàn),當(dāng)n很大的時候,相乘的系數(shù),影響也很小了,比如4n+8和n,在圖上都重疊到一塊兒去了,但是對于C1、C2,系數(shù)有影響,但是對比C、D算法的時候,可以看出系數(shù)并不影響比較。可以得出結(jié)論系數(shù)不影響兩個算法之間的比較,因此也可以去掉。
例三
算法E為2n^2+3n+1,算法F為2n^3+3n+1
通過圖中對比E、F兩個算法,可以看到指數(shù)對于測試結(jié)果影響很大。
例四
算法G為2n^2,算法H為3n+1,算法I為2n^2+3n+1
因此我們可以得出結(jié)論: 判斷一個算法的效率的時候,函數(shù)中的常數(shù)和次要項都可以忽略,而更應(yīng)改關(guān)注最高項的介數(shù)。
時間復(fù)雜度的計算
用大寫O()來作為時間復(fù)雜度的記法,稱為大O記法
那么我們怎么來推導(dǎo)大O階呢。首先我們需要計算出程序執(zhí)行的次數(shù),再按照下面總結(jié)出來的方式來求解,這里的總結(jié)均來自前面的例子
- 只有常數(shù)項,將常數(shù)看做1,得到O(1)
- 對于多項表達式,只保留最高項,且去除與這個項相乘的常數(shù)
其實就是這么簡單。。。。,我在網(wǎng)上看到的其他文章語言實在太官方,明明簡單的東西被這些糟老頭子給整復(fù)雜了。下面來看幾個計算的例子:
上面的時間復(fù)雜度為O(1)
時間復(fù)雜度為O(n)
時間復(fù)雜度為o(n^2)
上面的例子為對數(shù)階。假設(shè)程序執(zhí)行x次退出循環(huán),那么可以得到等式2^x=n,所以當(dāng)x=log(2底數(shù))n的時候推出循環(huán),執(zhí)行次數(shù)為log(2)n + 1,所以可以得到最終結(jié)果為O(logn)
還有一個空間復(fù)雜度,空間可以換取時間,時間也可以換取空間,在實際當(dāng)中往往要在二者之間達到一個平衡
總結(jié)
- 上一篇: Servlet教程
- 下一篇: 更改一字段的全部字节的大小写