Hash Table — Bí quyết tìm kiếm O(1)
Bạn có bao giờ tự hỏi: Tại sao tra cứu một từ trong cuốn từ điển Oxford 3000 trang lại nhanh đến thế? Bạn không lật từng trang từ đầu đến cuối (Array O(n)). Bạn nhảy thẳng đến phần chữ cái đầu tiên của từ đó.
Chào mừng bạn đến với Phần 3: Non-linear Data Structures (Cấu trúc dữ liệu phi tuyến). Cấu trúc đầu tiên và cũng là cấu trúc mạnh mẽ nhất trong việc tìm kiếm dữ liệu: Hash Table (Bảng băm).
📋 Agenda
Thời gian đọc ước tính: ~8 phút
Sau bài này, bạn sẽ:
- ✅ Hiểu được cơ chế hoạt động của Hash Table dưới bộ nhớ.
- ✅ Giải thích được Hash Function (Hàm băm) là gì và tại sao nó lại kỳ diệu.
- ✅ Tự tay implement một Hash Table đơn giản và xử lý đụng độ (Collision) bằng TypeScript.
- ✅ Phân biệt được sự khác nhau giữa
ObjectvàMaptrong JavaScript/TypeScript.
Yêu cầu đầu vào:
- 🔹 Có kiến thức cơ bản về Array và Linked List.
❓ Tại sao Array và Linked List là chưa đủ?
Vấn đề (Problem Statement):
Bạn đang làm chức năng giỏ hàng. Bạn cần kiểm tra xem sản phẩm có mã SKU-9999 đã nằm trong giỏ hàng (chứa 10,000 sản phẩm) hay chưa.
- Dùng Array: Bạn phải dùng vòng lặp
forchạy qua từng phần tử để kiểm tra. Mất O(n). - Dùng Linked List: Lại phải chạy từ
Headđến phần tử cần tìm. Vẫn mất O(n).
Giải pháp (Solution):
Chúng ta cần một "phép thuật" để từ mã SKU-9999, máy tính tính toán ngay lập tức ra được vị trí bộ nhớ chính xác đang cất giữ thông tin món hàng đó và lôi nó ra trong chớp mắt — O(1).
Phép thuật đó có tên là Hash Table.
📖 Hash Table hoạt động như thế nào?
Định nghĩa: Hash Table (Bảng băm) là một cấu trúc dữ liệu lưu trữ theo cặp Key - Value (Khóa - Giá trị). Nó sử dụng một hàm toán học gọi là Hash Function để biến đổi Key thành một con số (Index). Con số này chính là vị trí trong một Array ẩn bên dưới.
Trực quan hóa cơ chế Hashing
3 Bước của một thao tác Lưu (Set):
- Bạn đưa Key
"apple". - Hash Function chạy và trả về số
2(Rất nhanh, O(1)). - Dữ liệu được lưu vào
Array[2].