我一直在阅读很多关于Hash Tables以及如何在C中实现的内容,我认为我脑子里几乎有所有概念,所以我可以开始编写自己的代码,我只有几个问题,我还没有正确理解。
作为参考,我一直在读这个: http://eternallyconfuzzled.com/jsw_home.aspx
1)正如我在上面的网站上所读到的,建议哈希表大小为2或素数。这基本上是一个数组,一个数组有一个固定的大小,所以我可以快速查找我正在寻找的值。如果我有一个很大的输入,我不能声明一个小数组,因为它不适合我不能声明一个非常大的数组,如果我的输入数据不是那么大,因为它浪费了内存。
哈希表的最佳大小是多少?我应该以什么为依据?
2)此外,在该网站上,还有一些哈希函数,我还没有阅读它们。它还指出,最好使用一个众所周知的算法并推出自己的算法。我可能会这样做,我会从该站点中选择一个并在我的代码上测试它,看看它是否根据我的输入数据最小化了冲突。
让我烦恼的是我如何控制哈希范围?哈希不能返回并且整数大于哈希表大小,否则我们会遇到严重问题。我该如何处理?
答案 0 :(得分:3)
1)您所指的是哈希表的加载因子 - 预计要填充的桶的百分比。维基百科有这样的说法:
具有良好的散列函数,平均值 查询成本几乎不变 负载系数从0增加到0.7 或者。超越这一点, 碰撞概率和成本 处理它们的人数增加了。
我相信Java实现(可能还有其他)会定期调整大小以使负载因子保持在可接受的范围内。
2)只需使用模运算符(%)来保持存储桶索引合法。第二个运算符应该是桶阵列的大小。
答案 1 :(得分:1)
为哈希表选择一个小尺寸。当您向表中添加内容时,请检查表中正在使用的表的百分比;当它大于70%满时,使桌子变大。删除元素时也是如此 - 例如,当表格小于60%时,使表格变小。维基百科对动态调整大小的一些策略有很好的描述,但这是一般的想法。
我之所以这么说是因为您似乎已知输入数据:
如果您知道将要存储在哈希表中的数据量的粗略数量级,那么通常只需创建一个关于该大数据库的表就足够了。 (你不应该担心一切是否合适。相反,正确的思考是你会有多少碰撞以及你将如何处理它们。)
对于正确的哈希函数,输入结构可能会建议哪一个是正确的。例如,您输入的哪些方面可能是均匀分布的?