Bài giảng Cấu trúc dữ liệu: Bảng băm cung cấp cho người học những kiến thức như: Hàm băm (hash function); Bảng băm; Đụng độ và xử lí đụng độ; Chuỗi liên kết; Dò tuyến tính/ bậc 2/ băm kép; Kết luận. Mời các bạn cùng tham khảo!
TS Lê Minh Trung – ThS Lương Trần Ngọc Khiết Khoa Công nghệ Thông tin, Đại học Sư phạm TP HCM Bảng băm (Hash Table) Hàm băm (hash function) Bảng băm Đụng độ xử lí đụng độ Chuỗi liên kết Dị tuyến tính/ bậc 2/ băm kép Kết luận Bài tốn tìm kiếm Tìm kiếm Duyệt qua phần tử mảng cách Độ phức tạp O(N) Tìm kiếm nhị phân Mảng thứ tự Độ phức tạp 𝑂(𝑙𝑜𝑔2 (𝑁)) Trong thực tế, kích cỡ mảng cần tìm N lên tới hàng tỷ Có phương pháp tìm kiếm có độ phức tạp O(1)??? Hàm băm (Hash function) Là hàm ℎ ánh xạ từ tập khóa (key) K vào 0, 𝑁 − ℎ: 𝐾 → {0,1,2, … , 𝑁 − 1} 𝑘 ∈ 𝐾, ℎ(𝑘) gọi giá trị băm 𝒌 Tập khóa K tập chuỗi, số tự nhiên… ℎ: 𝑍 + → [0, 𝑁 − 1] với ℎ 𝑘 = 𝑘 𝑚𝑜𝑑 𝑁 Hàm băm (tt) Với khóa chưa dạng số, hàm băm thường có dạng sau: ℎ 𝑘 = ℎ2 (ℎ1 (𝑘)) với 𝑘 ∈ 𝐊 khóa ℎ1 : 𝐾 → 𝑍 + để tính mã băm (hash code) ℎ2 : 𝑍 + → {0,1,2, … , 𝑁 − 1} hàm nén ℎ2 𝑥 = 𝑥 𝑚𝑜𝑑 𝑁 Ví dụ hàm băm Giả sử khóa chuỗi 𝑘 = 𝑠𝑛 𝑠𝑛−1 … 𝑠1 𝑠0 Có thể tính mã băm sau: 𝑖 ∗ 𝑠 (bảng mã ASCII có 128 kí hiệu) ℎ1 𝑘 = 𝑛 128 𝑖 𝑖=0 𝑖 ℎ1 𝑘 = 𝑛 𝑖=0 36 ∗ 𝑠𝑖 (26 chữ thường + 10 chữ số) Có thể sử dụng hàm nén sau: ℎ2 𝑥 = 𝑥 𝑚𝑜𝑑 100 Hàm băm ℎ 𝑘 = ℎ2 ℎ1 𝑘 = ℎ1 𝑘 𝑚𝑜𝑑 100 Hàm nén Nhân: h2 (y) = y mod N N kích cỡ bảng băm thường chọn số nguyên tố Liên quan tới lí thuyết số Nhân (Multiply), Cộng (Add) Chia (Divide) (MAD): h2 (y) = (ay + b) mod N a b số nguyên không âm cho: a mod N Bảng băm (Hash Table) Là bảng (mảng) có kích cỡ hash_size = N N thường chọn số nguyên tố Mẩu tin (record) có khóa k lưu trữ vị trí h(k) bảng h hàm hash, h thường chọn hàm modulo h(k) = k mod N Lí tưởng chọn N số khóa k thực sử dụng Bảng băm U (tất khóa) h(k1) k1 h(k4) k4 K (các khóa thật dùng) k2 k5 h(k2) = h(k5) k3 h(k3) N-1 Bảng băm Một đụng độ(collision) xảy hai khóa 𝒌𝟏 , 𝒌𝟐 ánh xạ vào vị trí bảng (ℎ 𝑘1 = ℎ(𝑘2 )) U (tất khóa) Đụng h(k độ1) k1 h(k4) k4 K (các khóa thật dùng) k2 k5 h(k2) = h(k5) k3 h(k3) N-1 Lợi ích phương pháp chuỗi liên kết Nếu số lượng mẫu tin lớn: tiết kiệm vùng nhớ Giải đụng độ: đơn giản đẩy vào danh sách liên kết Bảng băm nhỏ nhiều so với số lượng mẫu tin Xóa phần tử đơn giản nhanh chóng Độ phức tạp tìm kiếm: Nếu có n mẫu tin, bảng hash có kích thước N Độ dài trung bình DSLK n/N Địa mở (Open Addressing) Thêm phần tử vào có khóa k vào Nếu h(k) đầy tìm kế tiếp… tìm chưa đầy thêm phần tử có khóa k vào (probing – thăm dị) Các kĩ thuật dị tìm: linear/quadratic/double hashing… Tìm kiếm phần tử có khóa k Bắt đầu tìm từ h(k) chưa tìm thấy, tìm … cuối Phương pháp thăm dị Trả lời câu hỏi: ô thăm dị nào? Thăm dị tuyến tính (Linear Probing) Thăm dò bậc (Quadratic Probing) Thăm dị băm kép (double hashing) Thăm dị tuyến tính Vị_trí_mới = (vị_trí_cũ + bước_nhảy) mod N Ơ thứ i thăm dị có số h(k,i) = (h(k) + c*i) mod N c: bước nhảy Nếu bước nhảy c=1 h(k,i) = (h(k) + i) mod N Ví dụ dị tuyến tính Thêm vào khóa 51, 24, 37, 42, 88 Hàm băm h(k) = k mod 10 h(k,i) = (h(k) + i) mod 10 108 51 42 Thêm 61 Thêm 11 Thêm 87 Tìm 108 Thêm 108 Xung đột Tìm 47 Tìm thấy khóa cần tìm Gặp ô trống Số lần thăm dò = N-1 24 11 Not Found Việc tìm kiếm kết thúc 61 37 88 87 Thăm dị bậc Ơ thứ i thăm dị có số h(k,i) = (h(k) + c*i2 + d) mod N Thông thường (c,d) = (1,0) hay (1,1) Nếu c=1, d=0 thăm dị h= h(k), (h + 12) mod N , (h+ 22) mod N, (h + 32) mod N,… Nếu N số ngun tố Các thăm dò lặp lại sau (N+1)/2 bước Thăm dò bậc Ví dụ với N = 11: 0, 1, 4, 9, 16 ≡ 5, 25 ≡ 3, 36 ≡ Với N = 13: 0, 1, 4, 9, 16 ≡ 3, 25 ≡ 12, 36 ≡ 10, 49 ≡ 10 Với N= 17: 0, 1, 4, 9, 16, 25 ≡ 8, 36 ≡ 2, 49 ≡ 15, 64 ≡ 13, 81 ≡ 13 Ví dụ dị bậc Thêm vào khóa 51, 24, 37, 42, 88 Hàm băm h(k) = k mod 10 h(k,i) = (h(k) + i2) mod 10 51 42 Thêm 108 (i=5) Thêm 61 (i=2) Thêm 98 (i=1) Tìm 108 (i=5) Tìm 47 i=3 gặp trống Việc tìm kiếm kết thúc Tìm thấy khóa cần tìm Gặp trống Số lần thăm dị = (N+1)/2 Xung đột 108 24 61 Not Found 37 88 98 Thăm dị băm kép Ơ thứ i thăm dị có số: h(k,i) = (h1(k) + i*h2(k)) mod N h1 h2 hai hàm băm h1 điểm bắt đầu dò h2 qui tắc di chuyển Ví dụ băm kép h(k,i) = (h1(k) + i*h2(k)) mod N h1(k) = k mod 13 h2(k) = - k mod Thêm vào bảng băm khóa 18 41 22 44 59 32 31 73 44 41 73 4 18 32 59 31 22 10 11 12 10 11 12 Chọn hàm băm Chọn hàm băm phần quan trọng trình băm Hàm chọn tốt cho số phân bố bảng băm xung đột Nếu hàm chọn không tốt liệu co cụm vài phần bảng xung đột nhiều Với phương pháp, chọn hàm băm có tiêu chí để hàm cho phân bố Đánh giá phương pháp dùng bảng Hash load factor λ = số khóa/kích thước bảng hash=n/N Tìm kiếm với bảng băm chuỗi nối kết: 1+(1/2)λ phép thử tìm thấy λ phép thử khơng tìm thấy Tìm với bảng hash địa mở (dò ngẫu nhiên): (1/λ)ln (1/(1-λ)) phép thử tìm thấy 1/(1-λ) phép thử khơng tìm thấy Tìm với bảng hash địa mở (dị tuyến tính): (1/2)(1 + 1/(1-λ)) phép thử tìm thấy (1/2)(1 + 1/(1-λ)2) phép thử khơng tìm thấy So sánh phương pháp So sánh phương pháp (tt.) CÁM ƠN VÌ ĐÃ LẮNG NGHE! .. .Bảng băm (Hash Table) Hàm băm (hash function) Bảng băm Đụng độ xử lí đụng độ Chuỗi liên kết Dị tuyến tính/ bậc 2/ băm kép Kết luận Bài tốn tìm kiếm Tìm kiếm... = - k mod Thêm vào bảng băm khóa 18 41 22 44 59 32 31 73 44 41 73 4 18 32 59 31 22 10 11 12 10 11 12 Chọn hàm băm Chọn hàm băm phần quan trọng trình băm Hàm chọn tốt cho số phân bố bảng. .. thực sử dụng Bảng băm U (tất khóa) h(k1) k1 h(k4) k4 K (các khóa thật dùng) k2 k5 h(k2) = h(k5) k3 h(k3) N-1 Bảng băm Một đụng độ(collision) xảy hai khóa