時間複雜度:在計算機科學中算法的時間複雜度是一個函數,它定性的描述該算法的運行時間,但並不是表示一個程序解決問題需要花多少時間。而是說當問題規模擴大後,程序需要的時間增長得有多快。
也就是說,對於高速處理數據的計算機來說,處理某一個特定數據的效率不能衡量一個程序的好壞,而應該看當這個數據的規模變大到數百倍後,程序運行時間是否還是這樣,或者也跟著慢了數百倍,或者變慢了數萬倍。不管數據有多大,程序處理花的時間始終是那麼多的,我們就說這個程序很好,具有 O (1) 的時間複雜度,也稱常數級複雜度;數據規模變得有多大,花的時間也跟著變得有多長,這個程序的時間複雜度就是 O (n),比如找 n 個數中的最大值;而像冒泡排序、插入排序等,數據擴大 2 倍,時間變慢 4 倍的,屬於 O (n^2) 的複雜度。還有一些窮舉類的算法,所需時間長度成幾何階數上漲,這就是 O (a^n) 的指數級複雜度,甚至 O (n!) 的階乘級複雜度。
不會存在 O (2n^2) 的複雜度,因為前面的那個 “2” 是係數,根本不會影響到整個程序的時間增長。同樣地,O (n^3+n^2) 的複雜度也就是 O (n^3) 的複雜度。因此,我們會說,一個 O (0.01n^3) 的程序的效率比 O (100*n^2) 的效率低,儘管在 n 很小的時候,前者優於後者,但後者時間隨數據規模增長得慢,最終 O (n^3) 的複雜度將遠遠超過 O (n^2)。我們也說,O (n^{100}) 的複雜度小於 O (1.01^n) 的複雜度。
前面的幾類複雜度被分為兩種級別,其中後者的複雜度無論如何都遠遠大於前者:一種是 O (1),O (log (n)),O (n^a) 等,我們把它叫做多項式級的複雜度,因為它的規模 n 出現在底數的位置;另一種是 O (a^n) 和 O (n!) 型複雜度,它是非多項式級的,其複雜度計算機往往不能承受。當我們在解決一個問題時,我們選擇的算法通常都需要是多項式級的複雜度,非多項式級的複雜度需要的時間太多,往往會超時,除非是數據規模非常小。