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;} }