Thao tác cơ bản trên mảng & độ phức tạp
Bạn sẽ học được gì
Bảng độ phức tạp của các thao tác mảng — và quan trọng hơn, vì sao lại như vậy. Bạn sẽ "nhìn thấy" cảnh các phần tử phải dịch chỗ khi chèn vào đầu, để hiểu tận gốc con số O(n).
1. Bảng độ phức tạp các thao tác
| Thao tác | Độ phức tạp | Vì sao |
|---|---|---|
Truy cập A[i] | O(1) | Tính địa chỉ trực tiếp |
Cập nhật A[i] = x | O(1) | Ghi thẳng vào ô |
| Tìm kiếm (chưa sắp xếp) | O(n) | Phải duyệt từng phần tử |
Thêm cuối (append) | O(1) amortized | Ghi vào ô trống cuối |
| Chèn ĐẦU / GIỮA | O(n) | Phải dịch các phần tử phía sau |
| Xóa ĐẦU / GIỮA | O(n) | Phải dịch các phần tử lấp chỗ trống |
| Xóa CUỐI | O(1) | Bỏ ô cuối, không dịch ai |
Điểm cần nhớ: đầu/giữa = O(n), cuối = O(1). Lý do nằm ở tính liền kề của mảng.
2. Chạy debug: vì sao chèn ĐẦU tốn O(n)?
Để giữ các ô liền kề, chèn vào đầu buộc mọi phần tử dịch sang phải một ô. Bước qua cảnh chèn
10 vào đầu [20, 30, 40] — đếm số lần dịch:
Mảng c àng dài, càng nhiều phần tử phải dịch. Đó là lý do chèn đầu/giữa là O(n).
3. Code mẫu (chạy thật)
Đang tải trình chạy code…
insert(0, ...) và pop(0) trông gọn một dòng, nhưng bên trong Python phải dịch cả mảng → O(n).
Đừng để cú pháp ngắn đánh lừa về chi phí thật.
4. Mẹo: tránh thao tác đầu/giữa khi có thể
- Cần thêm/xóa liên tục ở đầu → cân nhắc deque (hàng đợi hai đầu) hoặc danh sách liên kết (học sau) — thêm/xóa đầu O(1).
- Xây mảng kết quả → luôn append vào cuối thay vì chèn đầu rồi đảo.
- Xóa nhiều phần tử giữa chừng → thường gom lại và tạo mảng mới một lần (O(n)) còn rẻ hơn xóa từng cái (O(n) mỗi lần → O(n²)).
5. Mẫu nhận diện
- Thao tác chủ yếu là đọc/ghi theo chỉ số và thêm cuối → mảng là lựa chọn tuyệt vời.
- Thấy mình
insert(0, ...)hoặcpop(0)trong vòng lặp → cảnh báo O(n²), tìm cách khác.
6. 🎮 Trò chơi: Đoán độ phức tạp thao tác mảng
7. Quiz kiểm tra nhanh
📝 Quiz kiểm tra nhanh
1. Vì sao chèn vào giữa mảng là O(n)?
2. Thao tác nào trên mảng là O(1)?
3. pop(0) lặp trong vòng for n lần có nguy cơ gì?
8. Hoàn thành
…☑️ Tiếp theo: 2.1.3 — Mảng nhiều chiều (ma trận, lưới 2D).