[r]
(1)Bài 14: Hàm băm
Nội dung:
14.1 Bài toán.
14.2 Hàm băm.
14.3 Giải quyết xung đột.
(2)14.1 Bài toán (1/9)
Giả sử cần lưu trữ một số bản ghi thực hiện thao tác:
Thêm: thêm ghi
Xóa: xóa ghi
Tìm kiếm: tìm kiếm ghi
(3)14.1 Bài toán (2/9) – Sử dụng mảng
Sử dụng mảng không được sắp xếp Thêm: thêm vào cuối mảng->O(1)
Xóa: mất nhiều thời gian tìm vị trí cần xóa dồn mảng->O(n)
Tìm kiếm: tìm kiếm tuần tự->O(n)
Sử dụng mảng được sắp xếp
Thêm: phải tìm vị trí thêm vào->O(n)
Xóa: mất nhiều thời gian tìm vị trí cần xóa dồn mảng->O(n)
(4)14.1 Bài toán (3/9) – Sử dụng DSLK Thêm: thêm vào vị trí bất kỳ nhanh->O(1)
Xóa: nhanh tổ chức nút, nhưng chậm tìm kiếm nút cần khóa->O(n)
(5)14.1 Bài toán (4/9) – dùng như bảng
Giả sử cần lưu trữ 1000 bản ghi về sinh viên tìm kiếm chúng theo ID
ID Họ tên Điểm
0012345 Nguyễn Văn A 10 0033333 Nguyễn Văn B 0056789 Nguyễn Văn C
… … …
9801010 Nguyễn Thị A 9802020 Nguyễn Thị B
… … …
(6)14.1 Bài toán (5/9) – dùng như bảng
Dùng mảng lớn để lưu trữ (index 9999999) Chỉ số mảng với số id sinh viên, i.e ví dụ sinh viên với studid 0012345 lưu trữ A[12345]
Tên Điểm
… … …
12345 Nguyễn Văn A 10
… … …
33333 Nguyễn Văn B
… … …
56789 Nguyễn Văn C
… … …
9801010 Nguyễn Thị A
… … …
9802020 Nguyễn Thị B
… … …
(7)14.1 Bài toán (6/9) – dùng như bảng
Một số nhận xét:
Đánh giá thao tác Thêm: rất nhanh O(1)
Xóa: rất nhanh O(1)
Tìm kiếm: rất nhanh O(1)
(8)14.1 Bài toán (7/9) – dùng hàm băm
function Hash(key: KeyType): integer;
Giả sử có hàm băm lý tưởng Nó ánh xạ khóa (ID) 1000 ghi vào giá trị nguyên 999, hai khóa khác cho hai số nguyên khác
H(‘0012345’) = 134 H(‘0033333’) = 67 H(‘0056789’) = 764 …
(9)14.1 Bài toán (8/9) – dùng hàm băm
• Để lưu trữ ghi, tính Hash(ID) cho ghi lưu trữ vị trí Hash(ID) mảng
•Để tìm kiếm sinh viên, cần truy cập đến vị trí Hash(target ID)
0 … …
… … …
3 Trần Văn B 10
… … …
67 Nguyễn Văn B
… … …
134 Nguyễn Văn A 10
… … …
764 Nguyễn Văn C
… … …
(10)14.1 Bài toán (9/9) – dùng hàm băm Với hàm băm lý tưởng
Thêm: O(1)
Xóa: O(1)
Tìm kiếm: O(1)
(11)14.2 Hàm băm (1/6)
Khái niệm:
Hàm băm giải thuật nhằm sinh giá trị băm tương ứng với khối liệu
Giá trị băm đóng vai gần khóa để phân biệt khối
liệu
(12)14.2 Hàm băm (2/6)
Yêu cầu đối với hàm băm: Tính tốn nhanh
Các khóa phân bố bảng Ít xảy đụng độ
(13)14.2 Hàm băm (3/6)
Một số lĩnh vực sử dụng hàm băm: Mật mã học
Bảng băm
(14)14.2 Hàm băm (4/6) – Một số hàm băm Hàm cắt bỏ:
Cho khóa số nguyên, bỏ bớt phần khóa
Ví dụ: khóa số ngun có chữ số x=842615 Ta
quy ước bỏ bớt chẳng hạn chữ số hàng lẻ (1,3,5…), số lại 821 Vậy H(x) = H(842615) = 821
(15)14.2 Hàm băm (5/6) – Một số hàm băm Hàm phần dư:
Khóa có giá trị nguyên bảng băm B có m phần tử, ta lấy phần dư phép chia x/m làm giá trị hàm băm Để đảm bảo tính chất thứ hai hàm băm nên chọn m số nguyên tố
(16)14.2 Hàm băm (6/6) – Một số hàm băm Hàm gấp:
Cho khóa số nguyên, chia số nguyên thành số đoạn tùy chọn, sau kết hợp phần lại theo quy ước Ví dụ: Số hàng lẻ: 465 số hàng chẵn: 821,
H(x)=465+821=1286
Nhận xét: Tính chất thứ hàm băm thỏa mãn Do chữ số khóa có sử dụng, nên tính chất thứ hai
(17)14.3 Xung đột giải quyết xung đột (1/4) Trong hầu hết trường hợp không tránh xung đột
H(‘0012345’) = 134 H(‘0033333’) = 67 H(‘0056789’) = 764 …
H(‘9903030’) = 3
H(‘9908080’) = 3
• Xử lý hai khóa khác lại ánh xạ đến
(18)14.3 Xung đột giải quyết xung đột (2/4)
Phương pháp dị tuyến tính: ý tưởng dị tìm vị trí trống tiếp
theo rồi chèn phần tử bị đụng độ vào đó Khi mảng đầy resize lại mảng.
Phương pháp dây chuyền: Thay cố gắng tìm danh
sách một vị trí cịn trống kế tiếp, phương pháp dây chuyền liên kết danh sách có khóa khác nhưng có giá trị
(19)14.3 Xung đột giải quyết xung đột (3/4) 89 18 89 49 18 89 49 58 18 89 49 58 18 89
Insert: 89, 18, 49, 58, to table size=10, hash function is: %tablesize
(20)Phương pháp dây chuyền:
14.3 Xung đột giải quyết xung đột (4/4)
2 null null null null :
HASHMAX ID: 9903030
Tên: Trần Văn A
(21)14.4 Một số ví dụ sử dụng hàm băm