Bảng băm với phương phỏp băm kộp (Double hashing Method)

Một phần của tài liệu giáo trình cấu trúc dữ liệu 2 (Trang 55 - 58)

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.

/////////////////////////////////////////////////////////////////////////////

Một phần của tài liệu giáo trình cấu trúc dữ liệu 2 (Trang 55 - 58)