Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 10: Bảng băm - Hoàng Thị Điệp

Nhận xét (2/2)  Thăm dò bình phương  Ưu điểm: tránh được nhược điểm của thăm dò tuyến tính  Nhược điểm: không cho phép ta tìm đến tất cả các vị trí trong mảng  phép insert có thể không thực hiện được  nếu cỡ của mảng là số nguyên tố, thì thăm dò bình phương cho phép ta tìm đến một nửa số vị trí trong mảng  Băm kép  nếu cỡ của mảng và bước thăm dò h2(k) nguyên tố cùng nhau thì phương pháp băm kép cho phép tìm đến tất cả các vị trí trong mảng

pdf21 trang | Chia sẻ: thucuc2301 | Lượt xem: 836 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Cấu trúc dữ liệu và giải thuật - Bài 10: Bảng băm - Hoàng Thị Điệp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Giảng viên: Hoàng Thị Điệp Khoa Công nghệ Thông tin – Đại học Công Nghệ Bài 10: Bảng băm Cấu trúc dữ liệu và giải thuật HKI, 2013-2014 Kiểm tra viết, 15 phút diepht@vnu 2 (Sinh viên có thể sử dụng tài liệu.) 1. Nêu 2 hàm băm 2. Nêu 2 phương pháp giải quyết va chạm trong bảng băm nói tới trong Chương 9 Giáo trình. Nội dung chính  Giới thiệu phương pháp băm  Hashing  Các hàm băm  Hash function  Các chiến lược giải quyết va chạm  Collision resolution diepht@vnu 3 KDLTT từ điển  Trường hợp riêng của tập động khi ta chỉ quan tâm tới tìm kiếm, xen, loại  Là tập hợp trong đó mỗi phần tử là một cặp (khóa, dữ liệu)  Có thể tìm kiếm theo khóa  Được sắp hoặc không được sắp  Các phần tử có thể có cùng khóa*  Dictionary vs. Map  Ứng dụng  Từ vựng – nghĩa  Tên miền – địa chỉ IP  Mã sinh viên – hồ sơ SV  Các phép toán  find(k) trả về 1 phần tử có khóa k. Nếu không thấy trả về NULL.  findAll(k)  insert(k, v) thêm phần tử (k, v) và trả về con trỏ tới nó  erase(k) loại bỏ phần tử bất kì có khóa bằng k  erase(p) loại bỏ phần tử trỏ bởi p  size() trả về số lượng phần tử  empty() kiểm tra xem từ điển rỗng hay không diepht@vnu 4 Phương án cài KDLTT từ điển  Mảng được sắp / không được sắp  DSLK đơn/kép được sắp / không được sắp  Cây tìm kiếm nhị phân diepht@vnu 5 Cài KDLTT từ điển bằng mảng  Nếu khoá của dữ liệu là số nguyên không âm và nằm trong khoảng [0..SIZE-1]  có thể sử dụng một mảng data có cỡ SIZE  dữ liệu có khoá k sẽ được lưu trong data[k]  tìm kiếm, xen, loại đều thực hiện trong thời gian O(1)  Thực tế không khả thi vì  số phần tử dữ liệu có thể rất nhỏ so với SIZE  khoá có thể không phải là số nguyên  Ta muốn lợi dụng tính ưu việt của phép truy cập trực tiếp của mảng diepht@vnu 6 Phương pháp băm diepht@vnu 7  Lưu tập dữ liệu trong mảng T với cỡ là SIZE  Hàm băm: là hàm ứng với mỗi giá trị khoá k của dữ liệu với một chỉ số i (0 <= i <= SIZE-1)  Dữ liệu này sẽ được lưu trong T[i]  h : K  {0,1,,SIZE-1} 0 1 i SIZE-1 Tính địa chỉ Hàm băm h Tập các giá trị khoá Mảng T diepht@vnu 8 Sự va chạm  Nếu  có k1 ≠ k2 thì h(k1) ≠ h(k2), và  việc tính chỉ số h(k) ứng với mỗi khoá k chỉ đòi hỏi thời gian hằng thì các phép toán tìm kiếm, xen, loại chỉ cần thời gian O(1)  Va chạm  Trong thực tế k1 ≠ k2 có thể cho h(k1) = h(k2)  Giải quyết va chạm như thế nào? diepht@vnu 9 Hàm băm  Hàm băm tốt  tính nhanh và dễ dàng  đảm bảo ít va chạm  Một số hàm băm  Khóa là số nguyên không âm  Phương pháp chia  Phương pháp nhân  Khóa là xâu ký tự: đổi xâu thành số nguyên không âm diepht@vnu 10 Khóa là số nguyên không âm  Phương pháp chia  h(k) = k mod SIZE  nhạy cảm với cỡ của bảng băm  chọn SIZE để hạn chế xảy ra va chạm  số nguyên tố có dạng đặc biệt, chẳng hạn có dạng 4k+3  Phương pháp nhân  h(k) = (αk - αk) . SIZE  Ký hiệu x chỉ phần nguyên của số thực x  Thực tế thường chọn 61803399,01 ≈Φ= −α diepht@vnu 11 Khoá là xâu ký tự  Trước tiên, đổi các xâu ký tự thành các số nguyên, dùng bảng mã ASCII  Xâu ký tự có thể xem như một số trong hệ đếm cơ số 128  Sau đó chuyển sang hệ đếm cơ số 10  Ví dụ “NOTE”  ‘N’.1283 + ‘O’.1282 + ‘T’.128 + ‘E’ = = 78.1283 + 79.1282 + 84.128 + 69  Nhược điểm: xâu dài cho kết quả vượt quá khả năng biểu diễn của máy tính  Cải tiến: Xâu ký tự thường được tạo thành từ 26 chữ cái và 10 chữ số, và một vài ký tự khác. Thay 128 bởi 37  Tính số nguyên ứng với xâu ký tự theo luật Horner  Ví dụ “NOTE”  78.373 + 79.372 + 84.37 + 69= = ((78.37 + 79).37 +84).37 +69 diepht@vnu 12 Giải quyết va chạm  Dữ liệu d1 với khoá k1 đã được lưu trong T[i], h(k1)=i. Ta cần thêm dữ liệu d2 với khoá k2  nếu h(k2) = i thì dữ liệu d2 cần được đặt vào vị trí nào?  Các phương pháp  Phương pháp định địa chỉ mở (open addressing/probing)  mỗi khi xảy ra va chạm, tiến hành thăm dò để tìm một vị trí còn trống trong bảng và đặt dữ liệu mới vào đó  Phương pháp tạo dây chuyền (separate chaining)  tạo ra một CTDL lưu giữ tất cả các dữ liệu có cùng vị trí i và “gắn” CTDL này vào vị trí đó trong bảng diepht@vnu 13 Phương pháp định địa chỉ mở  Giả sử vị trí ứng với khoá k là i, i=h(k)  Từ vị trí này, lần lượt xem xét các vị trí i0, i1 , i2 ,, im ,  Trong đó i0 = i, im là vị trí thăm dò lần thứ m.  Dãy này được gọi là dãy thăm dò.  Xác định dãy thăm dò  Thăm dò tuyến tính (linear probing)  Dãy thăm dò là i , i+1, i+2 ,  Thăm dò bình phương (quadratic probing)  Dãy thăm dò là i , i + 12, i + 22, , i + m2,  Băm kép (double hashing)  Dãy thăm dò là h1(k) + m h2(k), với m = 0, 1, 2, diepht@vnu 14 Các phép toán  Tìm kiếm? Xen? Loại?  Minh họa  SIZE = 11  Thăm dò tuyến tính  insert(388) => T[3]  insert(130) => T[9]  insert(13) => T[2]  insert(14) => T[3] => T[4]  insert(926) => T[2] => T[3] => T[4] => T[5]  insert(47) => T[3] => T[4] => T[5] => T[6]  find(47)  remove(926)..  find(47)  remove(388), find(926) diepht@vnu 15 0 1 2 3 4 5 6 7 8 9 10 {không có data, data bị xóa, có data} Nhận xét (1/2)  Thăm dò tuyến tính  Ưu điểm: cho phép xét tất cả các vị trí trong mảng  phép insert luôn thực hiện được, trừ khi mảng đầy  Nhược điểm:  dữ liệu tập trung thành các đoạn  tìm kiếm tuần tự trong từng đoạn diepht@vnu 16 Nhận xét (2/2)  Thăm dò bình phương  Ưu điểm: tránh được nhược điểm của thăm dò tuyến tính  Nhược điểm: không cho phép ta tìm đến tất cả các vị trí trong mảng  phép insert có thể không thực hiện được  nếu cỡ của mảng là số nguyên tố, thì thăm dò bình phương cho phép ta tìm đến một nửa số vị trí trong mảng  Băm kép  nếu cỡ của mảng và bước thăm dò h2(k) nguyên tố cùng nhau thì phương pháp băm kép cho phép tìm đến tất cả các vị trí trong mảng diepht@vnu 17 Phương pháp tạo dây chuyền diepht@vnu 18  Ưu điểm  số dữ liệu được lưu không phụ thuộc vào cỡ của mảng  Các phép toán  Tìm kiếm?  Xen?  Loại? T Hàm băm h Hiệu quả của phương pháp băm  Tham số α  Băm đ/c mở: mức độ đầy (load factor)  α tăng thì khả năng va chạm tăng  Khi thiết kế, cần đánh giá max của N để lựa chọn SIZE  α không nên vượt quá 2/3  Băm dây chuyền: độ dài trung bình của một dây chuyền SIZE N =α Băm đ/c mở, Thăm dò tuyến tính Băm đ/c mở, Thăm dò bình phương Băm dây chuyền Thời gian trung bình Tìm kiếm thành công Tìm kiếm thất bại α α 11+( ) α α−− 1ln α−1 1       − + α1 11 2 1 ( )        − + 21 11 2 1 α diepht@vnu 19 diepht@vnu 20 Chuẩn bị tuần tới  Lý thuyết: Đọc chương 10 (Hàng ưu tiên)  Thực hành: Cài đặt bảng băm diepht@vnu 21

Các file đính kèm theo tài liệu này:

  • pdfhoang_thi_diepw09_hashing_6313_2032020.pdf