4

我已经阅读了很多关于 Hash Tables 以及如何在 C 中实现 on 的内容,我想我几乎已经掌握了所有概念,因此我可以开始编写自己的代码,我只是有几个问题尚未解决正确理解。

作为参考,我一直在阅读: http ://eternallyconfuzzled.com/jsw_home.aspx

1)正如我在上面的网站上所读到的,建议哈希表大小使用 2 或素数的幂。这基本上是一个数组,并且数组具有固定大小,因此我可以快速查找我正在寻找的值。如果我有一个大输入,我不能声明一个小数组,因为它不适合,如果我的输入数据不是那么大,我不能声明一个非常大的数组,因为它浪费了内存。

哈希表的最佳大小是多少?我应该根据什么做出决定?

2)另外,在那个网站上,有几个我还没有读完的散列函数。它还指出,最好使用一个众所周知的算法并自己动手。我可能会这样做,我将从该站点中选择一个并在我的代码上对其进行测试,看看它是否根据我的输入数据最大限度地减少了冲突。

困扰我的是我如何控制哈希范围?哈希不能返回大于哈希表大小的整数,否则我们将遇到严重问题。我该如何处理?

4

2 回答 2

4

1)您指的是哈希表的负载因子- 预计将被填充的桶的百分比。维基百科有这样的说法:

使用良好的散列函数,随着负载因子从 0 增加到 0.7 左右,平均查找成本几乎是恒定的。超过这一点,碰撞的可能性和处理它们的成本就会增加。

我相信 Java 实现(可能还有其他实现)会定期调整大小以将负载因子保持在可接受的范围内。

2)只需使用模运算符(%)来保持桶索引合法。第二个运算符应该是您的存储桶数组的大小。

于 2010-02-20T23:45:48.730 回答
1

为您的哈希表选择一个小尺寸。当您向表格添加内容时,请检查表格的使用百分比;当大于 70% 满时,将表变大。这在您删除元素时也适用——例如,当表格不足 60% 时使表格更小。Wikipedia 对一些动态调整大小的策略有很好的描述,但这是一般的想法。

我之所以这么说,是因为您似乎知道输入数据:

如果您知道要存储在哈希表中的数据量的粗略数量级,那么创建一个这么大的表通常就足够了。(你不应该担心一切是否合适。相反,要考虑的正确事情是你会有多少碰撞以及你将如何处理它们。)

至于正确的哈希函数,您输入的结构可能会建议哪个是正确的。例如,您输入的哪些方面可能是均匀分布的?

于 2010-02-21T03:45:49.770 回答