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