各種算法的比較

計算機算法很多,哪種算法好呢,有沒有一個衡量準則呢!

1、用具體的操作數來衡量

衡量一個算法的快慢時,希望找到一種方便的統一標準,使得對於同一個算法,衡量標準不會受到一些不重要的因素影響而保持一致;對於不同的算法,我們能夠比較它們的優劣並在實際的應用中進行選擇。

一個自然的想法是測量這個算法運行所需要的時間,然後選擇跑得快的算法。但是不同的機器運行的速度是不一樣的,一個同樣的算法在不同機器上測出來的時間可能非常不同。每次想要知道一個算法的快慢如果都要在機器上通過計時來測量的話,是一件非常痛苦的事情,因為有些算法可能一次要跑上一天,一個月,甚至一個世紀。

一個有效的替代方法是通過計算一個算法用了多少次操作(或者說運算量)來衡量它運行的快慢,比如用了多少次加減法,乘除法,函數調用和賦值等操作。操作數越多,運行的所需要的時間就越多。這樣的一種想法保證了我們對算法的衡量不會因為測試環境的變化而變化,也不用通過實際運行來測量,只需通過計算就能得到操作數的數量。

2、用函數來衡量

僅僅計算操作數的一個問題是:一個固定的算法,針對不同的輸入規模,它所需要的操作數量是不一樣的。比如一個排序的算法,排100個數字和排10000個數字相比,排10000個數字所需要的運算量會大很多。也就是,操作數是隨輸入規模變化的一個函數。

假如輸入規模是n,那麼操作數就是f(n)。有時候,輸入規模不只有一個,比如關於一個矩陣的算法需要的操作數,可能和矩陣的長和寬都有關係,這時候,ff就變成了一個關於長和寬的二元函數,比如f(w,h)。這種擴展是合理的,但是為了討論方便,我們先只考慮規模只是一個變量n的情況。

f可能形式會比較複雜。比如

各種算法的比較

那麼三個函數到底誰才能代表這個算法的真正時間複雜度呢?為了滿足統一的衡量標準,我們必須有一個選擇方法。

3、用近似函數來衡量

首先要認識到,在實踐中,我們只關心算法在輸入規模比較大的情況下的表現。因為現在的計算機每秒都能做上億次運算,我們處理的實際問題也是規模比較大的。而當輸入規模較大時,我們就可以通過只保留佔最大比重的項,並忽略常數,來得到一個統一的近似函數表達式。對於上面的例子來說,近似函數就是:

各種算法的比較

我們從直觀上來理解這種近似是合理的。首先,當數據規模nn達到十萬的時候,4n^2是40n的一萬倍,所以我們已經沒有必要考慮40n了,我們捨棄小項,而只保留佔最大比重的項。對於忽略常數,是因為,當我們比較兩個不同的時間複雜度的時候,常數是無關緊要的:考慮兩個時間複雜度n^2和100n。100是比1大很多的,但是當n達到十萬的時候n^2是100n的一千倍,可見常數的影響是非常小的。

或者說,常數不會隨輸入規模n的變化而變化,當輸入規模越來越大的時候,常數的影響力就越來越小。這種機智的取捨解決了很多細節問題,比如,不同的操作可能會耗時不同,就好像加法操作要快些,乘法要慢些,除法可能更慢,而內存的讀寫操作可能比邏輯操作更慢些。在一些要求非常精細的情況下,我們可能不得不仔細分開不同的操作,但是,在一般情況下,如果我們忽略常數造成的差異,我們可以把這些不同的操作看成是一個操作單元,也就是說,雖然乘法比加法慢了2倍,但2只是個常數,我們把這種差異忽略掉。

4、近似函數是漸近的

當nn不斷增大時,如果f(n)和g(n)的比值趨向於穩定(穩定等於一個不等於0的常數),我們就認為f(n)和g(n)其實是漸近等價的。g其實是漸近等價的:由此可見,我們選取的【函數四】是和前面的三個函數在變化趨勢上是漸近的。總的來說,我們找到了一個統一的標準,兩個程序員的編碼風格所造成的差別不存在了。

5、表示符號

目前找到了操作數關於輸入規模的一個近似函數來表示算法運行的快慢。這個近似函數就表示了算法的時間複雜度,通常我們會說某個算法的複雜度是O(f(n))或者Θ(f(n))。下面就說明不同的表示符號代表的含義:

各種算法的比較

很多時候,我們都會使用OO符號,因為我們一般只會證明一個算法複雜度的上界(最壞情況),如果這個上界達到我們的要求了,就不必計算下界了。

6、最壞,最好和平均時間複雜度

前面我們討論了算法的操作數隨輸入規模變化,但是即使是相同規模的數據,也能造成操作數的差異。這個時候,如果我們對每種可能的輸入都進行時間複雜度的計算的話,是非常麻煩且沒有必要的。我們一般只考慮最壞,最好和平均情況下的時間複雜度:

最壞時間複雜度:在所有可能的輸入中,操作數最多的輸入的時間複雜度。

最好時間複雜度:在所有可能的輸入中,操作數最少的輸入的時間複雜度。

最壞時間複雜度:對所有可能的輸入的操作數取均值得到的時間複雜度。

這種表示時間複雜度的方法也可以運用到空間複雜度的上,在這種複雜度的表示方法下,程序員們可以愉快地攀比誰的算法更優,而不需要考慮實際實現的差異和具體運行環境等細枝末節的東西。


分享到:


相關文章: