Sau một nhận xét từ "onebyone", tôi đã triển khai và thử nghiệm một vài phiên bản của buckoo băm để xác định yêu cầu bộ nhớ thực.
Sau một số thử nghiệm, xác nhận quyền sở hữu mà bạn không phải xích cho đến khi bảng gần như đầy 50% có vẻ đúng, đặc biệt nếu lừa "stash" được thêm vào.
Vấn đề là khi bạn phóng to bảng. Cách tiếp cận thông thường là tăng gấp đôi kích thước của nó nhưng điều này dẫn đến bảng mới chỉ được sử dụng 25%!
Thực tế, giả định hashtable có 16 vị trí, khi tôi chèn số phần tử thứ 8, tôi sẽ hết các vị trí tốt và sẽ phải xâu chuỗi. Tôi sẽ tăng gấp đôi nó và bây giờ bảng là 32 khe với chỉ 8 trong số họ chiếm đó là một chất thải 75%!
Đây là mức giá phải trả để có thời gian truy xuất "không đổi" (về giới hạn trên cho số lượng truy cập/so sánh).
Tôi đã nghĩ ra một giản đồ khác: bắt đầu từ lũy thừa 2 lớn hơn 1, nếu bảng có n vị trí và n là lũy thừa của hai, thêm n/2 vị trí khác khi thêm n/3 vị trí:
+--+--+
| | | 2 slots
+--+--+
+--+--+--+
| | | | 3 slots
+--+--+--+
+--+--+--+--+
| | | | | 4 slots
+--+--+--+--+
+--+--+--+--+--+--+
| | | | | | | 6 slots
+--+--+--+--+--+--+
+--+--+--+--+--+--+--+--+
| | | | | | | | | 8 slots
+--+--+--+--+--+--+--+--+
, vv
Cùng với giả định rằng reashing sẽ chỉ xảy ra khi bảng là 50% đầy đủ, điều này dẫn đến một thực tế rằng bảng sẽ chỉ có 66% sản phẩm nào (1/3) chứ không phải hơn 75% sản phẩm nào (1/4) sau khi xích (tức là trường hợp xấu nhất).
Tôi cũng đã tìm ra (nhưng tôi vẫn cần phải kiểm tra toán học) mở rộng mỗi lần bằng sqrt (n), không gian lãng phí tiệm cận gần 50%.
Tất nhiên giá phải trả cho mức tiêu thụ bộ nhớ ít hơn là sự gia tăng số lượng dây xích cần thiết cuối cùng. Than ôi, không có gì đến miễn phí.
Tôi sẽ điều tra thêm nếu có ai quan tâm.
Có thể bạn sẽ bị giảm bớt cho yêu cầu "không GPL" ... :-))) –
Chúng ta có thực sự cần một thẻ buckoo-băm không? Thành thật mà nói ... –
Tôi hy vọng không - Tôi biết những người đam mê GPL có thể hung hăng, nhưng tôi hy vọng họ có thể thấy sự cần thiết cho các giấy phép khác và ít nhất là khoan dung. –