Trong một bảng băm, một chỉ mục mới được xử lý bằng các phím. Và, phần tử tương ứng với khóa đó được lưu trữ trong chỉ mục. Quá trình này được gọi là băm
Gọi k là khóa và h[x] là hàm băm
Ở đây, h[k] sẽ cho ta một chỉ mục mới để lưu phần tử được liên kết với k
Để tìm hiểu thêm, hãy truy cập Băm
Xung đột băm
Khi hàm băm tạo cùng một chỉ mục cho nhiều khóa, sẽ xảy ra xung đột [giá trị nào sẽ được lưu trong chỉ mục đó]. Đây được gọi là xung đột hàm băm
Chúng tôi có thể giải quyết xung đột băm bằng một trong các kỹ thuật sau
- Giải quyết va chạm bằng chuỗi
- mở địa chỉ. Thăm dò tuyến tính/bậc hai và băm kép
1. Giải quyết va chạm bằng chuỗi
Trong chuỗi, nếu một hàm băm tạo ra cùng một chỉ mục cho nhiều phần tử, thì các phần tử này được lưu trữ trong cùng một chỉ mục bằng cách sử dụng danh sách liên kết kép
Nếu
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m8 là vị trí dành cho nhiều phần tử, thì nó chứa một con trỏ tới phần đầu của danh sách phần tử. Nếu không có phần tử nào,
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m8 chứa
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m0
Mã giả cho hoạt động
chainedHashSearch[T, k]
return T[h[k]]
chainedHashInsert[T, x]
T[h[x.key]] = x //insert at the head
chainedHashDelete[T, x]
T[h[x.key]] = NIL
2. mở địa chỉ
Không giống như chuỗi, địa chỉ mở không lưu trữ nhiều phần tử vào cùng một vị trí. Ở đây, mỗi vị trí được lấp đầy bằng một phím duy nhất hoặc để lại
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m0
Các kỹ thuật khác nhau được sử dụng trong địa chỉ mở là
i. thăm dò tuyến tính
Trong thăm dò tuyến tính, xung đột được giải quyết bằng cách kiểm tra vị trí tiếp theo
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m0
ở đâu
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
1if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
2 là một hàm băm mới
Nếu va chạm xảy ra tại
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m3 thì đánh dấu vào
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m4. Theo cách này, giá trị của
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m5 được tăng tuyến tính
Vấn đề với thăm dò tuyến tính là một cụm các vị trí liền kề được lấp đầy. Khi chèn một phần tử mới, toàn bộ cụm phải được duyệt qua. Điều này làm tăng thêm thời gian cần thiết để thực hiện các thao tác trên bảng băm
ii. Thăm dò bậc hai
Nó hoạt động tương tự như thăm dò tuyến tính nhưng khoảng cách giữa các khe được tăng lên [lớn hơn một] bằng cách sử dụng mối quan hệ sau
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m6
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m7____18
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m9
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m5
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m9
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m32
ở đâu,
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
33if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
7 vàif m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
33if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
9 là các hằng số phụ dương,if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m
1
iii. băm đôi
Nếu xung đột xảy ra sau khi áp dụng hàm băm
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m38, thì hàm băm khác sẽ được tính để tìm vị trí tiếp theo
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m39
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m7____221
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m9
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m23
Hàm băm tốt
Một hàm băm tốt có thể không ngăn chặn hoàn toàn các va chạm tuy nhiên nó có thể làm giảm số lượng va chạm
Ở đây, chúng ta sẽ xem xét các phương pháp khác nhau để tìm một hàm băm tốt
1. Phương pháp phân chia
Nếu
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m24 là khóa và
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m25 là kích thước của bảng băm, thì hàm băm
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m26 được tính như sau
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m27
Ví dụ: Nếu kích thước của bảng băm là
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m28 và
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m29 thì
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m10 mod
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m11. Giá trị của
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m25 không được là lũy thừa của
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m9. Điều này là do lũy thừa của
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m9 ở định dạng nhị phân là
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m15. Khi chúng tôi tìm thấy
if m = 22, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 01 if m = 23, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 001 if m = 24, k = 17, then h[k] = 17 mod 22 = 10001 mod 100 = 0001 if m = 2p, then h[k] = p lower bits of m16, chúng tôi sẽ luôn nhận được p-bit bậc thấp hơn