问题 最小的完美哈希函数


我在范围[0; 2 ^ 63-1]。但是,只有10 ^ 8个整数。有 没有重复。完整列表在编译时是已知的,但确实如此 只是唯一的随机数。这些数字 从不改变
存储一个整数 明确地,需要8个字节,并且有相关的1字节值,因此显式存储需要大约860 MB。
所以我想找到最小的完美哈希函数来映射从[0; 2 ^ 63-1]到[0; 10 ^ 8-1]的10 ^ 8个整数中的每一个。我应该只找到一次这个函数,数据永远不会改变,而且函数可能很复杂。但它应该是最小的,完美的,计算应该很快。我怎么能做得更好?如果它们发生,也许有可能找到并使用一些子序列?
谢谢。


10518
2017-07-19 06:55


起源

编译时已知完整列表?我的建议是自己“手动”分配数字,然后编写一个脚本,用你想要的编程语言吐出一个静态的地图声明。如果永远不会改变,使用静态数据结构来完美地映射值将是您理想的解决方案。我用引号说“手动”,因为你显然不会手工做。请参阅其他评论和解答,了解哪些工具可以为您分配。 - darvids0n


答案:


让您的计算机为您完成工作:

http://www.gnu.org/software/gperf/

引用:“GNU gperf是一个完美的哈希函数生成器。对于给定的字符串列表,它以C或C ++代码的形式生成哈希函数和哈希表,用于根据输入字符串查找值。哈希函数是完美的,这意味着哈希表没有冲突,哈希表查找只需要一个字符串比较。“


11
2017-07-19 06:58



但为此, CMPH 会更好,因为它被设想为非常大的键集创建最小的完美哈希函数。 - Dan D.
谢谢,我可能会尝试两种方式。 - tin_coder


我正在尝试 每个密钥需要少于1.6位的算法和Java实现

以前,我已经实施了 Java中最小的完美哈希函数工具 每个键需要少于2.0位。

其他算法实现于 CMPH。例如,CHD默认情况下每个键大约需要2.06位。它可以配置为使用更少的空间,但生成速度更慢。


3
2017-08-27 18:48



我正在研究一种改进的算法,每个条目需要少于1.58位。 - Thomas Mueller
你有没有写你的代码。我试图为Long数据类型实现它,但是得到indexoutofbounds错误 - sss999
@ sss999目前没有太多文件;你可以阅读测试用例。也许创造一个 问题 有一个测试用例和异常,所以我可以看看问题是什么 - Thomas Mueller
我正在查看LongCollection测试用例,因为我需要输入长值。一旦我有buff ref,你能告诉我你在哪里存储输入的哈希值,我怎么能读它们? - sss999
@ sss999不存储哈希值。我认为提出一个新问题是合理的,并提供您使用过的代码和您需要的代码。然后你可以为我添加评论,所以我看到了这个问题。 - Thomas Mueller