Không gian tự học dành cho sinh viên UET

Chào mừng đến với UETệ

Tìm bài giảng theo học phần, hiểu lại những kiến thức nền và ôn tập theo nhịp học của bạn.

Bài giảng
Đọc Notes, ôn nhanh với Slides và luyện tập qua các bài có lời giải.
Wiki kiến thức
Tra cứu thuật ngữ và bổ sung kiến thức nền ngay khi cần.
Góc học tập
Ôn bằng flashcard, lưu ghi chú và hẹn giờ tập trung.

Bạn có thể xem lại phần giới thiệu ở cuối trang.

Buy me a coffee

Website hoàn toàn miễn phí. Nếu thấy hữu ích, bạn có thể tặng tôi một cốc cà phê theo thông tin dưới đây nhé!

Mã QR chuyển khoản Momo
Ngân hàng
Momo
Tên người nhận
MOMO - TKTH DO MINH TRI
Số tài khoản
01MMTTT0060405229
Skip to content

Phân tích độ phức tạp

Bài 1Cập nhật 11/10/2026Ghi chú của bạn

Khi mới bắt đầu học lập trình, bạn chỉ quan tâm: "Chương trình chạy ra kết quả đúng chưa?".
Nhưng khi học Cấu trúc Dữ liệu & Giải thuật tại UET, câu hỏi quan trọng gấp 10 lần là:
"Chương trình chạy đúng, nhưng nếu dữ liệu tăng từ 1.000 phần tử lên 10.000.000 phần tử thì máy tính chạy trong 0.1 giây hay chạy mất 3 ngày?"

Đó chính là lý do Ký hiệu ra đời.


1. Ẩn dụ Dễ hiểu: Ký hiệu Big-O là gì? ​

Hãy tưởng tượng bạn cần gửi một tập tài liệu 100 GB cho một người bạn ở TP. Hồ Chí Minh:

  • Cách 1: Gửi qua mạng Internet.
    Nếu mạng có tốc độ cố định, 1 GB mất 1 phút → 100 GB mất 100 phút. Nếu gửi 1.000 GB sẽ mất 1.000 phút.
    ⇒ Thời gian tăng tuyến tính theo kích thước dữ liệu: O(n).

  • Cách 2: Chép vào USB rồi đi máy bay mang vào.
    Dù USB chứa 1 file text 1 KB hay chứa đầy 100 GB dữ liệu, thời gian bay từ Hà Nội vào TP.HCM vẫn cố định là 2 tiếng.
    ⇒ Thời gian không đổi bất kể dữ liệu lớn thế nào: O(1).

Định nghĩa Feynman

không đo bằng "giây" hay "mili-giây" (vì máy tính mỗi người mạnh yếu khác nhau).
Big-O đo tốc độ tăng số phép tính khi kích thước đầu vào n tăng lên vô hạn.


2. Bảng Xếp hạng Tốc độ từ Nhanh đến Chậm ​

Dưới đây là các bạn sẽ gặp liên tục trong mọi bài thi và bài kiểm tra:

Ký hiệuTên gọiTốc độVí dụ thực tế
O(1)Hằng số (Constant)Nhanh nhấtTruy cập phần tử mảng bằng chỉ số a[i], Push/Pop đỉnh Stack
O(log⁡n)Logarit (Logarithmic)Rất nhanhTìm kiếm nhị phân (Binary Search), Tìm kiếm trên cây BST cân bằng
O(n)Tuyến tính (Linear)TốtDuyệt tìm kiếm tuần tự từ đầu đến cuối mảng 1 vòng for
O(nlog⁡n)Tuyến tính LogKháMergeSort, QuickSort (trung bình), HeapSort
O(n2)Bậc hai (Quadratic)Chậm2 vòng lặp lồng nhau (BubbleSort, SelectionSort)
O(2n)Hàm mũ (Exponential)Cực chậmĐệ quy quay lui giải bài toán cái túi hoặc tháp Hà Nội
O(n!)Giai thừa (Factorial)Không khả thiVét cạn người du lịch (TSP) thử mọi hoán vị

3. Mẹo Tính Nhanh Độ phức tạp Trong Bài Thi ​

Quy tắc 1: Bỏ qua Hằng số & Phần tử bậc thấp ​

  • Thuật toán chạy f(n)=5n2+100n+9999 phép tính.
  • Khi n tiến ra vô hạn (ví dụ n=1.000.000), n2 sẽ áp đảo hoàn toàn 100n và 9999.
  • ⇒ đơn giản là O(n2).

Quy tắc 2: Vòng lặp đơn và Vòng lặp lồng nhau ​

cpp
// Vòng lặp O(n)
for (int i = 0; i < n; i++) {
    // Thực hiện thao tác O(1)
}

// Hai vòng lặp lồng nhau O(n^2)
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        // Thực hiện thao tác O(1)
    }
}

Quy tắc 3: Biến đếm nhân đôi hoặc chia đôi cho thời gian logarithm ​

cpp
// Biến i tăng theo cấp số nhân: i = 1, 2, 4, 8, 16...
// Số bước lặp k thỏa mãn 2^k = n  ==> k = log2(n)
for (int i = 1; i < n; i = i * 2) {
    cout << i << "\n";
}

Mỗi khi bạn thấy vòng lặp bước nhảy nhân đôi i *= 2 hoặc chia đôi n /= 2, chắc chắn là O(log⁡n).


4. Phân biệt: Time Complexity vs Space Complexity ​

  • Time Complexity ( thời gian): Đếm tổng số thao tác cơ bản của thuật toán.
  • Space Complexity ( không gian / bộ nhớ): Đếm lượng bộ nhớ phụ trội mà thuật toán cấp phát thêm (không tính bộ nhớ chứa dữ liệu mảng ban đầu).
    • Ví dụ: Đảo ngược mảng ngay trên mảng ban đầu → Bộ nhớ phụ O(1) (In-place).
    • Tạo thêm một mảng mới kích thước n để chứa kết quả → Bộ nhớ phụ O(n).

5. Hệ thống bài tập tự luyện ​

Toàn bộ hệ thống bài tập thực hành chuyên sâu của bài học này đã được tích hợp đầy đủ tại tab Bài tập ở đầu trang. Sau khi đọc xong phần lý thuyết, bạn hãy bấm chuyển sang tab Bài tập để bắt đầu luyện tập.

Chuyển sang Tab Bài tập

Bấm vào tab Bài tập trên thanh điều hướng bài giảng ở đầu trang để mở các bài tập thực chiến có hướng dẫn chi tiết và kiểm chứng tự động.

6. Nguồn tham khảo & Đọc thêm ​

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Introduction to Algorithms (CLRS), MIT Press, Chương 3 (Growth of Functions) và Chương 4 (Divide-and-Conquer).
  • Big-O Cheat Sheet - Bảng tra cứu trực quan của toàn bộ cấu trúc dữ liệu và giải thuật.
Ảnh & sơ đồ
100%
Ảnh tài liệu được phóng to