【发布时间】:2011-07-19 06:55:38
【问题描述】:
我有很多整数在 [0; 2^63-1]。然而,只有 10^8 个整数。 没有重复。完整列表在编译时是已知的,但它只是唯一的随机数。这些数字永远不会改变。
要显式地存储一个整数,需要 8 个字节,并且有关联的 1 个字节值,因此显式存储需要大约 860 MB。
所以我想找到最小的完美散列函数来将 10^8 个整数中的每一个从 [0;2^63-1] 映射到 [0;10^8-1]。我应该只找到这个函数一次,数据永远不会改变,函数可能很复杂。但它应该是最小的、完美的,并且计算应该很快。我怎样才能更好地做到这一点?如果发生某些子序列,也许可以找到并使用它们?
谢谢。
【问题讨论】:
-
编译时已知的完整列表?我的建议是自己“手动”分配数字,然后编写一个脚本以您所需的编程语言吐出地图的静态声明。如果它永远不会改变,那么使用静态数据结构来完美映射值将是您理想的解决方案。我用引号表示“手动”,因为您显然不会手动操作。有关哪些工具可以为您分配的想法,请参阅其他 cmets 和答案。
标签: perfect-hash