Bài giảng Cấu trúc dữ liệu: Bảng băm cung cấp cho người học những kiến thức như: Hàm băm (hash function); Bảng băm; Đụng độ và xử lí đụng độ; Chuỗi liên kết; Dò tuyến tính/ bậc 2/ băm kép; Kết luận. Mời các bạn cùng tham khảo!
Trang 1TS Lê Minh Trung – ThS Lương Trần Ngọc Khiết Khoa Công nghệ Thông tin, Đại học Sư phạm TP HCM
Trang 2Bảng băm (Hash Table)
Hàm băm (hash function)
Trang 3Bài toán tìm kiếm
Trang 4Hàm băm (Hash function)
Là hàm ℎ ánh xạ từ tập các khóa (key) K vào 0, 𝑁 − 1
ℎ: 𝐾 → {0,1,2, … , 𝑁 − 1}
𝑘 ∈ 𝐾, ℎ(𝑘) được gọi là giá trị băm của 𝒌.
Tập các khóa K có thể là tập các chuỗi, các số tự nhiên…
ℎ: 𝑍+ → [0, 𝑁 − 1] với ℎ 𝑘 = 𝑘 𝑚𝑜𝑑 𝑁
Trang 8Bảng băm (Hash Table)
Là một bảng (mảng) có kích cỡ hash_size = N.
N thường được chọn là số nguyên tố
Mẩu tin (record) có khóa là k sẽ được lưu trữ tại vị trí
Trang 9(các khóa
thật sự dùng)
Trang 10K (các khóa
thật sự dùng)
Đụng độ
Trang 11Ví dụ bảng băm
Thêm vào các khóa 51, 24, 37, 42, 88.
1 2 3 4 5 6 7 8 9
51
24
37 42
88
Tìm 37
Tìm 62
Trang 12Đụng độ
Làm thế nào để giải quyết đụng độ???
Chuỗi liên kết (chaining)
Địa chỉ mở (open addressing)
0 1 2 3 4 5 6 7 8 9
51
24
37 42
88
Thêm khóa 5454
Đụng độ
Trang 13Chuỗi liên kết
Đặt các khóa có cùng giá trị băm (hash value) trong cùng
một danh sách liên kết gắn với một ô của bảng băm.
K (actual
Trang 15Chuỗi liên kết
Xóa một phần tử như thế nào?
Có thể sử dụng danh sách liên kết đôi để xóa hiệu quả hơn?
Trang 17Chuỗi liên kết- Ví dụ
Thêm 24, 51, 88,42, 37 0
1 2 3 4 5 6 7 8 9
51
24
37 42
88
NULL NULL
NULL NULL NULL NULL NULL NULL NULL
Trang 18Lợi ích của phương pháp chuỗi liên kết
Nếu số lượng mẫu tin lớn: tiết kiệm vùng nhớ.
Giải quyết đụng độ: đơn giản là đẩy vào cùng một
danh sách liên kết.
Bảng băm nhỏ hơn nhiều so với số lượng mẫu tin.
Xóa một phần tử là đơn giản và nhanh chóng.
Độ phức tạp khi tìm kiếm:
Nếu có n mẫu tin, và bảng hash có kích thước N
Độ dài trung bình của DSLK là n/N
Trang 19Địa chỉ mở (Open Addressing)
Thêm phần tử vào có khóa k vào
Nếu ô h(k) đầy tìm ô kế tiếp… tìm được một ô chưa đầy thêm phần tử có khóa k vào (probing –thăm dò)
Các kĩ thuật dò tìm: linear/quadratic/double hashing…
Tìm kiếm phần tử có khóa k
Bắt đầu tìm từ ô h(k) nếu chưa tìm thấy, tìm tại ô kếtiếp … cho đến ô cuối
Trang 20Phương pháp thăm dò
Trả lời câu hỏi: ô kế tiếp sẽ được thăm dò là ô nào?
1. Thăm dò tuyến tính (Linear Probing)
2. Thăm dò bậc 2 (Quadratic Probing)
3. Thăm dò băm kép (double hashing)
Trang 2224
37 42
Not Found
Việc tìm kiếm sẽ kết thúc khi
Tìm thấy khóa cần tìm
Gặp một ô trống
Số lần thăm dò = N-1
Trang 23Thăm dò bậc 2
Ô thứ i được thăm dò có chỉ số
h(k,i) = (h(k) + c*i2 + d) mod N
Thông thường (c,d) = (1,0) hay (1,1)
Nếu c=1, d=0 thì các ô được thăm dò lần lượt là
h= h(k), (h + 12) mod N , (h+ 22) mod N, (h + 32) mod N,…
Nếu N là số nguyên tố thì
Các ô được thăm dò sẽ lặp lại sau (N+1)/2 bước
Trang 2524
37 42
88
Thêm 61
(i=2)
Xung đột
61
Thêm 98 (i=1)
98
Thêm 108 (i=5)
108
Tìm 108
(i=5)
Tìm 47 i=3 gặp ô trống Not
Trang 28Chọn hàm băm
Chọn hàm băm là phần quan trọng trong quá trình băm
Hàm được chọn tốt sẽ cho ra các chỉ số được phân bố
đều trên bảng băm ít xung đột
Nếu hàm chọn không tốt dữ liệu sẽ co cụm trên một vài
phần nào đó của bảng xung đột nhiều
Với mỗi phương pháp, chọn hàm băm đều có các tiêu chí
để hàm cho ra phân bố đều
Trang 29Đánh giá phương pháp dùng bảng Hash
load factor λ = số khóa/kích thước bảng hash=n/N
Tìm kiếm với bảng băm chuỗi nối kết:
1+(1/2)λ phép thử khi tìm thấy
λ phép thử khi không tìm thấy
Tìm với bảng hash địa chỉ mở (dò ngẫu nhiên):
(1/λ)ln (1/(1-λ)) phép thử khi tìm thấy
1/(1-λ) phép thử khi không tìm thấy
Tìm với bảng hash địa chỉ mở (dò tuyến tính):
(1/2)(1 + 1/(1-λ)) phép thử khi tìm thấy
(1/2)(1 + 1/(1-λ)2) phép thử khi không tìm thấy
Trang 30So sánh các phương pháp
Trang 31So sánh các phương pháp (tt.)
Trang 32CÁM ƠN VÌ ĐÃ LẮNG NGHE!