Độ phức tạp là cách chúng ta đánh giá hiệu năng của thuật toán khi dữ liệu đầu vào tăng lên. Thay vì đo thời gian chạy cụ thể (phụ thuộc máy), ta đánh giá qua số phép toán cơ bản theo kích thước đầu vào n.
🔑 Ký hiệu Big-O — Những mức phổ biến
| Big-O | Tên gọi | Ví dụ | N=10⁶ | Đánh giá |
|---|---|---|---|---|
| O(1) | Hằng số | Truy cập mảng a[i] | 1 | ⚡ Tuyệt vời |
| O(log n) | Logarit | Binary Search | ~20 | ⚡ Rất nhanh |
| O(n) | Tuyến tính | Duyệt mảng 1 lần | 10⁶ | ✅ Tốt |
| O(n log n) | Log-tuyến tính | Merge Sort, HeapSort | ~2×10⁷ | ✅ Tốt |
| O(n²) | Bình phương | Insertion Sort | 10¹² | ⚠️ Chậm |
| O(2ⁿ) | Mũ | Brute-force tập con | ∞ | ❌ Không khả thi |
Với giới hạn N ≤ 10⁵ ~ 10⁶: thuật toán O(n log n) là bắt buộc. Nếu N ≤ 10³: O(n²) vẫn chấp nhận được. Luôn nhìn giới hạn đề bài trước khi chọn thuật toán!
📦 Độ phức tạp Không gian (Space Complexity)
Ngoài thời gian, ta còn quan tâm bộ nhớ phụ mà thuật toán sử dụng. Ví dụ: Merge Sort cần mảng phụ O(n), trong khi Insertion Sort chỉ cần O(1) bộ nhớ thêm (in-place).
Chỉ dùng O(1) bộ nhớ phụ. Ví dụ: Insertion Sort, Selection Sort, HeapSort
Cần bộ nhớ phụ O(n). Ví dụ: Merge Sort, Counting Sort