Bài giảng Cấu trúc dữ liệu: Bảng băm - TS. Lê Minh Trung & Th.S Lương Trần Ngọc Khiết

32 52 0
Bài giảng Cấu trúc dữ liệu: Bảng băm - TS. Lê Minh Trung & Th.S Lương Trần Ngọc Khiết

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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

Ngày đăng: 09/08/2021, 17:44