1.Common complexity classes, in order
From fastest-growing-slowest to slowest-growing-fastest: O(1), O(log n), O(n), O(n log n), O(n²), O(2ⁿ), O(n!). Each is dramatically worse than the one before it as n grows.
Key features
- O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!), in order from fastest to slowest
- O(log n) usually comes from repeatedly halving a search space (binary search)
- O(n log n) is the best achievable for comparison-based sorting
- O(2ⁿ) and O(n!) are usually only acceptable for very small n (roughly n ≤ 20–25)
The seven classes, fastest to slowest, with real operation counts at n = 20
- 2: O(1) 1, O(log n) 1, O(n) 2, O(n log n) 2, O(n²) 4, O(2ⁿ) 4, O(n!) 2
- 4: O(1) 1, O(log n) 2, O(n) 4, O(n log n) 8, O(n²) 16, O(2ⁿ) 16, O(n!) 24
- 8: O(1) 1, O(log n) 3, O(n) 8, O(n log n) 24, O(n²) 64, O(2ⁿ) 256, O(n!) 40320
- 12: O(1) 1, O(log n) 3.58, O(n) 12, O(n log n) 43.02, O(n²) 144, O(2ⁿ) 4096, O(n!) 479001600
- 16: O(1) 1, O(log n) 4, O(n) 16, O(n log n) 64, O(n²) 256, O(2ⁿ) 65536, O(n!) 20922789888000
- 20: O(1) 1, O(log n) 4.32, O(n) 20, O(n log n) 86.44, O(n²) 400, O(2ⁿ) 1048576, O(n!) 2432902008176640000
Signature
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!)
Memorize the order — O(1), O(log n), O(n), O(n log n), O(n²), O(2ⁿ), O(n!) — and always check what an inner loop actually bounds before assuming "nested loop" means O(n²).