哈希映射中的平均跳数

时间:2012-02-10 23:29:35

标签: java algorithm hashmap formula

我编写了一个实现哈希映射来解决问题的算法。我想知道是否有人可以给我一些通用公式来计算寻找入口的平均跳数?只是我报告的一部分:) 我已经创建了自己的哈希码函数,我正在尝试测量它的质量。

“跳”是指:

对于冲突处理:如果两个或多个元素的hashCodes映射到哈希表中的相同索引,我在该索引处构建了一个“链表”。因此,如果有4个元素映射到散列表中的索引“i”,则索引“i”包含4个元素的链接列表。在这种意义上,“啤酒花”是通过该链接列表“行走”或“跳跃”。

基本上,地图的每个索引都有另一个数据结构。

5 个答案:

答案 0 :(得分:1)

性能取决于散列函数的质量以及数据的分布。选择一个大型代表性数据集并测量其性能。

答案 1 :(得分:1)

  

我正在计算自己的hashCode,我正在尝试测量它的质量。

您需要做的是忘记哈希表,并简单地分析int类型范围内哈希值的分布。理想情况下,您希望哈希值均匀分布。任何显着的峰值都代表着潜在的问题。

您需要考虑的另一件事是实际应用程序中使用的密钥的分发。例如,散列函数可以以不会产生太多色散的方式散列“相似”键。如果您的应用程序使用了大量类似的密钥,则最终会发生大量冲突。


如果您尝试计算/估计/衡量“跳数”,则会遇到诸如初始HashMap大小,键插入顺序,大小调整效果等因素的影响。

答案 2 :(得分:1)

获取样本输入集S并计算S中每个元素的哈希值,并将计算出的值插入集合H. | S | / | H |是你应该期望的平均碰撞。这取决于您自己的哈希函数,它的质量。

答案 3 :(得分:1)

完全明确,使用列表处理冲突的哈希表中列表中的“跳数”与表中的哈希冲突数相同,这将是hash(item) % size of table的次数评估所提供数据的相同值。对于使用表中备用槽的哈希表,冲突从表中删除的项目也会有所贡献。

例如,如果你的表大小以2的整数增加,但你的散列函数只有较高位的差异,那么即使你的外部散列在其输出中没有冲突,你也会在表中有很多冲突。一种技术(在Sun的实现中使用的IIRC)是使用素数作为表大小,另一种是使用位混合函数来处理提供的散列函数的输出,然后将最低的n位作为索引。

因此,对于给定负载的表大小选择,冲突的数量取决于数据中提供的散列函数的值的扩散(如果它们全部冲突,那么表实现无法执行任何操作) factor,以及提供的哈希的输出如何转换为表索引。

答案 4 :(得分:0)

请参阅Java HashMap的文档:

  

此实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。

换句话说,它取决于为您存储在其中的项目实现的哈希函数的质量。