Bảng băm (Hash table): ý tưởng & hàm băm
Bảng băm (hash table) là cấu trúc thần kỳ cho phép tra cứu, thêm, xóa O(1) trung bình — gần
như tức thì. Nó là nền của dict và set trong Python. Bạn sẽ hiểu hàm băm biến khóa thành chỉ
số ra sao.
1. Trực quan: tủ gửi đồ có công thức
Mảng tra theo chỉ số số nguyên (O(1)). Nhưng đời thực ta hay tra theo khóa bất kỳ: tên, email, từ. Bảng băm giải bài này bằng một mẹo: biến khóa thành chỉ số qua một hàm băm (hash function).
khóa "an" ──[ hàm băm ]──▶ số 2 ──▶ bang[2]
khóa "ba" ──[ hàm băm ]──▶ số 4 ──▶ bang[4]
Giống tủ gửi đồ mà từ tên bạn tính ra luôn số tủ — không phải dò từng tủ. Biết khóa → tính được chỉ số → nhảy thẳng tới ô. Đó là gốc rễ của O(1).
2. Hàm băm là gì?
Hàm băm nhận một khóa và trả về một số nguyên trong khoảng [0, N) (N = số ô của bảng). Một hàm băm đơn giản (cho mục đích học): cộng mã các ký tự rồi chia lấy dư.
Một hàm băm tốt cần: xác định (cùng khóa luôn ra cùng số), nhanh, và rải đều (ít khóa trùng ô — sẽ bàn ở bài đụng độ).
3. Chạy debug: băm khóa "an" thành chỉ số
Bước qua cách tính chỉ số cho khóa "an" với bảng 5 ô:
4. Tra cứu vì sao O(1)?
Cả khi thêm và khi tìm, ta đều băm khóa ra cùng chỉ số → nhảy thẳng tới đúng ô. Không
duyệt, không dò. Đó là vì sao dict["key"] hay "x" in set gần như tức thì, bất kể bảng to cỡ nào.
Thêm: bang[ bam(key) ] = value
Tìm: value = bang[ bam(key) ] ← cùng chỉ số → O(1)
5. dict & set của Python là bảng băm
6. Mẫu nhận diện
- Cần tra cứu theo khóa bất kỳ (không phải chỉ số) nhanh → bảng băm (
dict). - Cần kiểm tra "đã thấy chưa / có tồn tại không" nhanh →
set. - Thấy mình duyệt đi duyệt lại để tìm → thường thay được bằng dict/set để xuống O(1).
7. 🎮 Trò chơi: Hiểu hash table
8. Quiz kiểm tra nhanh
9. Hoàn thành
…☑️ Tiếp theo: 2.4.2 — Xử lý đụng độ (khi hai khóa rơi vào cùng một ô).