計算算法的運行時間


算法的不同會導致其運行時間產生大幅變化。
使用相同的算法,輸入數據的量不同,運行時間也會不同。比如,對10 個數字排序和對1 000 000 個數字排序,很容易就想到后者的運行時間更長。

那么,實際上運行時間會長多少呢?后者是前者的100 倍,還是1 000 000 倍?就像這樣,我們不光要理解不同算法在運行時間上的區別,還要了解根據輸入數據量的大小,算法的運行時間具體會產生多大的變化。

我們使用“步數”來描述運行時間。“1 步”就是計算的基本單位。通過測試“計算從開始到結束總共執行了多少步”來求得算法的運行時間。
作為示例,現在我們試着從理論層面求出選擇排序的運行時間。選擇排序的步驟如下。
① 從數列中尋找最小值
② 將最小值和數列最左邊的數字進行交換,排序結束。回到①
如果數列中有n 個數字,那么①中“尋找最小值”的步驟只需確認n 個數字即可。這里,將“確認1 個數字的大小”作為操作的基本單位,需要的時間設為Tc,那么步驟①的運行時間就是n×Tc
接下來,把“對兩個數字進行交換”也作為操作的基本單位,需要的時間設為Ts。那么,①和②總共重復n 次,每經過“1 輪”,需要查找的數字就減少1 個,因此總的運行時間如下。

 

 雖說只剩最后1 個數字的時候就不需要確認了,但是方便起見還是把對它的確認和交換時間計算在內比較好。

雖說我們已經求得了運行時間,但其實這個結果還可以簡化。Tc 和Ts 都是基本單位,與輸入無關。會根據輸入變化而變化的只有數列的長度n,所以接下來考慮n 變大的情況。n 越大,上式中的n2 也就越大,其他部分就相對變小了。也就是說,對式子影響最大的是n2。所以,我們刪掉其他部分,將結果表示成下式右邊的形式。

 

 通過這種表示方法,我們就能大致了解到排序算法的運行時間與輸入數據量n 的平方成正比。

同樣地,假設某個算法的運行時間如下。

 

 那么,這個結果就可以用O(n3) 來表示。如果運行時間為

 

 這個結果就可以用O(nlogn) 來表示。

O 這個符號的意思是“忽略重要項以外的內容”,讀音同Order。O(n2) 的含義就是“算法的運行時間最長也就是n2 的常數倍”。

重點在於,通過這種表示方法,我們可以直觀地了解算法的時間復雜度。
比如,當我們知道選擇排序的時間復雜度為O(n2)、快速排序的時間復雜度為O(nlogn) 時,很快就能判斷出快速排序的運算更為高速。

二者的運行時間根據輸入n 產生的變化程度也一目了然。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM