Wiki Độ phức tạp Độ phức tạp thời gian (Big-O)

Độ phức tạp thời gian (Big-O)

huunguyen huunguyen Updated Tháng tư 3, 2026

Độ phức tạp thời gian mô tả tốc độ tăng của thời gian chạy khi kích thước đầu vào N tăng lên. Đây là công cụ để đánh giá xem một thuật toán có đủ nhanh cho một bài toán hay không.

Ký hiệu Big-O

Big-O (O) mô tả cận trên của thời gian chạy trong trường hợp xấu nhất. Ta bỏ qua hằng số và các số hạng bậc thấp.

Ví dụ: 3N2+5N+10=O(N2)

Các độ phức tạp thường gặp

Ký hiệu Tên Ví dụ
O(1) Hằng số Truy cập phần tử mảng
O(logN) Logarithm Tìm kiếm nhị phân
O(N) Căn bậc hai Kiểm tra số nguyên tố
O(N) Tuyến tính Duyệt mảng một lần
O(NlogN) Tuyến tính-log Merge sort, Heap sort
O(N2) Bậc hai Bubble sort, vòng lặp lồng nhau
O(N3) Bậc ba Floyd-Warshall
O(2N) Hàm mũ Duyệt tất cả tập con
O(N!) Giai thừa Duyệt hoán vị

Cách tính độ phức tạp

Vòng lặp đơn — O(N)
for (int i = 0; i < n; i++) {
    // O(1) mỗi lần lặp
}
// Tổng: O(N)
Vòng lặp lồng nhau — O(N2)
for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        // O(1) mỗi lần lặp
    }
}
// Tổng: O(N^2)
Chia đôi mỗi bước — O(logN)
int x = n;
while (x > 1) {
    x /= 2;
}
// Tổng: O(log N)
Hai đoạn độc lập — O(N+M)
for (int i = 0; i < n; i++) { ... }  // O(N)
for (int j = 0; j < m; j++) { ... }  // O(M)
// Tổng: O(N + M)

Thứ tự tăng dần

O(1)<O(logN)<O(N)<O(N)<O(NlogN)<O(N2)<O(N3)<O(2N)<O(N!)

Ví dụ thực tế

Bài toán: Kiểm tra xem mảng có hai phần tử bằng nhau không.

// Cách 1: O(N^2) — vòng lặp lồng nhau
for (int i = 0; i < n; i++)
    for (int j = i+1; j < n; j++)
        if (a[i] == a[j]) return true;

// Cách 2: O(N log N) — sắp xếp rồi kiểm tra kề nhau
sort(a, a+n);
for (int i = 0; i+1 < n; i++)
    if (a[i] == a[i+1]) return true;

// Cách 3: O(N) — dùng hash set
unordered_set<int> seen;
for (int x : a)
    if (!seen.insert(x).second) return true;
gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0