看每個複雜度類別成長得多快、畫出任何你輸入的式子,並讀出一個解法在逾時前能處理的最大輸入。
評測系統每秒大約跑 10⁸ 次簡單運算。這一個數字就能把
n ≤ 10⁵ 這種限制換算成面試官預期的複雜度 —— 從最後一欄反著讀。
預算:
哪個成長得比較快?是不是同一類別?差距從哪個 n 開始真正顯現?所有變數都視為 n。
找到預期解法最快的方法,就是看 n 的上限。以每秒 ~10⁸ 次運算計算,各個大小允許的複雜度如下。
| 若 n 最大到 | 目標 | 通常代表 |
|---|---|---|
| 10 – 11 | O(n!) | 列舉每種排列:backtracking、暴力排序。 |
| 20 – 25 | O(2ⁿ), O(n·2ⁿ) | 列舉每個子集:選 / 不選的遞迴、bitmask DP。 |
| ≈ 500 | O(n³) | 區間 DP、Floyd–Warshall、三層巢狀迴圈。 |
| ≈ 5,000 | O(n²) | 以兩個索引為狀態的 2-D DP(LCS、edit distance)、所有配對。 |
| 10⁵ – 10⁶ | O(n log n) | 先排序、heap、迴圈裡做 binary search。最常見的面試上界。 |
| 10⁷ – 10⁸ | O(n) | 掃一遍:hash map、two pointers、sliding window、prefix sum、BFS / DFS。 |
| 超過 10⁸ | O(log n), O(1) | 對答案做 binary search、數學、公式。 |
認得程式碼的樣子,還沒開始數就知道上界。
3n² + 10n + 7 是
O(n²)。把陣列掃兩遍仍然是 O(n)。O(a + b);迴圈裡面再一個迴圈是 O(a · b)。O(m · n),不是 O(n²);圖是 O(V + E)。把它們都併成 n
是講錯上界最常見的方式。log n。底數永遠不重要:
log₂ n 和 log₁₀ n 只差一個常數。O(2ⁿ)。加上 memoization 後每個狀態只算一次:
O(狀態數 × 每個狀態的工作量) = O(n)。O(n log n)
(merge sort)。切半、只留一邊 —— O(log n)(binary search)。O(1) —— 要把「amortised」說出口。O(n);在平衡的樹上則是 O(log n)。O(n log n),之後都是線性,
所以總共是 O(n log n)」就是面試官在等的那句話。