1.1. Định nghĩa
Trong hầu hết cỏc ứng dụng, khoỏ được dựng nhưmột phương thức để truy xuất dữ liệu một cỏch giỏn tiếp. Hàm được dựng để ỏnh xạ
một khoỏ vào một dóy cỏc số nguyờn và dựng cỏc giỏ trị nguyờn này
để truy xuất dữ liệu được gọi là hàm băm (hỡnh 2.1)
K h(K)
hỡnh 2.1
Nhưvậy, hàm băm là hàm biến đổi khúa của phần tử thànhđịa chỉ
trờn bảng băm.
Khúa cú thể là dạng số hay số dạng chuỗị Để giải quyết vấn đề băm
với cỏc khoỏ khụng phải là số nguyờn chỳng ta tỡm cỏch biến đổi
khoỏ thành số nguyờn, chẳng hạn:
loại bỏ dấu ‘-’ trong mó số 9635-8904đưa về số nguyờn 96358904
Đối với chuỗi, sử dụng giỏ trị cỏc ký tự trong bảng mó ASCCI
Sauđú sử dụng cỏc hàm băm chuẩn trờn số nguyờn.
Yờu cầu đối với hàm băm tốt
Hàm băm tốt thỏa món cỏcđiều kiện sau:
Tớnh toỏn nhanh
Cỏc khoỏđược phõn bố đều trong bảng
Ít xảy ra đụng độ.
1.2. Vớ dụ về cỏc hàm băm
(i) Hàm băm dạng bảng tra
Hàm băm cú thể tổ chức ở dạng bảng tra (cũn gọi là bảng truy xuất),
thụng dụng nhất làở dạng cụng thức.
CHƯƠNG 2 - BẢNG BĂM (HASH TABLE)
2
Vớ dụ sau đõy là bảng tra với khúa là bộ chữ cỏi, bảng băm cú 26 địa
chỉ từ 0 đến 25. Khúa a ứng với địa chỉ 0, khoỏ b ứng với địa chỉ
1,… , zứng với địa chỉ 25.
Khoỏ Địa chỉKhúa Địa chỉ Khúa Địa chỉ KhúaĐịa chỉ
a 0 h 7 o 14 v 21 b 1 I 8 p 15 w 22 c 2 j 9 q 16 x 23 d 3 k 10 r 17 y 24 e 4 l 11 s 18 z 25 f 5 m 12 t 19 / / g 6 n 13 u 20 / /
Hàm băm dạng bảng trađược tổ chức dưới dạng danh sỏch kề.
(ii) Hàm băm dạng cụng thức
Thụng thường hàm băm dạng cụng thức được xõy dựng theo dạng
tổng quỏt f(key).
Người ta thường dựng hàm băm chia dư(% modulo) nhưcỏc vớ dụ 1
và 2 sau:
Vớ dụ 1: f(key) = key % 10:
Theo vớ dụ này, hàm băm f(key) sẽ băm cỏc số nguyờn thành 10 địa
chỉ khỏc nhau (ỏnh xạ vào cỏc địa chỉ từ 0, 1,…, 9). Cỏc khúa cú
hàngđơn vị là 0được băm vàođịa chỉ 0, cỏc khúa cú hàngđơn vị là i (i=0 | 1 | … | 9)được băm vàođịa chỉ thứ ị
Vớ dụ 2: f(key)=key % M:
Hàm băm loại này cho phộp băm cỏc số nguyờn thành M địa chỉ
khỏc nhau (ỏnh xạ vào cỏcđịa chỉ từ 0, 1,… M-1).
Vớ dụ 3: Giả sử cần xõy dựng một hàm băm với tập khúa số là chuỗi
10 kớ tự, tập địa chỉ cú M địa chỉ khỏc nhau .
Cú nhiều cỏchđể xõy dựng hàm băm này, vớ dụ cộng dồn mó ASCII của từng kớ tự, sau đú chia dư(% modulo) cho M.
Thụng thường, hàm băm dạng cụng thức rất đa dạng và khụng bị
ràng buộc bởi một tiờu chuẩn nào cả.
1.3. Xõy dựng hàm băm
(i) Hàm băm sử dụng phương phỏp chia
Dựng số dư:
o h(k) =kmodm
o klà khoỏ,mlà kớch thước của bảng.
vấn đề chọn giỏ trị m
m= 2n(khụng tốt)
nếuchọn m= 2n
thụng thường khụng tốt
h(k) = k mod 2n sẽ chọn cựng n bits cuối của k
mlà nguyờn tố (tốt)
Gia tăng sự phõn bố đều
Thụng thường m được chọn là số nguyờn tố gần với 2n o Chẳng hạn bảng ~4000 mục, chọn m= 4093 (ii) Hàm băm sử dụng phương phỏp nhõn Sử dụng o h(k) = m (k Amod 1) o k là khúa, m là kớch thước bảng, Alà hằng số: 0 < A <1 Chọn m và A
o M thường chọn m =2p
o Sự tối ưu trong việc chọn A phụ thuộc vàođặc trưng của dữ liệụ o Theo Knuth chọn A = 1/2(5 -1) 0.618033987 được xem là tốt. (iii) Phộp băm phổ quỏt Việc chọn hàm băm khụng tốt cú thể dẫn đến xỏc suất đụng độ lớn. Giải phỏp:
o Lựa chọn hàm băm h ngẫu nhiờn.
o Chọn hàm bămđộc lập với khúạ
o Khởi tạo một tập cỏc hàm băm H phổ quỏt và từ đú h được chọn ngẫu nhiờn.
Một tập cỏc hàm băm H là phổ quỏt (universal) nếu với mọi
f, kH và hai khoỏ k, l ta cú xỏc suất: Pr{f(k)=f(l)} <= 1/m