Big-O 成長率計算機
輸入
| 資料規模 n | 20 |
|---|
Big-O 成長率計算機
輸入資料規模 n,比較各常見時間複雜度級別所需的運算次數,從 O(log n) 到 O(n!)。
輸入
資料規模
結果
輸入數值即可顯示計算結果。
常見複雜度
極速成長
Big-O 成長率
Big-O 記法對演算法的資源需求隨資料規模變化的方式進行分類。它不量測特定機器上的執行秒數,而是捕捉成長的形態——當 n 加倍時,工作量是否也加倍,還是變為四倍?以下六種複雜度是教科書和技術面試中最常見的類別。
六種常見複雜度級別
O(log n) — 對數級。 每個步驟消除剩餘工作量中的固定比例。對包含十億個元素的已排序陣列進行二分搜尋,只需 30 次比較,因為每次都將搜尋空間縮減一半。平衡二元搜尋樹的查詢和許多分治遞迴均屬此類。
O(n) — 線性級。 工作量與資料規模成正比增長。掃描陣列一次找到最大值、計算字串中的字元數或讀取清單中的每個元素,均為線性複雜度,通常被認為是高效的演算法。
O(n log n) — 線性對數級。 排序演算法最常見的複雜度。合併排序、堆積排序和 Timsort(Python 和 Java 使用)均達到 O(n log n),這也是基於比較的排序演算法的理論下界。在 時,約需兩千萬次運算,實際表現很快。
O(n²) — 二次方級。 對資料進行兩層巢狀迴圈。氣泡排序、插入排序和樸素矩陣乘法的最壞情況均為 O(n²)。在 時需一億次運算;在 時變為一兆次——對大型資料不可行。
O(2ⁿ) — 指數級。 每增加一個元素,工作量加倍。樸素遞迴費波那契演算法重複計算子問題;暴力枚舉所有子集的演算法也以 的速度成長。當 n = 40 時,次數已超過一兆。
O(n!) — 階乘級。 日常演算法分析中成長最快的類別。對排列問題的暴力求解——如枚舉旅行推銷員問題中所有可能的路線——每個排列對應一次運算,而排列共有 個。當 n 等於二十時,次數超過兩百京()。
n = 20 時的計算範例
n = 20 時,O(n log n) 與 O(n!) 之間的比值約為 ——相當於快速排序與等待時間超過宇宙年齡之間的差距。
實際應用建議
在資料規模較小時,常數因子和快取效果比複雜度更重要;規模增大後,複雜度則主導效能。n = 10,000 大約是 O(n²) 在現代硬體上開始令人不適的門檻(假設為簡單運算)。超過 後,通常需要 O(n log n) 或更好的演算法。指數級和階乘級演算法對任何實際輸入都需要近似法、動態規劃或剪枝策略。
如需處理資料規模的二進位或十六進位表示,請參閱 進制轉換工具。
常見問題(FAQ)
Big-O 記法實際上衡量什麼?
Big-O 記法描述演算法的執行時間(或記憶體用量)隨資料規模 n 增長的上界。它刻意忽略常數因子和低階項,因為隨著 n 增大,這些因素的影響愈來愈小。一個 O(n²) 演算法最終必定會超越一個 O(n log n) 演算法,無論硬體速度多快。Big-O 是比較演算法設計的工具,而非精確預測實際執行時間的指標。
為何對數以 2 為底?
大多數分治演算法(二分搜尋、合併排序、平衡二元搜尋樹)在每個步驟都將工作量減半,因此分割的深度為 log₂ n。在 Big-O 分析中,對數的底數只是一個常數因子,不會改變複雜度級別——log₂ n 和 log₁₀ n 僅差一個常數——但以 2 為底是電腦科學的慣例,因為與二進位分割的對應關係最為直觀。本計算機採用以 2 為底的對數以符合此慣例。
在什麼資料規模下,時間複雜度開始顯著影響效能?
對於小型資料集(n < 50 左右),調校良好的 O(n²) 演算法往往優於理論上更快的 O(n log n) 演算法,因為其常數開銷較低且快取行為更佳。當 n 達到數百或數千時,複雜度開始主導效能。
以 n = 1,000 為例,O(n log n) 排序約需 10,000 次比較,而 O(n²) 排序需要 1,000,000 次。當 n = 1,000,000 時,差距擴大至十億對一兆——此時複雜度成為唯一決定性因素。
O(n!) 在實際應用中是否可行?
O(n!) 演算法除最小規模的輸入外,均不可行。當 n = 20 時,n! 已超過 200 京(2 × 10¹⁸)次運算,任何電腦在人類壽命內均無法完成。
實際上,像旅行推銷員問題這類 NP 困難問題是以近似演算法、啟發式方法或動態規劃來求解,避免枚舉所有排列。本計算機的階乘欄位正是用來說明為何這些近似技術不可或缺。