Tôi đang tìm cách triển khai bảng băm phân phối nhanh trong C #. Tôi gặp khó khăn khi chọn hàm ràng buộc băm của mình, lấy mã băm tùy ý và "ràng buộc" nó để nó có thể được sử dụng để lập chỉ mục các nhóm. Có hai lựa chọn mà tôi thấy cho đến nay:
Một mặt, bạn có thể đảm bảo các thùng của bạn luôn có số phần tử chính và để hạn chế hàm băm, bạn chỉ cần điều chỉnh nó theo số lượng thùng. Trên thực tế, đây là những gì Từ điển của .NET làm . Vấn đề với phương pháp này là việc sử dụng% cực kỳ chậm so với các hoạt động khác; nếu bạn nhìn vào các bảng hướng dẫn Sương mù Agner ,
idiv
(mã lắp ráp được tạo cho%) có độ trễ lệnh ~ 25 chu kỳ cho các bộ xử lý Intel mới hơn. Hãy so sánh này lên khoảng 3 chomul
, hoặc 1 cho ops Bitwise nhưand
,or
hoặcxor
.Mặt khác, bạn có thể có số lượng xô luôn là lũy thừa là 2. Bạn vẫn sẽ phải tính mô-đun của hàm băm để bạn không cố gắng lập chỉ mục bên ngoài mảng, nhưng lần này sẽ ít tốn kém hơn . Vì quyền hạn của 2
% N
chỉ là& (N - 1)
, nên ràng buộc được giảm xuống thành một hoạt động mặt nạ chỉ mất 1-2 chu kỳ. Điều này được thực hiện bởi thưa thớt của Google . Nhược điểm của điều này là chúng tôi đang dựa vào người dùng để cung cấp băm tốt; che giấu băm về cơ bản cắt bỏ một phần của hàm băm, vì vậy chúng tôi không còn đưa tất cả các bit của hàm băm vào tài khoản. Nếu hàm băm của người dùng được phân phối không đều, ví dụ chỉ có các bit cao hơn được điền vào hoặc các bit thấp hơn luôn giống nhau, thì phương pháp này có tỷ lệ va chạm cao hơn nhiều.
Tôi đang tìm kiếm một thuật toán mà tôi có thể sử dụng có cả hai thế giới tốt nhất: nó đưa tất cả các bit của hàm băm vào tài khoản, và cũng nhanh hơn so với sử dụng%. Nó không nhất thiết phải là một mô-đun, chỉ cần một cái gì đó được đảm bảo trong phạm vi 0..N-1
(trong đó N là chiều dài của các thùng) và có phân phối đồng đều cho tất cả các vị trí. Liệu một thuật toán như vậy tồn tại?
Cảm ơn đã giúp đỡ.
(2^N +/- 1)
, hãy xem stackoverflow.com/questions/763137/ từ