Data structures 当实际哈希冲突超过sizeof(邻域)时,跳房子哈希表中会发生什么情况?

Data structures 当实际哈希冲突超过sizeof(邻域)时,跳房子哈希表中会发生什么情况?,data-structures,hash,hashtable,hash-collision,hopscotch-hashing,Data Structures,Hash,Hashtable,Hash Collision,Hopscotch Hashing,相关链接: 跳房子散列表看起来不错,但我在文献中没有找到这个问题的答案:如果我的邻域大小为N,并且(由于渎职或极坏的运气)我插入了N+1个元素,所有散列值都是相同的,会发生什么情况?在原文中写道,需要调整表的大小: 最后,请注意,如果h将超过常量的项目散列到 对于给定的bucket,需要调整表的大小。幸运的是,正如我们所展示的,对于一个普遍的 散列函数h,在给定h=32的情况下,发生此类调整大小的概率为 1/32!. 有两种情况需要调整跳房子散列的大小 对于给定的桶,您有H个碰撞 负载系数实在太

相关链接:

跳房子散列表看起来不错,但我在文献中没有找到这个问题的答案:如果我的邻域大小为N,并且(由于渎职或极坏的运气)我插入了N+1个元素,所有散列值都是相同的,会发生什么情况?

在原文中写道,需要调整表的大小:

最后,请注意,如果h将超过常量的项目散列到 对于给定的bucket,需要调整表的大小。幸运的是,正如我们所展示的,对于一个普遍的 散列函数h,在给定h=32的情况下,发生此类调整大小的概率为 1/32!.


有两种情况需要调整跳房子散列的大小

  • 对于给定的桶,您有H个碰撞
  • 负载系数实在太大,找不到自由铲斗。实际上,您应该为无搜索bucket设置一个Upmit
  • 给定通用哈希函数,您只有1/32!有机会进入案例#1,换句话说,如果您连续插入2^35个元素,则您有一次机会因碰撞而调整大小


    案例#2是在实践中更流行的调整大小的原因,您可以参考一些二次实现来了解它们如何决定调整大小[C#hashmap和Google sparse hashmap],由于其集群缺点,线性探测没有真正的实现,也就是说,不能保证持续查找。

    多奇怪啊-原始文件没有解决这个问题(我认为它假设您选择了不同的哈希函数?),而我看到的实现目前还不能正确支持这一点。我很想知道什么是正确的行为!是的,但即使是一个通用哈希函数也可能有超过| H |的冲突,并且再多的大小调整也不会改变这些冲突的邻域。这里的解决方案是:维护额外的基于列表的哈希表,并在“跃点信息”字中有特殊的“溢出”位。仅当主哈希表中没有空格时,才将值放入附加哈希表,并设置“溢出”位“溢出”将是一个非常复杂的情况,所以摊销时间应该是same@jemfinch关于调整大小,当调整哈希表的大小时,您会更改bucket的数量,这会产生新的hashfunction,所以很可能在同一个bucket中不会得到相同数量的键,对吗?