3. CÁC PHƯƠNG PHÁP GIẢI QUYẾT ĐỤNG ĐỘ
3.5. Bảng băm với phương phỏp băm kộp (Double hashing Method)
(Double hashing Method)
Mụ tả:
-Cấu trỳc dữ liệu:Bảng băm này dựng hai hàm băm khỏc nhau với
mục đớch để rải rỏc đều cỏc phần tử trờn bảng băm.
Chỳng ta cú thể dựng hai hàm băm bất kỡ, vớ dụ chọn hai hàm băm nhưsau:
f1(key)= key %M.
f2(key) =(M-2)-key %(M-2).
bảng băm trong trường hợp nàyđược cài đặt bằng danh sỏch kề cú
M phần tử, mỗi phần tử của bảng băm là một mẩu tin cú một trường
keyđể lưu khoỏ cỏc phần tử.
-Khi khởi độngbảng băm, tất cả trường key được gỏn NULL.
- Khi thờm phần tử cú khoỏ key vào bảng băm, thỡ i=f1(key) và j=f2(key) sẽ xỏc định địachỉ i và j trong khoảng từ 0 đến M-1:
Nếu chưa bị xung đột thỡ thờm phần tử mới tại địa chỉ i nàỵ Nếu bị xung đột thỡ hàm băm lại lần 1 f1 sẽ xột địa chỉ mới
i+j, nếu lại bị xung đột thỡ hàm băm lại lần 2 f2 sẽ xột địa chỉ
i+2j, …, quỏ trỡnh cứ thế cho đến khi nào tỡm được địa chỉ
trống và thờm phần tử vàođịa chi nàỵ
- Khi tỡm kiếm một phần tử cú khoỏ key trong bảng băm, hàm băm i=f1(key) và j=f2(key) sẽ xỏc định địa chỉ i và j trong khoảng từ 0 đến M-1. Xột phần tử tại địa chỉ i, nếu chưa tỡm thấy thỡ xột tiếp
phần tử i+ji+2j, …, quỏ trỡnh cứ thế cho đến khi nào tỡmđược khoỏ
(trường hợp tỡm thấy) hoặc bị rơi vào địa chỉ trống (trường hợp
khụng tỡm thấy).
Bảng băm dựng hai hàm băm khỏc nhau, hàm băm lại của phương phỏp băm kộpđược tớnh theo I (từ hàm băm thứ nhất) và j (từ hàm băm thứ hai) theo một cụng thức bất kỡ,ở đõy minh họa bằng địa chỉ
mới cỏch j. Nếu đó dũđến cuối bảng thỡ trở về dũ lại từ đầu bảng.
Bảng băm với phương phỏp băm kộp nờn chọn số địa chỉ M là số
nguyờn tố.
Bảng băm minh họa cú cấu trỳc nhưsau: - Tập khúa K: tập số tự nhiờn
- Tập địa chỉ M: gồm 10 địa chỉ (M={0, 1, …, 9})
- Hàm băm f(key) = key % 10. Minh hoạ:
Sau đõy là minh hoạ cho bảng băm cú tập khúa là tập số tự nhiờn, tập địa chỉ cú 11 địa chỉ (M=11- từ địa chỉ 0 đến 10), chọn hàm băm f1(key)=key % 10 và f2(key)=9-key %9.
Xem việc minh hoạ này nhưmột bài tập.
Càiđặt bảng băm dựng phương phỏp băm kộp
#define NULLKEY –1 #definẹM 101
/* --- M la so nut co tren bang bam, du de chua cac nut nhap vao bang bam, chon M la so nguyen to
--- */ //Khai bao phan tu cua bang bam
typedef struct {
int key; //khoa cua nut tren bang bam }NODE;
//khai bao bang bam co M nut struct node HASHTABLE[M]; int N;
//bien toan cuc chi so nut hien co tren bang bam
b. Cỏc tỏc vụ
Hàm băm
Giả sử chỳng ta chọn hai hàm băm dạng %:
f1(key0=key %M va f2(key) =M-2-key%(M-2). //Ham bam thu nhat
int HF(int key) {
return(key%M); }
//Ham bam thu hai
int HF2(int key) {
return(M-2 – key%(M-2)); }
Chỳng ta cú thể dựng hai hàm băm bất kỳ thay cho hai hàm băm dạng % trờn.
Phộp toỏn initialize
Khởi động bảng băm.
Gỏn tất cả cỏc phần tử trờn bảng cú trường key là NULL. Gỏn biến toàn cục N = 0.
void initialize() {
int i;
for (i = 0 ; i<M ; i++ )
HASHTABLE [i].key = NULLKEY;
N = 0; // so nut hien co khoi dong bang 0 }
Phộp toỏn empty
Kiểm tra bảng băm cú rỗng khụng.
int empty() . {
return (N == 0 ? TRUE : FALSE) ; }
Phộp toỏn full
int full() . {
return (N == M-1 ? TRUE : FALSE) ; }
Lưu ý bảng băm đầy khi N=M-1, chỳng ta nờn dành ớt nhất một
phần tử trống trờn bảng băm.
Phộp toỏn search
Tỡm kiếm phần tử cú khúa k trờn bảng băm, nếu khụng tỡm thấy hàm này trả về về trị M, nếu tỡm thấy hàm này trả về địa chỉ tỡm thấỵ
int search(int k) {
int i, j ; i = HF (k); j = HF2 (k);
While (HASHTABLE [i].key!=k &&HASHTABLE [i] .key ! = NULLKEY) //bam lai (theo phuong phap bam kep)
i = (i+j) % M ;
if (HASHTABLE [i]).key == k) // tim thay return (i) ;
else // khong tim thay
return (M) ; }
Phộp toỏn insert
Thờm phần tử cú khoỏ k vào bảng băm. int insert(int k)
{
int i, j;
if(search(k)<M) return M;//trựng khúa if (full () )
{
printf (“Bang bam bi day”) ; return (M) ;
}
if (search (k) < M) {
printf (“Da co khoa nay trong bang bam”) ; return (M) ;
}
i = HF (k) ; j = HF 2 (k) ;
while (HASHTABLE [i].key ! = NULLEY) // Bam lai (theo phuong phap bam kep) i = (i + j) % M; HASHTABLE [i].key = k ; N = N+1; return (i) ; } Nhận xột bảng băm dựng phương phỏp băm kộp - Nờn chọn số địa chỉ M là số nguyờn tố.
- Bảng băm đầy khi N = M-1, chỳng ta nờn dành ớt nhất một phần tử
trống trờn bảng băm.
- Bảng băm được cài đặt theo cấu trỳc này linh hoạt hơn bảng băm
sũ bậc hai, do dựng hai hàm băm khỏc nhau nờn việc rải phần tử
mang tớnh ngẫu nhiờn hơn, nếu bảng băm chưa đầy tốc độ truy
xuất cú bậc O(1). Trường hợp xấu nhất là bảng băm gần đầy, tốc độ truy xuất chậm do thực hiện nhiều lần so sỏnh.
/////////////////////////////////////////////////////////////////////////////