for*_*win 2 c++ hash addressing chaining
对于链接:
有人可以向我解释这个概念并为我提供一个理论示例和一个简单的代码吗?
我的想法是“每个表位置都指向散列到该位置的项目的链接列表(链)”,但我似乎无法说明实际发生的情况。
假设我们有 h(x)(哈希函数)= x/10 mod 5。现在哈希 12540, 51288, 90100, 41233, 54991, 45329, 14236,那会是什么样子?
对于开放寻址(线性探测、二次探测和每个 R 位置的探测),有人也可以向我解释一下吗?我尝试用谷歌搜索,但我似乎更加困惑了。
链接可能是最明显的散列形式。哈希表实际上是一个最初为空的链表数组。通过将新节点添加到项目的计算表索引处的链接列表来插入项目。如果发生冲突,则新节点将链接到链表的前一个尾节点。(实际上,实现可以对列表中的项目进行排序,但让我们保持简单)。这种模式的一个优点是哈希表永远不会“满”,缺点是你会在内存中频繁跳转,而你的 CPU 缓存会讨厌你。
开放寻址试图利用散列表可能稀疏(条目之间存在较大间隙)的事实。哈希表是一个项目数组。如果发生冲突,算法不会将该项添加到该位置当前项的末尾,而是在哈希表中搜索下一个空白空间。然而,这意味着您不能仅依靠哈希码来查看某个项目是否存在,如果哈希码匹配,您还必须比较内容。“探测”是算法在尝试找到下一个空闲槽时遵循的策略。一个问题是表可能会变满,即不再有空槽。在这种情况下,需要调整表的大小并更改哈希函数以考虑新的大小。表中的所有现有项目也必须重新插入,因为一旦哈希函数更改,它们的哈希码将不再具有相同的值。可能还要等一下。
这是哈希表的Java 动画。