Bảng băm với phương phỏp dũ bậc hai (Quadratic Probing Method)

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

3. CÁC PHƯƠNG PHÁP GIẢI QUYẾT ĐỤNG ĐỘ

3.4.Bảng băm với phương phỏp dũ bậc hai (Quadratic Probing Method)

(Quadratic Probing Method)

Mụ tả:

- Cấu trỳc dữ liệu: Bảng băm dựng phương phỏp dũ tuyến tớnh bị

hạn chế do rải cỏc phần tử khụng đều, bảng băm với phương phỏp dũ bậc hai rải cỏc phần tử đều hơn.

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 để chứa khúa cỏc phần tử.

-Khi khởi độngbảng băm thỡ tất cả trường key bị gỏn NULL.

Khi thờm phần tử cú khúa key vào bảng băm, hàm băm f(key) sẽ

xỏcđịnh địa chỉ i trong khoảng từ 0 đến M-1.

 Nếu chưa bị xung đột thỡ thờm phần tử mới vàođịa chỉ i nàỵ  Nếu bị xung đột thỡ hàm băm lại lần 1 f1 sẽ xỏc định địa chỉ

cỏch 12, nếu lại bị xung đột thỡ hàm băm lại lần 2 f2 sẽ xột địa chỉ cỏch i 22

,… , quỏ trỡnh cứ thế cho đến khi nào tỡm

được trống và thờm phần tử vàođịa chỉ nàỵ

-Khi tỡm kiếmmột phần tử cú khúa key trong bảng băm thỡ xột phần

tử tại địa chỉ i=f(key), nếu chưa tỡm thấy thỡ xột phần tử cỏch i 12

, 22… quỏ trỡnh cứ thế cho đến khi tỡm được khúa (trường hợp tỡm thấy) hoặc rơi vàođịa chỉ trống (trường hợp khụng tỡm thấy).

- Hàm băm lại của phương phỏp dũ bậc hai là truy xuất cỏc địa chỉ

cỏch bậc 2. Hàm băm lại hàm iđược biểu diễn bằng cụng thức sau:

fi(key)=( f(key) + i2) % M với f(key) là hàm băm chớnh của bảng băm.

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 do bậc hai 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.

Hỡnh 2.6.Bảng băm dựng phương phỏp dũ bậc hai

Càiđặt bảng băm dựng phương phỏp dũ bậc hai

ạ Khai bỏo cấu trỳc bảng băm

#define NULL –1 #define 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 nut cua bang bam

typedef struct {

int key; //Khoa cua nut tren bang bam

}NODE;

//Khai bao bang bam co M nut 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 hàm băm dạng%: f(key)=key %10. int HF(key %10); Chỳng ta cú thể dựng một hàm băm bất kỡ thay cho hàm băm dạng % trờn. Phộp toỏn initialize Khởi động hàm băm

Gỏn tất cả cỏc phần tử trờn bảng cú trường key là NULLKEY 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

0 10 0 10 0 10 0 10 0 10

1 NULL 1 20 1 20 1 20 1 20

2 NULL 2 NULL 2 NULL 2 NULL 2 36

3 NULL 3 NULL 3 NULL 3 NULL 3 NULL

4 NULL 4 NULL 4 30 4 30 4 30

5 15 5 15 5 15 5 15 5 15

6 16 6 16 6 16 6 16 6 16

7 NULL 7 NULL 7 NULL 7 26 7 26

8 NULL 8 NULL 8 NULL 8 NULL 8 NULL

int empty() {

return(N ==0 ?TRUE :FALSE); }

Phộp toỏn full

Kiểm tra bảng băm đóđầy chưa . int full()

{

return(N = = M-1 ?TRUE :FALSE); }

Lưu ý bảng băm đầy khi N=M-1 chỳng ta nờn chừa ớt nhất một phần

tử trong trờn bảng băm!

Phộp toỏn search

Tỡ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ề 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, d; i = hashfuns(k); d = 1; while(HASHTABLE[i].key!=k&&HASHTABLE[i].key!=NULLKEY) {

//Bam lai (theo phuong phap bac hai) i = (i+d) % M; d = d+2; } if(HASHTABLE[i].key ==k) return i; retiurn 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, d;

i = hashfuns(k); d = 1;

if(search(K)<M) return M;//Trựng khoỏ if(full( ))

{

printf(“\n Bang bam bi day khong them nut co khoa %d duoc”,k); return; } i=HF(k); while(HASHTABLE[i].key !=NULLKEY) {

//Bam lai (theo phuong phap bac hai) i = (i+d) % M;

d = d+2;} }

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