Độ 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 . 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 | ~ |
long long |
8 bytes | ~ |
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
int1 triệu phần tử: MB - Mảng
long long1 triệu phần tử: MB - Ma trận
int: MB - Ma trận
int: MB ❌ (quá giới hạn!)
Các mức độ phức tạp không gian
| Ký hiệu | Ví dụ |
|---|---|
| Chỉ dùng vài biến, không phụ thuộc | |
| Stack đệ quy của tìm kiếm nhị phân | |
| Một mảng phần tử | |
| Ma trận |
Ví dụ
— không gian hằng số
long long sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
— 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];
— 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 có thể bị RE do stack overflow.
- Trong Python, mọi đối tượng đều có overhead — một
intPython 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
Bình luận