Mảng vs linked list: chọn cái nào?
Hai cấu trúc cùng lưu một dãy phần tử, nhưng đánh đổi ngược nhau. Bài này tổng kết khi nào chọn mảng, khi nào chọn linked list — kèm một yếu tố thực tế hay bị bỏ quên: cache.
1. Bảng so sánh đầy đủ
| Tiêu chí | Mảng | Linked list |
|---|---|---|
| Truy cập phần tử thứ i | O(1) ✅ | O(n) |
| Tìm kiếm (chưa sắp xếp) | O(n) | O(n) |
| Thêm/xóa ở ĐẦU | O(n) | O(1) ✅ |
| Thêm/xóa ở CUỐI | O(1)* | O(1) nếu giữ con trỏ đuôi |
| Thêm/xóa ở GIỮA (đã có con trỏ) | O(n) | O(1) ✅ |
| Bộ nhớ thêm | không | mỗi nút +1 con trỏ |
| Tính cục bộ cache | tốt ✅ | kém |
*Thêm cuối mảng động là amortized O(1).
2. Yếu tố ẩn: tính cục bộ cache (cache locality)
Trên lý thuyết cả hai đều "O(n) khi duyệt". Nhưng thực tế mảng thường nhanh hơn khi duyệt, vì các phần tử nằm liền kề → CPU nạp cả khối vào cache một lần, đọc rất nhanh. Linked list rải rác khắp bộ nhớ → mỗi nút có thể là một lần "đi tìm" tốn kém (cache miss).
Bài học thực tế: với dữ liệu duyệt tuần tự nhiều, mảng thường thắng dù cùng Big-O, nhờ cache. Big-O cho biết xu hướng, nhưng hằng số ẩn (do cache) cũng quan trọng trong đời thực.
3. So tốc độ thực tế (chạy thử)
Chèn đầu mảng (O(n) mỗi lần) đắt hơn hẳn — đây chính là lúc linked list (chèn đầu O(1)) toả sáng.
4. Cây quyết định: chọn cái nào?
Cần truy cập theo chỉ số nhiều? ──Có──▶ MẢNG (O(1) truy cập)
│ Không
▼
Thêm/xóa liên tục ở đầu/giữa? ──Có──▶ LINKED LIST (O(1) sửa con trỏ)
│ Không
▼
Duyệt tuần tự là chính? ──Có──▶ MẢNG (cache tốt hơn)
│
▼
Mặc định: MẢNG (đơn giản, cache tốt, đủ dùng đa số trường hợp)
Sự thật thực tế: đa số lúc, mảng động là lựa chọn mặc định tốt nhờ đơn giản + cache. Linked list toả sáng ở các tình huống chuyên biệt: hàng đợi/ngăn xếp, deque, LRU cache, khi thêm/xóa đầu là thao tác chính.
5. Mẫu nhận diện
- Hỏi "truy cập theo vị trí nhiều không?" → Có thì mảng.
- Hỏi "thêm/xóa đầu/giữa nhiều không?" → Có thì linked list.
- Không chắc → mặc định mảng (cache + đơn giản), đổi sang linked list khi đo được lợi ích.
6. 🎮 Trò chơi: Chọn cấu trúc
7. Quiz kiểm tra nhanh
8. Hoàn thành — XONG Chương 2.2! 🎉
…☑️ Hết Chương 2.2 (Danh sách liên kết). Tiếp theo: 2.3.1 — Ngăn xếp (Stack).