Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 21 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
21
Dung lượng
89,43 KB
Nội dung
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 xung đột 14.4 Một số ví dụ sử dụng hàm băm 14.1 Bài tốn (1/9) Giả sử cần lưu trữ số ghi thực thao tác: Thêm: thêm ghi Xóa: xóa ghi Tìm kiếm: tìm kiếm ghi Hãy đưa cách tổ chức để thực hiệu cơng việc 14.1 Bài tốn (2/9) – Sử dụng mảng Sử dụng mảng không xếp Thêm: thêm vào cuối mảng->O(1) Xóa: 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 xếp Thêm: phải tìm vị trí thêm vào->O(n) Xóa: 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 nhị phân->O(log(n)) 14.1 Bài toán (3/9) – Sử dụng DSLK Thêm: thêm vào vị trí nhanh->O(1) Xóa: nhanh tổ chức nút, chậm tìm kiếm nút cần khóa->O(n) Tìm kiếm: tìm kiếm tuần tự->O(n) 14.1 Bài tốn (4/9) – dùng bảng Giả sử cần lưu trữ 1000 ghi 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 … … 9903030 Trần Văn A 9908080 Trần Văn B 10 … … 14.1 Bài toán (5/9) – dùng 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 … … Nguyễn Văn A 10 … … Nguyễn Văn B … … Nguyễn Văn C … … Nguyễn Thị A … … Nguyễn Thị B … … … 9999999 … … … 12345 … 33333 … 56789 … 9801010 … 9802020 14.1 Bài toán (6/9) – dùng bảng Một số nhận xét: Đánh giá thao tác Thêm: nhanh O(1) Xóa: nhanh O(1) Tìm kiếm: nhanh O(1) Nhưng q tốn nhớ->khơng hiệu 14.1 Bài tố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 … H(‘9908080’) = 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) … … … … … 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 … … … 999 … … 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) Nói chung khó thiết kế hàm băm lý tưởng 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 Hàm băm thường dùng bảng băm nhằm giảm chi phí tính tốn tìm khối liệu tập hợp 14.2 Hàm băm (2/6) u cầu hàm băm: Tính tốn nhanh Các khóa phân bố bảng Ít xảy đụng độ Xử lý loại khóa có kiểu khác 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 Phát sửa lỗi liệu Nhận dạng âm 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ố nguyên 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 Nhận xét: Hàm cắt bỏ thỏa mãn tính chất thứ hàm băm tính chất thứ hai khó thực (khó có phân bố đều) 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ố Nhận xét: Các cách lấy phần dư cho khả tránh tượng xung đột tốt 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 thỏa mãn tốt với trường hợp dùng hàm băm cắt bỏ 14.3 Xung đột giải 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’) = H(‘9908080’) = • Xử lý hai khóa khác lại ánh xạ đến địa chỉ? 14.3 Xung đột giải xung đột (2/4) Phương pháp dị tuyến tính: ý tưởng dị tìm vị trí trống 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 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 có giá trị hàm băm thành danh sách 14.3 Xung đột giải xung đột (3/4) Phương pháp dị tuyến tính: Insert: 89, 18, 49, 58, to table size=10, hash function is: %tablesize 49 49 49 58 58 89 18 18 18 18 89 89 89 89 14.3 Xung đột giải xung đột (4/4) Phương pháp dây chuyền: null null null : HASHMAX null ID: 9903030 Tên: Trần Văn A Điểm: 14.4 Một số ví dụ sử dụng hàm băm Xây dựng từ điển sử dụng hàm băm ... cần xóa dồn mảng->O(n) Tìm kiếm: tìm kiếm nhị phân->O(log(n)) 14. 1 Bài toán (3/9) – Sử dụng DSLK Thêm: thêm vào vị trí nhanh->O(1) Xóa: nhanh tổ chức nút, chậm tìm kiếm nút cần khóa->O(n) Tìm kiếm:... Thêm: thêm vào cuối mảng->O(1) Xóa: 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 xếp Thêm: phải tìm vị trí thêm vào->O(n) Xóa: nhiều thời gian... 9802020 14. 1 Bài toán (6/9) – dùng bảng Một số nhận xét: Đánh giá thao tác Thêm: nhanh O(1) Xóa: nhanh O(1) Tìm kiếm: nhanh O(1) Nhưng tốn nh? ?-> không hiệu 14. 1 Bài toán (7/9) – dùng hàm băm function