哈希图中的两个项目是否可以位于不同的位置,但具有相同的哈希代码



哈希映射中的两个项目是否可以位于不同的位置,但具有相同的哈希代码?

我是哈希的新手,最近我了解了哈希图。我想知道具有相同哈希代码的两个对象是否可能在哈希图中转到不同的位置?

我不完全确定,希望能提供任何帮助

@Dai在评论中指出,这将取决于您使用的哈希表类型。(事实证明,有很多不同的方法可以制作哈希表,没有一种数据结构是哈希表的工作方式!(

一个更常见的哈希表使用一种称为封闭寻址的策略。在封闭寻址中,每个项目都会根据其哈希码映射到一个插槽,并与该插槽中的所有其他项目一起存储。然后通过查找要查找的存储桶,然后检查该存储桶中的所有项目来进行查找。在这种情况下,任何两个具有相同哈希代码的项最终都将在同一个bucket中。(不过,他们不可能在同一个桶里占据同一个位置。(

另一种构建哈希表的策略使用一种称为开放寻址的方法。这是一系列不同的方法,它们都基于以下思想。我们要求表中的每个槽最多存储一个元素。和以前一样,为了进行插入,我们使用元素的哈希代码来确定将其放入哪个插槽。如果插槽是空的,那就太好了!我们把元素放在那里。如果那个空位满了,我们就不能把东西放在那里了。相反,使用一些可预测的策略,我们开始寻找其他插槽,直到找到空闲的插槽,然后将项目放在那里。(最简单的方法是线性探测,它的工作原理是在所需插槽之后尝试下一个插槽,然后是下一个,等等,如果需要的话,可以进行包装。(在这个系统中,由于我们不能将多个项存储在同一个位置,所以不,具有相同哈希代码的两个元素不必(事实上,不能!(占据同一个地方。

最近一种越来越流行的哈希策略是杜鹃哈希在杜鹃散列中,我们维护一些少量单独的散列表(通常是两个或三个(,其中每个槽只能容纳一个项目。要插入一个元素,我们尝试将它放在第一个表中由其哈希代码确定的位置。如果那个地方是免费的,那太好了!我们把项目放在那里。如果没有,我们就把那里的项目踢出去,试着把那个项目放在下一张桌子上。这个过程不断重复,直到最后一切都停止了,或者我们陷入了一个循环。与开放寻址一样,该系统防止多个项目存储在同一个插槽中,因此具有相同哈希代码的两个元素可能会去到不同的地方。(杜鹃散列有一些变体,每个表槽可以存储固定但数量较少的项目,在这种情况下,你可以在同一位置有两个具有相同散列码的项目。但这并不能保证。(

还有其他一些哈希方案我没有在这里描述FKS完美哈希通过使用两层哈希表,沿着封闭寻址的路线工作,但会定期重建整个表,以确保没有一个bucket过载可扩展哈希使用类似trie的结构,一旦溢出的桶变得太满,就会增加溢出的桶Hopscotch散列是线性探测和链式散列的混合,在并发性方面表现良好。但希望这能让你了解你使用的哈希表类型如何影响你问题的答案!

最新更新