Skip to content

Cấu trúc dữ liệu nâng cao

Mảng và danh sách liên kết giải quyết phần lớn bài toán hằng ngày. Nhưng khi hệ thống cần trả lời hàng triệu range query mỗi giây, khi database phải index hàng tỷ bản ghi trên ổ cứng, khi cluster phân tán cần thêm-bớt node mà không làm sập cache — bạn cần những cấu trúc dữ liệu được thiết kế riêng cho từng lớp bài toán đó.

Module này tập trung vào năm cấu trúc then chốt. Hiểu rõ đặc trưng và giới hạn của từng cấu trúc giúp bạn đưa ra quyết định thiết kế chính xác ngay từ đầu, thay vì thử-sai rồi refactor.

Bảng so sánh tổng quan

Cấu trúcBài toán chínhQueryUpdateĐiểm mạnhĐiểm yếu
Segment TreeRange query tổng quát (sum, min, max, gcd)O(log n)O(log n)Linh hoạt, hỗ trợ lazy propagationCode dài, bộ nhớ 4n
Fenwick TreePrefix sum + point updateO(log n)O(log n)Code ngắn gọn, hằng số nhỏ, bộ nhớ nChỉ hỗ trợ phép toán có nghịch đảo
Heap / Priority QueueTruy xuất phần tử ưu tiên cao nhấtO(1) peekO(log n) insert/extractĐơn giản, nền tảng cho nhiều thuật toánKhông hỗ trợ search hay delete tùy ý
B-Tree / B+ TreeIndex dữ liệu trên diskO(log_B n)O(log_B n)Tối ưu disk I/O, nền tảng databaseCài đặt từ đầu phức tạp
Consistent HashingPhân tán dữ liệu qua nhiều nodeO(log n) lookupO(log n) add/remove nodeTối thiểu key di chuyển khi scaleCần virtual node để cân bằng tải

Khi nào dùng cấu trúc nào?

Ứng dụng thực tế

Lĩnh vựcCấu trúcTình huống cụ thể
DatabaseB+ TreeIndex cho PostgreSQL, MySQL InnoDB
Distributed CacheConsistent HashingRedis Cluster, Memcached phân tán
FinanceSegment TreeMin/Max giá cổ phiếu trong khoảng thời gian
OS SchedulerHeapCPU scheduling, I/O priority queue
Competitive ProgrammingFenwick TreeĐếm nghịch thế, prefix frequency
CDNConsistent HashingĐịnh tuyến request đến edge server gần nhất
Game EngineSegment Tree2D range query cho collision detection

Lộ trình học

Thứ tự đề xuất dựa trên mức độ phụ thuộc kiến thức:

  1. Heap & Priority Queue — Nền tảng, xuất hiện trong Dijkstra, scheduling, top-K. Bắt đầu từ đây nếu chưa vững.
  2. Segment Tree — Vua range query, thiết yếu cho competitive programming và database aggregate.
  3. Fenwick Tree (BIT) — Phiên bản gọn nhẹ của Segment Tree cho bài toán prefix sum.
  4. B-Tree & B+ Tree — Kiến trúc lõi của storage engine, cần hiểu disk I/O.
  5. Consistent Hashing — Kỹ thuật system design, cầu nối sang distributed systems.

Quy tắc chọn nhanh

Prefix sum + point update → Fenwick Tree. Min/Max hoặc lazy range update → Segment Tree. Phần tử ưu tiên cao nhất → Heap. Dữ liệu trên disk → B-Tree. Phân tán nhiều node → Consistent Hashing.

🧠 Quiz

Câu 1: Fenwick Tree (BIT) và Segment Tree khác nhau cơ bản ở điểm nào?

  • [ ] A) Fenwick Tree nhanh hơn Segment Tree trong mọi trường hợp
  • [x] B) Fenwick Tree code ngắn hơn, ít bộ nhớ hơn, nhưng Segment Tree linh hoạt hơn (hỗ trợ lazy propagation, range update)
  • [ ] C) Segment Tree chỉ dùng cho sum query, Fenwick Tree dùng cho mọi loại
  • [ ] D) Không có sự khác biệt, chỉ là hai cách implement cùng ý tưởng

💡 Giải thích: Fenwick Tree: ~15 dòng code, 1×N bộ nhớ, O(log n) cho point update + prefix query. Segment Tree: ~50+ dòng, 4×N bộ nhớ, nhưng hỗ trợ range update (lazy propagation), merge query phức tạp. Chọn Fenwick khi đủ, Segment Tree khi cần linh hoạt.

Câu 2: Heap (Priority Queue) đảm bảo thao tác nào nhanh nhất?

  • [ ] A) Tìm kiếm phần tử bất kỳ — O(1)
  • [x] B) Lấy phần tử min/max — O(1), insert/delete — O(log n)
  • [ ] C) Sắp xếp toàn bộ — O(n)
  • [ ] D) Truy cập phần tử theo index — O(1)

💡 Giải thích: Heap property đảm bảo root luôn là min (min-heap) hoặc max (max-heap) → peek O(1). Insert và extract đều O(log n) nhờ heapify up/down. Không hỗ trợ tìm kiếm hay truy cập theo index hiệu quả.