Big-O vs Big-Θ vs Big-Ω
Cùng một thuật toán có thể nhanh hay chậm tùy dữ liệu may hay xui. Bài này phân biệt ba ký hiệu: O (xấu nhất), Ω (tốt nhất), Θ (chặt — khi tốt và xấu cùng cỡ), và vì sao trong thực tế người ta hay quan tâm xấu nhất.
1. Trực quan: tìm tên trong danh sách CHƯA sắp xếp
Bạn dò từ đầu danh sách n người để tìm "Phúc":
- May (tốt nhất): Phúc đứng đầu → tìm thấy ngay bước 1. Chỉ 1 thao tác.
- Xui (xấu nhất): Phúc đứng cuối, hoặc không có → phải dò hết
nngười. - Trung bình: thường thấy ở khoảng giữa → ~n/2 thao tác.
Cùng một thuật toán, nhưng số thao tác dao động từ 1 tới n tùy dữ liệu. Ba ký hiệu sinh ra để nói chính xác ta đang bàn trường hợp nào.
2. Ba ký hiệu
| Ký hiệu | Tên | Nghĩa | Trả lời câu hỏi |
|---|---|---|---|
| O(...) | Big-O | cận trên — không tệ hơn mức này | "Xấu nhất thì chậm cỡ nào?" |
| Ω(...) | Big-Omega | cận dưới — không nhanh hơn mức này | "Tốt nhất thì nhanh cỡ nào?" |
| Θ(...) | Big-Theta | cận chặt — kẹp cả trên lẫn dưới | "Cỡ nào là đúng?" (khi trên = dưới) |
Với tìm tuyến tính ở trên:
- O(n) — xấu nhất phải quét hết.
- Ω(1) — tốt nhất trúng ngay phần tử đầu.
- Không có một Θ chung cho mọi trường hợp vì tốt nhất (1) và xấu nhất (n) khác cỡ nhau.
Khi tốt nhất và xấu nhất cùng cỡ. Ví dụ "tính tổng mảng" luôn phải duyệt hết n phần tử dù
dữ liệu thế nào → tốt nhất = xấu nhất = n → Θ(n) (và cũng là O(n), Ω(n)).
3. Chạy debug: thấy "may" và "xui" khác nhau
Cùng thuật toán tìm tuyến tính, hai dữ liệu khác nhau. Để ý số bước (buoc):
Cùng code, cùng mảng, chỉ khác phần tử cần tìm — một bên 1 bước, một bên n bước.
4. Vì sao thực tế hay nói "xấu nhất"?
Khi nói "thuật toán này O(n)", đa số ngầm hiểu là trường hợp xấu nhất. Lý do: ta cần bảo đảm — biết chắc nó không bao giờ tệ hơn mức nào, để hệ thống không bất ngờ treo khi gặp dữ liệu xui. "Tốt nhất" thì vui nhưng không đáng tin để lập kế hoạch.
Một ví dụ kinh điển: quick sort có xấu nhất O(n²) (khi chọn pivot dở) nhưng trung bình Θ(n log n). Người ta dùng nó vì trung bình rất tốt, đồng thời biết rõ rủi ro xấu nhất để phòng.
5. Mẫu nhận diện
- Có return/break sớm giữa chừng → tốt nhất và xấu nhất thường khác nhau (có Ω riêng, O riêng).
- Luôn duyệt hết dù thế nào (tổng, max, đếm) → tốt nhất = xấu nhất → có Θ rõ ràng.
- Khi không nói rõ, "Big-O" ≈ "xấu nhất".
6. 🎮 Trò chơi: Tốt nhất hay xấu nhất?
7. Quiz kiểm tra nhanh
8. Hoàn thành
…☑️ Tiếp theo: 1.2.5 — Độ phức tạp không gian (đo bộ nhớ, không chỉ thời gian).