Explain Big O notation with common complexities.
Big O describes how runtime or memory grows with input size, ignoring constants and lower-order terms.
From fastest to slowest:
- O(1) constant: hash lookup, array index.
- O(log n) logarithmic: binary search, balanced tree operations.
- O(n) linear: single pass over input.
- O(n log n): efficient comparison sorts (merge, heap).
- O(n^2): nested loops such as naive pair comparison.
- O(2^n) exponential: naive recursive subsets.
- O(n!) factorial: brute-force permutations.
Also cover best/average/worst cases (quicksort is O(n log n) average, O(n^2) worst), space complexity, and amortised analysis (dynamic array append is amortised O(1)).