如何获得哈希表中使用的最佳数量?

时间:2013-08-25 10:37:20

标签: java math data-structures hashtable

正如问题所述,如何计算最佳使用数量以及如何激励它?

如果我们要构建一个使用以下哈希函数的哈希表:

h(k)= k mod m,k = key

所以有些消息来源告诉我:

  1. 使用要插入的元素数量作为m
  2. 的值
  3. 使用接近素数到m
  4. java简单地使用31作为m
  5. 的值
  6. 有些人告诉我使用封闭素数到2 ^ n作为m
  7. 我在这一点上很困惑,我不知道m用什么价值。例如,如果我们将表大小用于m,那么如果我们想要扩展表大小会发生什么?那么我是否必须使用m的新值重新散列所有值。如果是这样的话,为什么Java只使用31作为m的主要值。

    我也听说表格大小应该比散列表中的总元素大两倍,每次重新散列时都是如此。但是,为什么我们应该使用m = 10作为10个元素的表格,当它应该是m = 20来创建额外的空白空间?

    有人可以帮我理解如何根据不同的场景来计算m的使用价值,例如我们想要静态(我们知道我们只会像10个元素一样)或动态(在某个特定的情况下重新散列)哈希表。

    让我们通过以下示例说明我的问题:

    我得到了值{1,2,...,n}

    问题:如果我必须在我的散列函数中使用除法,那么m的优化值是多少?

    Senario 1:n = 100?

    Senario 2:n = 5043?

    加法问题: 如果我们使用开放或封闭的哈希表,m值哈希函数会不同吗?

    请注意,我现在不需要理解java的哈希表,但一般我必须使用divsion mod哈希函数的哈希表。

    感谢您的时间!

1 个答案:

答案 0 :(得分:0)

这里有几个问题: 1)m应该相等? 2)你的哈希表中应该有多少可用空间? 3)你应该把桌子的大小设为素数吗?

1)正如评论中提到的,你描述的h(k)不是哈希函数,它为你提供了哈希表的索引。这个想法是每个对象产生一些哈希码,这是一个正整数。您可以使用哈希代码确定将对象放在哈希表中的位置(以便稍后再次找到它)。您显然不需要大小为MAX_INT的哈希表,因此您可以选择一些大小为m的表。然后对于任何对象,你获取它的哈希码,计算k%m,现在你在[0,m-1]区间有一个整数,它是哈希表的有效索引。

2)因为哈希表通过使用哈希码来查找对象应该去的表中的位置,所以如果将多个项目分配给同一位置,则会遇到麻烦。这称为碰撞。每个哈希表实现都必须处理冲突,方法是将项目放入附近的点或在每个位置保留项目的链接列表。无论解决方案如何,更多冲突意味着哈希表的性能降低。因此,建议您不要让哈希表填满,否则更有可能发生冲突。保持哈希表至少是项目数的两倍是减少冲突概率的常见建议。显然,这意味着你必须在填满时调整桌面大小。是的,这意味着您必须重新扫描每个项目,因为当您使用不同的值获取模数时,它将进入不同的位置。这是哈希表的隐藏成本:它以恒定时间运行(假设很少或没有冲突),但它可以有一个大系数(固定大小调整,重新散列等)。

3)通常还建议您将哈希表的大小设为素数。这是因为在某些常见用例中,它往往会在哈希表中生成更好的项目分布,从而避免冲突。我不会在这里给出完整的解释,而是会向您推荐这个优秀的答案:Why should hash functions use a prime number modulus?

相关问题