Tôi có nhiều số nguyên trong phạm vi [0; 2^63-1]. Tuy nhiên, chỉ có 10^8 số nguyên. Có không có bản sao. Danh sách đầy đủ được biết ở thời gian biên dịch nhưng chỉ có một số ngẫu nhiên là . Những số này không bao giờ thay đổi.
Để lưu trữ một số nguyên rõ ràng, 8 byte bắt buộc và có giá trị 1 byte được liên kết, do đó lưu trữ rõ ràng yêu cầu khoảng 860 MB.
Vì vậy, tôi muốn tìm hàm băm hoàn hảo tối thiểu để ánh xạ mỗi 10^8 số nguyên từ [0; 2^63-1] đến [0; 10^8-1]. Tôi chỉ nên tìm hàm này một lần, dữ liệu không bao giờ thay đổi và chức năng có thể phức tạp. Nhưng nó phải là tối thiểu, hoàn hảo, và tính toán nên được nhanh chóng. Làm thế nào tôi có thể làm điều này tốt hơn? Có lẽ nó có thể tìm và sử dụng một số subsequences nếu chúng xảy ra?
Cảm ơn.Hàm băm hoàn hảo tối thiểu
Trả lời
Hãy để máy tính của bạn làm việc cho bạn:
http://www.gnu.org/software/gperf/
Trích:. "GNU gperf là một hoàn hảo tạo hàm băm Đối với một danh sách nhất định của chuỗi, nó tạo ra một hàm băm và bảng băm, dưới dạng mã C hoặc C++, để tra cứu giá trị tùy thuộc vào chuỗi đầu vào. Hàm băm là hoàn hảo, có nghĩa là bảng băm không có va chạm, và tra cứu bảng băm chỉ cần so sánh chuỗi đơn. "
nhưng đối với điều này, [CMPH] (http://cmph.sourceforge.net/) sẽ tốt hơn vì nó được hình thành để tạo ra hàm băm hoàn hảo tối thiểu cho các bộ khóa rất lớn. –
Cảm ơn, có lẽ tôi sẽ thử cả hai. –
Tôi đang làm việc trên an algorithm and Java implementation that needs less than 1.6 bits per key.
Trước đây, tôi đã triển khai a minimal perfect hash function tool in Java cần ít hơn 2.0 bit cho mỗi khóa.
Các thuật toán khác được triển khai trong CMPH. Ví dụ CHD cần khoảng 2.06 bit cho mỗi khóa theo mặc định. Nó có thể được cấu hình để sử dụng ít không gian hơn, nhưng thế hệ sau đó sẽ chậm hơn.
Tôi đang làm việc trên một thuật toán được cải thiện cần ít hơn 1,58 bit cho mỗi mục nhập. –
Bạn có viết gì cho mã của mình không. Tôi đã cố gắng để thực hiện nó cho các loại dữ liệu dài nhưng đã nhận được lỗi indexoutofbounds – sss999
@ sss999 hiện không có nhiều tài liệu; bạn có thể đọc các trường hợp thử nghiệm. Có thể tạo một [vấn đề] (https://github.com/thomasmueller/minperf/issues) với một trường hợp kiểm tra và ngoại lệ, vì vậy tôi có thể xem xét vấn đề có thể là gì –
Danh sách đầy đủ được biết đến lúc biên dịch? Lời khuyên của tôi sau đó sẽ là 'tự tay' gán các số cho chính bạn, và sau đó viết một kịch bản để nhổ ra một khai báo tĩnh của một bản đồ bằng ngôn ngữ lập trình mong muốn của bạn. Nếu nó không bao giờ, bao giờ thay đổi, bằng cách sử dụng một cấu trúc dữ liệu tĩnh để hoàn toàn bản đồ các giá trị sẽ là giải pháp lý tưởng của bạn. Tôi nói 'thủ công' bằng dấu phẩy ngược vì bạn rõ ràng sẽ không làm điều đó bằng tay. Xem các nhận xét và câu trả lời khác cho ý tưởng về những công cụ có thể thực hiện việc chỉ định cho bạn. – darvids0n