为双散列散列 table 大小选择的最佳质数?
Best prime numbers to choose for a double hashed hash table size?
为双哈希散列选择的最佳素数是什么table 大小?
旁白
- 散列 table 是单词分析项目的一部分,马尔可夫模型,训练机器人建模和生成文本,就好像其他人会写它一样(这需要很多单词、句子、抄本、书籍...语料库越大越好)
- 我不熟悉大多数关于素数的数学,但我会阅读你们提出的所有内容,然后尝试从那里开始
我的想法:
- 质数不应该太far/close ---->我不必经常增加大小,但散列table不会结束半空(较少冲突,寻找负载因子和散列table大小之间的理想比例)
- 对于大型语料库是最优的 - 我不确定我必须选择的素数应该有多大,以前从未这样做过...
- 我还想过实现一个函数(不是散列函数),它只是将散列的大小加倍 table,然后寻找最接近的素数 ------>
但是它有一个 O(n) 的 运行 时间,因为素数只能被自身整除 ____(我必须检查所有数字是否达到当前哈希大小的两倍 table size 有非零的余数,然后将 size 增加 one/go 到下一个奇数并再次测试整个循环)________ ------ > 你可以想象这会非常慢,所以更好的方法是拥有一组固定的最多一百万的素数(仅用于说明目的)左右,然后将它们用于任何大小的变化
谢谢,如有任何其他问题,我们将不胜感激
不确定我是否完全理解你的问题,但这里有一个 possible solution from the java world。我理解 为什么 如果你必须从头开始编写哈希函数,你通常需要质数,但不确定如果 "good" 哈希函数你是否需要研究它们像这样使用。
希望对您有所帮助!
从 twin prime 个数字中选择 high,i。 e.当p
和p - 2
是质数时,选择p
作为双倍哈希容量,因为hash_code % (size - 2)
是双倍哈希算法的一个很好的二次步函数,模素数有点多"robust" 比模合数(如果 size - 2
是合数)。
对于小尺寸(大约 1000 左右)选择 所有 个素数,除了双对 中的小素数外,因为双对是对于良好的大小可预测性,在自然数标度的开头太罕见了。
添加 5 和 11 的大小(尽管它们在孪生素数中较低)以更好地解决非常小的 table 大小。
排除乘法哈希函数中经常使用的数字,在Java中是31
,在String
哈希函数中使用,我不知道[=43] =].
以上所有内容都在这个 Java runnable 中仔细编码,有很多预先生成的 table 大小(试图保持相邻 table 大小之间的最大差异为 0.005):
P. S. 我个人认为双重散列从来都不是最佳的开放式寻址方式,因为模运算在现代 CPU 中的成本高得离谱。考虑使用 QHash.
为双哈希散列选择的最佳素数是什么table 大小?
旁白
- 散列 table 是单词分析项目的一部分,马尔可夫模型,训练机器人建模和生成文本,就好像其他人会写它一样(这需要很多单词、句子、抄本、书籍...语料库越大越好)
- 我不熟悉大多数关于素数的数学,但我会阅读你们提出的所有内容,然后尝试从那里开始
我的想法:
- 质数不应该太far/close ---->我不必经常增加大小,但散列table不会结束半空(较少冲突,寻找负载因子和散列table大小之间的理想比例)
- 对于大型语料库是最优的 - 我不确定我必须选择的素数应该有多大,以前从未这样做过...
- 我还想过实现一个函数(不是散列函数),它只是将散列的大小加倍 table,然后寻找最接近的素数 ------> 但是它有一个 O(n) 的 运行 时间,因为素数只能被自身整除 ____(我必须检查所有数字是否达到当前哈希大小的两倍 table size 有非零的余数,然后将 size 增加 one/go 到下一个奇数并再次测试整个循环)________ ------ > 你可以想象这会非常慢,所以更好的方法是拥有一组固定的最多一百万的素数(仅用于说明目的)左右,然后将它们用于任何大小的变化
谢谢,如有任何其他问题,我们将不胜感激
不确定我是否完全理解你的问题,但这里有一个 possible solution from the java world。我理解 为什么 如果你必须从头开始编写哈希函数,你通常需要质数,但不确定如果 "good" 哈希函数你是否需要研究它们像这样使用。
希望对您有所帮助!
从 twin prime 个数字中选择 high,i。 e.当p
和p - 2
是质数时,选择p
作为双倍哈希容量,因为hash_code % (size - 2)
是双倍哈希算法的一个很好的二次步函数,模素数有点多"robust" 比模合数(如果 size - 2
是合数)。
对于小尺寸(大约 1000 左右)选择 所有 个素数,除了双对 中的小素数外,因为双对是对于良好的大小可预测性,在自然数标度的开头太罕见了。
添加 5 和 11 的大小(尽管它们在孪生素数中较低)以更好地解决非常小的 table 大小。
排除乘法哈希函数中经常使用的数字,在Java中是31
,在String
哈希函数中使用,我不知道[=43] =].
以上所有内容都在这个 Java runnable 中仔细编码,有很多预先生成的 table 大小(试图保持相邻 table 大小之间的最大差异为 0.005):
P. S. 我个人认为双重散列从来都不是最佳的开放式寻址方式,因为模运算在现代 CPU 中的成本高得离谱。考虑使用 QHash.