Transcript Bai 6

GV: Âu Bửu Long
Kỹ thuật dò tìm giả ngẫu nhiên
 Dùng một hàm giả ngẫu nhiên để dò tìm vị trí mới trong
trường hợp có đụng độ xảy ra ở phương pháp địa chỉ mở.
 Phương pháp này có ưu điểm là không tạo khả năng ‘có
quy luật’ trong quá trình dò địa chỉ mới.
 Thường dùng với hàm tạo ngẫu nhiên của hệ thống có hỗ
trợ khởi tạo phần tử hạt giống ngẫu nhiên.
 Trong C/C++: hàm khởi tạo và hàm sinh ngẫu nhiên
void srand ( unsigned int seed );
int rand ( void );
Kỹ thuật dò tìm giả ngẫu nhiên
Implement trong C/C++:
 Hàm hash:
h(k,i)=(h(k)+Ps_Randi)%m
 Trong đó Ps_Randi là hàm
Pseudo Random được gọi
tại lần thứ i sau khi khởi
tạo, Ps_Rand0=0
int hFunc(int key, int m, int i){
return (key+i)%m;
}
void ThemHTable(int *Arr, int key){
int i=0;
srand(7);
int H=hFunc(key,11,0);
while(Arr[H]!=-32767){//Khác rỗng
i++;
H=HashFunc(key,11,rand());
}
Arr[H]=key;
}
Kỹ thuật dò tìm lai
(Coalesced hashing)
 Là kỹ thuật lai giữa danh sách nối
kết và địa chỉ mở
 Thường dùng với dữ liệu mà quá
trình băm tốn nhiều chi phí (như
chuỗi dữ liệu)
 Giống DSNK: dùng liên kết.
 Giống địa chỉ mở: Các phần tử
lưu ngay trên bảng băm, kích
thước bảng >= số phần tử (load
factor<=1).
Chọn hàm băm...
 Chọn hàm băm là phần quan trọng trong quá trình
băm.
 Hàm được chọn tốt sẽ cho ra các chỉ số được phân bố
đều trên bảng băm  í xung đột.
 Nếu hàm chọn không tốt dữ liệu sẽ co cụm trên một
vài phần nào đó của bảng  xung đột nhiều.
 Với mỗi phương pháp chọn hàm băm đều có các tiêu
chí để hàm cho ra phân bố đều.
Chọn hàm băm...
 Trong phương pháp chia: kích thước của bảng là nhân tố
quan trọng, ta tránh chọn những kích thước bảng sao cho
kết quả trả về là con của phần tử dữ liệu ban đầu.
 VD1: với hàm băm mod,
 chọn bảng có kích thước 100 khi đó khóa 12345 sẽ nằm tại vị trí 45
 3 chữ số đầu (123) không tham gia vào quá trình băm.
 chọn bảng có kích thước 8(=23), khi đó khóa 153(=1oo11oo1b) sẽ được
băm thành 1 (001b) là 3 bit thấp của khóa, vậy các bit cao còn lại sẽ
không tham gia vào quá trình băm.
 Nếu bắt buộc phải chọn bảng kích thước m là lũy thừa của 2
khi đó hàm băm thường dùng k = (x mod p) mod m

Với p nguyên tố lớn hơn nhiều so với m
Chọn hàm băm...
 Với chuỗi dữ liệu có độ dài khác nhau ta có thể dùng
hàm băm:
int hash_function (char *str)
{
int total = 0;
while (*str) {
total += *str++;
}
return (total % 256);
}
Bài tập
 Cho hàm băm h(k,i)=(k%7+randomi)%7
 Cho biết với cùng giá trị khởi tạo xác định trước, hàm
random trả về lần lượt các số: 9, 10, 3, 6, 7, 4, 2, 1, 9, 5,
6, 7, 3, 6
 Hãy minh họa quá trình thêm tuần tự các phần tử sau
vào bảng băm: 15, 3, 6, 11, 17, 25, 15
Bài tập

Cho lần lượt dữ liệu input(chuỗi 4 ký tự) như sau:
bing, read, fine, hash, test, mute, cord, news, down, rank
 Hãy đề xuất phương án sử dụng hash để lưu trữ các dữ
liệu này trên bảng có 11 phần tử. Minh họa cho đề xuất
của mình.
 Phương án bạn đã đề xuất có những ưu điểm và khuyết
điểm nào?