Tại sao tốt nhất là sử dụng số nguyên tố làm mod trong hàm băm?


57

Nếu tôi có một danh sách các giá trị chính từ 1 đến 100 và tôi muốn sắp xếp chúng trong một mảng gồm 11 nhóm, tôi đã được dạy để tạo thành một hàm mod

H=kmod 11

Bây giờ tất cả các giá trị sẽ được đặt lần lượt trong 9 hàng. Ví dụ: trong nhóm đầu tiên sẽ có . Trong lần thứ hai, sẽ có v.v.1 , 12 , 23 ...0,11,221,12,23

Giả sử tôi quyết định trở thành một cậu bé hư và sử dụng chức năng băm không chính là hàm băm của mình - lấy 12. Sử dụng chức năng Băm

H=kmod 12

sẽ dẫn đến một bảng băm với các giá trị trong nhóm đầu tiên, v.v. trong lần thứ hai, v.v.1 , 13 , 25 ...0,12,241,13,25

Thực chất chúng là những thứ giống nhau. Tôi đã không giảm va chạm và tôi đã không lan truyền mọi thứ tốt hơn bằng cách sử dụng mã băm số nguyên tố và tôi không thể thấy nó có ích như thế nào.


Câu hỏi liên quan, tại sao chúng tôi sử dụng xor trong hàm băm stackoverflow.com/questions/5889238/
Đổi

Câu trả lời:


62

Hãy xem xét tập hợp các khóa và bảng băm trong đó số lượng xô là . Vì là hệ số , nên các khóa là bội số của sẽ được băm vào các nhóm là bội số của :m = 12 3 12 3 3K={0,1,...,100}m=1231233

  • Các khóa sẽ được băm vào nhóm .0{0,12,24,36,...}0
  • Các khóa sẽ được băm vào nhóm .3{3,15,27,39,...}3
  • Các khóa sẽ được băm vào nhóm .6{6,18,30,42,...}6
  • Các khóa sẽ được băm vào nhóm .9{9,21,33,45,...}9

Nếu được phân phối đồng đều (nghĩa là mọi khóa trong đều có khả năng xảy ra như nhau), thì sự lựa chọn của không quá quan trọng. Nhưng, điều gì xảy ra nếu không được phân phối đồng đều? Hãy tưởng tượng rằng các khóa có nhiều khả năng xảy ra là bội số của . Trong trường hợp này, tất cả các nhóm không phải là bội số của sẽ trống với xác suất cao (điều này thực sự tệ về hiệu suất của bảng băm).K m K 3 3KKmK33

Tình trạng này là phổ biến hơn mà nó có vẻ. Ví dụ, hãy tưởng tượng rằng bạn đang theo dõi các đối tượng dựa trên nơi chúng được lưu trữ trong bộ nhớ. Nếu kích thước từ của máy tính của bạn là bốn byte, thì bạn sẽ băm các khóa là bội số của . Không cần phải nói rằng việc chọn là bội số của sẽ là một lựa chọn tồi tệ: bạn sẽ có các thùng trống hoàn toàn và tất cả các phím của bạn va chạm vào các thùng còn lại .m 4 3 m / 4 m / 44m43m/4m/4

Nói chung:

Mỗi khóa trong chia sẻ một yếu tố chung với số lượng xô sẽ được băm vào một nhóm là bội số của yếu tố này.mKm

Vì vậy, để giảm thiểu va chạm, điều quan trọng là để giảm số lượng các yếu tố chung giữa và các yếu tố của . Làm thế nào điều này có thể đạt được? Bằng cách chọn là một số có rất ít yếu tố: số nguyên tố .K mmKm


Tôi chỉ thấy rằng truy vấn của tôi phù hợp với câu trả lời của bạn. Bạn có nghĩ rằng hàm băm trong truy vấn của tôi giữ tốt không?
trao đổi quá mức

@overexchange: Tôi đã trả lời câu hỏi của bạn. Đây câu trả lời cũng có thể quan tâm cho bạn.
Mario Cervera

Tại sao sự lựa chọn của m chỉ quan trọng nếu K bị lệch? Không phải sự thật là chúng ta sẽ có hiệu suất kém hơn với m xấu ngay cả khi K được phân phối đồng đều?
vorou

Nó phụ thuộc vào những gì bạn có nghĩa là "xấu ". Nếu bạn có nghĩa là "nhỏ so với số lượng phần tử trong bảng băm" (nghĩa là hệ số tải cao ), thì hiệu suất sẽ kém. Tuy nhiên, nếu bạn có nghĩa là "không phải là số nguyên tố", thì thực tế này không quá quan trọng nếu tất cả các khóa đều có khả năng như nhau bởi vì chúng sẽ được phân phối đều trong bảng băm. Câu hỏi tự nó cung cấp một ví dụ. m
Mario Cervera

16

Việc va chạm có ít khả năng sử dụng các số nguyên tố hay không phụ thuộc vào việc phân phối các khóa của bạn.

Nếu nhiều phím của bạn có dạng và hàm băm của bạn là H ( n ) = n mod m , sau đó các phím này đi đến một nhóm nhỏ của thùng khi và chỉ khi b chia n . Vì vậy, bạn nên giảm thiểu số b như vậy , có thể đạt được bằng cách chọn một số nguyên tố.a+kbH(n)=nmodmbnb

Mặt khác, nếu bạn muốn có đến 12 thùng và bạn biết rằng sự khác biệt là bội số của 11 có nhiều khả năng hơn sự khác biệt là bội số của 23 , bạn có thể chọn 12 cho ứng dụng rất đặc biệt của mình.1112112312


1
Nhưng nếu các khóa của tôi không có dạng thì m không thành vấn đề? Có đúng không? a+k×bm
CodyBugstein

1
@lmray, nếu phím của bạn được phân bố đều, không quan trọng. Nếu không, nó sẽ phụ thuộc vào phân phối chính xác cho m có quan trọng hay không. mm
AProgrammer

Chỉ cần hoàn nguyên chỉnh sửa cuối cùng, tôi quên rằng . 12>11
frafl

3
Ý của bạn là "đi đến một tập hợp nhỏ của các thùng iff chia cho m "? bm
Mikhail Dubov

8

Việc này có ảnh hưởng (cũng) hay không phụ thuộc vào cách bạn xử lý va chạm. Khi sử dụng một số biến thể của băm mở , sử dụng các số nguyên tố đảm bảo các vị trí trống được tìm thấy miễn là bảng đủ trống.

Hãy thử hiển thị như sau, ví dụ:

Giả sử chúng tôi muốn chèn một phần tử băm để giải quyết và giải quyết xung đột bằng cách thử các vị trí a + i 2 sau đó cho i = 1 , 2 , Nhẫn .aa+i2i=1,2,

Cho thấy quy trình này luôn mang lại một vị trí trống nếu bảng băm có kích thước , p một số nguyên tố lớn hơn 3 và ít nhất một nửa của tất cả các vị trí là miễn phí.pp3

Gợi ý: Sử dụng thực tế là lớp dư modulo là một trường nếu p là số nguyên tố và do đó i 2 = c có nhiều nhất 2 giải pháp.ppi2=c2


2

Nếu hàm băm của bạn có dạng trong đó m là số nguyên tố và a được chọn ngẫu nhiên, thì xác suất 2 khóa riêng biệt băm vào cùng một nhóm là 1h(k)=a×kmodmma . Vậy vớim=1009,Pr{h(x)=h(y),xy}=0,00099108027rất nhỏ.1mm=1009Pr{h(x)=h(y),xy}=0.00099108027

Chương trình này được gọi là: Universal Hashing.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.