【问题标题】:Chosing a suitable table size for a Hash为哈希选择合适的表大小
【发布时间】:2010-09-22 02:41:44
【问题描述】:

如果我有一个 1000 的键集,我的哈希表的合适大小是多少,这是如何确定的?

【问题讨论】:

  • 大于 1000X2 的素数将是合适的。

标签: java hash hashtable


【解决方案1】:

我想重申上面https://stackoverflow.com/users/33229/wwwflickrcomphotosrene-germany 所说的话。 1000 对我来说似乎不是一个很大的哈希值。我一直在 java 中使用很多这种大小的哈希表,但没有看到太多的性能问题。而且我几乎从不关心尺寸或负载系数。

如果您对代码运行了分析器并确定哈希表是您的问题,那么请务必开始调整。否则,在你确定之前,我不会认为你有问题。

毕竟,在大多数代码中,性能问题并不是您认为的问题。我尽量不去预测。

【讨论】:

    【解决方案2】:

    让它成长。有了这个尺寸,自动处理就很好了。除此之外,2 x size + 1 是一个简单的公式。素数也不错,但是一旦您的数据集达到一定大小,散列实现可能会决定重新散列并扩大表。

    您的密钥正在提高效率,并且希望足够独特。

    底线:当您遇到尺寸或性能缓慢等问题时,请询问尺寸问题,除此之外:别担心!

    【讨论】:

    • 如果性能在这方面成为问题,请担心。如果您尝试预先处理它,则更有可能插入错误或只是拥有可能导致维护问题的不必要的复杂代码。
    • 我同意。先解决问题,然后再寻找解决方案。
    【解决方案3】:

    两次就好了。

    你没有一个大的键集。 不要为关于 HashTable 实现的艰难讨论而烦恼,去 2000 年吧。

    【讨论】:

    • 2000 不是一个好的尺寸,因为它不是素数。 2001 会很好,它不是黄金,但至少不是。将更好地分配表中的键。一个好的哈希表将处理一个好的哈希函数,但大多数时候,使用大小。
    • 这是一个有趣的问题。如果您使用以下类型的哈希键,您的陈述是正确的: H(s) = s[0] + b*s[1] + b^2s[2] + ... [N] 我认为今天的行业标准是使用 2^k 作为大小和更好的散列函数,例如 Jenkins 的。然而,上次我检查 std 是否与 prime 一起工作。
    【解决方案4】:

    这取决于负载因子(表格将增加其大小并重新分配其元素的“百分比满”点)。如果您知道您正好有 1000 个条目,并且这个数字永远不会改变,您可以将负载因子设置为 1.0 并将初始大小设置为 1000 以获得最大效率。如果您不确定确切的大小,您可以将负载因子保留为默认值 0.75,并将初始大小设置为 1334(预期大小/LF),以获得真正良好的性能,但需要付出一定的代价额外的内存。

    您可以使用以下构造函数来设置负载因子:

    Hashtable(int initialCapacity, float loadFactor) 
    

    【讨论】:

    • 假设散列函数在预期键集上表现良好。自制的散列函数在最小大小的表中可能表现不佳。对于自制函数,您必须进行实验。
    • 如果哈希函数表现不佳,碰撞元素将被存储在同一个桶中(在 LinkedList 中)。最小尺寸的表对性能没有任何影响。
    【解决方案5】:

    您还需要考虑哈希函数。

    一个经验法则建议将表格大小增加一倍,以便有扩展空间,并希望保持较小的冲突数量。

    另一个经验法则是假设您正在执行某种与模数相关的散列,然后将表大小四舍五入到下一个最大的素数,并使用该素数作为模值。

    你在散列什么样的东西?更多细节应该会产生更好的建议。

    【讨论】:

      【解决方案6】:

      Hashtable 的文档中对这些因素进行了一些讨论

      【讨论】:

      • 这更像是一个评论而不是一个答案。
      猜你喜欢
      • 2014-05-09
      • 2013-03-29
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多