比較演算法好壞的標準之一是時間複雜度,當然你也可以做空間複雜度的比較,概念非常相似,在本篇就不贅述。而在定義時間複雜度之前,我們要先提及兩個在分析上的預設觀念:

那麼,我們到底要怎麼比較不同演算法或者不同狀況的時間複雜度呢?你應該已經在數學或程式語言中,學過「<」、「≤」、「==」、「≥」以及「>」這五個符號,而比較時間複雜度也有類似的概念,我們直接來看定義,當你把某個演算法的花費和次數的乘積加起來表示成 n 的函數 f(n),而你要拿他跟 g(n) 比較時:

記號與用法 記號讀法 類比的運算 定義(一般版) 定義(極限版)
f(n) = o(g(n)) Little-oh < o(g(n)) = {f(n): positive constant c and n0 s.t. 0 ≤ f(n) < c * g(n) ∀ n ≥ n0} limn → ∞ ( f(n) / g(n) ) = 0
f(n) = O(g(n)) Big-oh O(g(n)) = {f(n): ∃ positive constant c and n0 s.t. 0 ≤ f(n) c * g(n) ∀ n ≥ n0} lim supn → ∞ ( f(n) / g(n) ) < ∞
f(n) = Θ(g(n)) Big-theta == Θ(g(n)) = {f(n): ∃ positive constant c1, c2 and n0 s.t. 0 ≤ c1 * g(n) f(n) c2 * g(n) ∀ n ≥ n0} 0 < lim infn → ∞ ( f(n) / g(n) ), and
lim supn → ∞ ( f(n) / g(n) ) < ∞
f(n) = Ω(g(n)) Big-omega Ω(g(n)) = {f(n): ∃ positive constant c and n0 s.t. 0 ≤ c * g(n) f(n) ∀ n ≥ n0} lim infn → ∞ ( f(n) / g(n) ) > 0
f(n) = ω(g(n)) Little-omega > ω(g(n)) = {f(n): positive constant c and n0 s.t. 0 ≤ c * g(n) < f(n) ∀ n ≥ n0} limn → ∞ ( f(n) / g(n) ) = ∞

在上面的表格中:

這些記號在使用上,有下列慣例。此處以 big-oh 說明如下,但另外四個記號亦同:

此外,這些記號有以下性質,雖然這些性質在分析演算複雜度時不一定會直接用上,但若對其有所了解,比較不會在看到不同的寫法時愣住:

因此,對於先前看過的幾個程式片段,其時間複雜度如下(對於其他演算法的分析,會在後續篇章陸續說明):

複雜度的分析,在實務上也可以幫助你在面對特定問題時,選擇或設計適當的演算法,以求在可接受的時間內處理問題。以目前(2026 年八月)的一般電腦規格來說: