【问题标题】:Best prime numbers to choose for a double hashed hash table size?为双散列表大小选择最佳素数?
【发布时间】:2015-12-31 07:38:23
【问题描述】:

为双哈希散列表大小选择哪些最佳素数?

侧面信息

  • 哈希表是单词分析项目、马尔可夫模型、训练机器人建模和生成文本的一部分,就好像其他人会写一样(这需要大量的单词、句子、成绩单、书籍...... 语料库,更好)
  • 我不熟悉围绕素数的大部分数学,但我会阅读你们提出的所有建议,然后尝试从那里开始

我的想法:

  • 素数不应该太远/彼此靠近---->我不必经常增加大小,但哈希表不会半空(减少冲突,寻找负载因子和哈希表大小之间的理想比率)
  • 最适合大型语料库 - 我不确定我必须选择的素数应该有多大,以前从未这样做过...
  • 我还想过实现一个函数(不是散列函数),它只是将散列表的大小加倍,然后查找最接近的素数 ------> 但是它的运行时间为 O(n),因为素数只能被自身整除____(我必须检查直到当前哈希表大小的两倍的所有数字是否具有除零以外的余数,然后将大小增加一/转到下一个奇数并再次测试整个循环)________ ------>您可以想象这会非常慢,所以更好的方法是拥有一组固定的素数数字高达一百万(仅用于说明目的)左右,然后将它们用于任何大小更改

谢谢,如有任何其他问题,欢迎

【问题讨论】:

  • 为什么必须动态地找到素数?为什么不预先计算一个 T[i+1] 大约为 2 * T[i] 的素数表 T 并在您的程序中对其进行硬编码?另外,您是否有某些原因要自己执行此操作,而不是简单地使用 python dict?
  • 我实际上是在要求这样的数字,该函数只是我探索原因的另一个选择 - 我正在学习所有这些,我想使用我自己的哈希表,探索

标签: python hash hashtable primes double-hashing


【解决方案1】:

不确定我是否完全理解您的问题,但这里是possible solution from the java world。我理解为什么一般来说你需要素数,如果你必须从头开始编写一个散列函数,但不确定如果使用像这样的“好”散列函数,你是否需要研究它们。

希望这会有所帮助!

【讨论】:

  • 双哈希哈希表要求你使用素数大小的哈希表,我需要一组数字来递增大小,例如 - 大小为 101,负载因子变为 2/3 和我不想增加大小->转到下一个最接近当前大小的两倍的素数,例如211谢谢^^宝贵的资源
【解决方案2】:

twin prime 数字中选择,即。 e.当pp - 2 是素数时,选择p 作为双散列容量,因为hash_code % (size - 2) 是双散列算法的一个很好的次阶函数,并且模素数比模合数更“稳健”(如果size - 2 是复合的)。

对于小尺寸(大约 1000 左右)选择所有素数,双胞胎中的低素数除外,因为双胞胎在自然数的开头太少了规模,以获得良好的尺寸可预测性。

添加 5 和 11 的大小(尽管它们的双素数较低)以更好地处理非常小的表大小。

排除乘法散列函数中经常使用的数字,Java中String散列函数中使用的是31,我不了解Python。

以上所有内容都在这个 Java 可运行文件中仔细编码,具有大量预先生成的表大小(试图保持相邻表大小之间的最大差异为 0.005):

https://github.com/OpenHFT/Koloboke/blob/0498951705b45be2e1528afd786c03308c36e5dc/lib/impl/src/main/java/net/openhft/koloboke/collect/impl/hash/DHashCapacities.java#L255-L272

P。 S. 我个人认为,双重哈希绝不是最佳的开放寻址方式,因为模运算在现代 CPU 中成本过高。考虑使用QHash

【讨论】:

    猜你喜欢
    • 2012-01-14
    • 2012-10-19
    • 2022-01-20
    • 2013-03-18
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2014-10-06
    相关资源
    最近更新 更多