tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ
Trang 1Chương 8
Băm và bảng băm
(Buổi 14, 15)
Trang 2Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
2
Nguyễn Trung Trực
Định nghĩa băm (hashing)
Hàm băm (hash function)
Giải quyết đụng độ (collision-resolution)
Phương pháp nối kết (bucket hashing,
separate chaining)
Phương pháp địa chỉ mở (open addressing)
Giới thiệu
Trang 3Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
3
Nguyễn Trung Trực
Phép biến đổi khóa (key transformation), còn
được gọi là băm (hashing), là một phương
pháp tham chiếu trực tiếp một phần tử trong một bảng dựa vào biến đổi số học trên khóa
(key) của phần tử này để có được địa chỉ của
nó trong bảng.
Định nghĩa băm
Trang 4Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
4
Nguyễn Trung Trực
Phép biến đổi khóa là một ánh xạ thích hợp H
từ tập các khóa K vào tập các địa chỉ A.
H: K → A
f Ánh xạ H được gọi là hàm băm (hash fuction).
f Hàm băm là một hàm nhiều – một (nhiều giá trị
khóa tương ứng với một địa chỉ).
Định nghĩa băm
Trang 5Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
5
Nguyễn Trung Trực
Định nghĩa băm
Tập khóa Bảng băm
Hình 8.1 Phép biến đổi khóa (băm)
Hàm băm
Đụng độ giữa key2
và key3
Trang 6Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
6
Nguyễn Trung Trực
Phép biến đổi khóa (băm) bao gồm hai bước:
f Bước 1: Tính toán hàm băm H để biến đổi khóa
cần tìm thành địa chỉ trong bảng băm.
f Bước 2: Quá trình giải quyết đụng độ
(collision-resolution process) cho các khóa khác nhau có
cùng địa chỉ trong bảng băm.
Định nghĩa băm
Trang 7Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
7
Nguyễn Trung Trực
Hàm băm (hash function) là hàm biến đổi một
khóa thành một địa chỉ trong bảng băm (hash table).
Hàm băm phải là hàm phân bố đều tập các
khóa vào tập các địa chỉ trong bảng băm.
f Gọi M là số phần tử của bảng băm (M là số nguyên
tố), hàm băm biến đổi các khóa (thường là số nguyên hoặc chuỗi ký tự) thành các số nguyên từ
0 đến M-1.
f Nếu khóa là số nguyên, hàm băm có thể là:
H(key) = key % M
Hàm băm
Trang 8Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
8
Nguyễn Trung Trực
f Nếu khóa là chuỗi ký tự, dùng phương pháp
Horner để tính giá trị của hàm băm Gọi n là số ký
tự của khóa, key[i] là ký tự thứ i của khóa key.
Hàm băm
h = key[0];
for (i = 1; i < n; i++)
h = ((h * 37) + key[i]) % M;
Trang 9Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
9
Nguyễn Trung Trực
Giải quyết đụng độ
Trường hợp đụng độ xảy ra khi các khóa khác
nhau cùng cùng giá trị hàm băm (cùng địa chỉ).
Các phương pháp giải quyết đụng độ:
f Phương pháp nối kết
f Phương pháp địa chỉ mở
Nếu hàm băm là hàm lấy số dư (modulo) thì số
phần tử (kích thước) M của bảng băm nên là một số nguyên tố.
Trang 10Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
10
Nguyễn Trung Trực
Phương pháp nối kết (Bucket Hashing)
Bảng băm là một mảng.
Mỗi phần tử của bảng băm chứa tham chiếu
đến một danh sách liên kết (hoặc cây tìm kiếm) chứa các khóa có cùng giá trị hàm băm.
Trang 11Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
11
Nguyễn Trung Trực
Phương pháp nối kết
Hình 8.2 Bảng băm theo phương pháp nối kết
Trang 12Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
12
Nguyễn Trung Trực
Phương pháp địa chỉ mở
Phương pháp địa chỉ mở (open addressing): tất
cả các khóa đều chứa trong một bảng băm.
Khi có đụng độ xảy ra, ta đến phần tử kế tiếp
cho đến khi tìm thấy khóa cần tìm hoặc phần tử
kế tiếp là phần tử trống (không chứa bất kỳ khóa nào).
Bảng băm phải có ít nhất một phần tử trống.
Bảng băm bị đầy khi chỉ còn một phần tử
trống.
Trang 13Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
13
Nguyễn Trung Trực
Phương pháp địa chỉ mở
1 2 3 4 5 12
0 1 2 3 4 5 6 7 8 9 10 Hình 8.3 Bảng băm theo phương pháp địa chỉ mở
Trang 14Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
14
Nguyễn Trung Trực
Phương pháp địa chỉ mở
Gọi k 0 , k 1 , …, k i là các vị trí tìm kiếm.
Phương pháp địa chỉ mở có hai loại:
f Phương pháp thử tuyến tính (linear probing):
k 0 = H(key)
k i = (k 0 + i) % M
f Phương pháp thử bậc hai (quadratic probing):
k 0 = H(key)
k i = (k 0 + i 2 ) % M
Trang 15Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
15
Nguyễn Trung Trực
Phương pháp thử tuyến tính
Tìm kiếm một khóa trong bảng băm
f Nếu phần tử hiện tại chứa khóa cần tìm: tìm thấy.
f Nếu phần tử hiện tại là phần tử trống: không tìm
thấy.
f Nếu phần tử hiện tại khác trống và không chứa
khóa cần tìm: đến phần tử kế tiếp.
Trang 16Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
16
Nguyễn Trung Trực
Phương pháp thử tuyến tính
Loại bỏ một phần tử
f Để tránh trường hợp khóa cần tìm có trong bảng
băm nhưng sẽ không tìm thấy khóa này, khi loại
bỏ một khóa ở vị trí k thì ta phải di chuyển phần tử khác trống kế tiếp i về vị trí này.
f Điều kiện để di chuyển một phần tử khác trống kế
tiếp i về vị trí trống k nếu r = H(HashTab[i]) nằm ngoài vùng vòng từ vị trí k đến vị trí i, tức là r
không thỏa mãn các trường hợp:
j < r ≤ k r ≤ k < j k < j < r
Trang 17Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015
Cấu trúc dữ liệu và Giải thuật Chương 8: Băm và bảng băm
17
Nguyễn Trung Trực
Phương pháp thử tuyến tính
j < r ≤ k
j r k
r ≤ k < j
r k j
k
j r
k < j < r
Hình 8.4 Ba trường hợp di chuyển các phần tử của bảng băm