Wiki Độ phức tạp Độ phức tạp không gian

Độ phức tạp không gian

huunguyen huunguyen Updated Tháng tư 3, 2026

Độ phức tạp không gian mô tả lượng bộ nhớ mà thuật toán sử dụng theo kích thước đầu vào N. Cũng dùng ký hiệu Big-O như độ phức tạp thời gian.

Tại sao quan trọng?

Mỗi bài toán có giới hạn bộ nhớ (thường là 256 MB). Nếu vượt quá, bạn sẽ nhận kết quả MLE (Memory Limit Exceeded).

Kích thước kiểu dữ liệu trong C++

Kiểu Kích thước Giá trị tối đa
int 4 bytes ~2.1×109
long long 8 bytes ~9.2×1018
double 8 bytes
char 1 byte
bool 1 byte

Ước lượng bộ nhớ

Công thức: Số phần tử × kích thước mỗi phần tử

Ví dụ:

  • Mảng int 1 triệu phần tử: 106×4=4 MB
  • Mảng long long 1 triệu phần tử: 106×8=8 MB
  • Ma trận int 1000×1000: 106×4=4 MB
  • Ma trận int 104×104: 108×4=400 MB ❌ (quá giới hạn!)

Các mức độ phức tạp không gian

Ký hiệu Ví dụ
O(1) Chỉ dùng vài biến, không phụ thuộc N
O(logN) Stack đệ quy của tìm kiếm nhị phân
O(N) Một mảng N phần tử
O(N2) Ma trận N×N

Ví dụ

O(1) — không gian hằng số
long long sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
O(N) — tuyến tính
vector<long long> prefix(n+1, 0);
for (int i = 0; i < n; i++)
    prefix[i+1] = prefix[i] + a[i];
O(N2) — bình phương
int adj[1000][1000];  // 4 MB với N = 1000

Lưu ý thực tế

  • Stack đệ quy sâu cũng tốn bộ nhớ. Đệ quy sâu N=105 có thể bị RE do stack overflow.
  • Trong Python, mọi đối tượng đều có overhead — một int Python tốn ~28 bytes (so với 4 bytes trong C++).
import sys
a = [0] * 10**6
print(sys.getsizeof(a))  # ~8 MB
int a[1000000];  // 4 MB chính xác
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