C ++哈希:开放寻址和链接

时间:2012-06-01 00:08:58

标签: c++ hash chaining addressing

对于链接:

有人可以向我解释一下这个概念,并为我提供一个理论范例和一个简单的代码吗?

我明白了“每个表位置指向散列到此位置的项目的链接列表(链)”,但我似乎无法说明实际发生的情况。

假设我们有h(x)(散列函数)= x / 10 mod 5.现在要散列12540,51288,90100,41233,54991,45329,14236,它会是什么样子?

对于开放寻址(线性探测,二次探测和每个R位置的探测),有人可以向我解释一下吗?我尝试使用谷歌搜索,但我似乎进一步混淆。

3 个答案:

答案 0 :(得分:4)

链接可能是最明显的散列形式。哈希表实际上是最初为空的链表列表。通过在项目的计算表索引处向链接列表添加新节点来插入项目。如果发生冲突,则新节点链接到链表的前一尾节点。 (实际上,实现可能会对列表中的项进行排序,但让它保持简单)。这种模式的一个优点是哈希表永远不会变得“满”,缺点是你会大量跳过内存而你的CPU缓存会讨厌你。

Open Addressing试图利用散列表可能稀疏填充(条目之间的大间隙)这一事实。哈希表是一个项目数组。如果发生冲突,则算法不会将项添加到该位置的当前项的末尾,而是搜索哈希表中的下一个空白空间。但是,这意味着您不能单独依赖哈希码来查看项是否存在,如果哈希码匹配,您还必须比较内容。 '探测'是算法在尝试找到下一个空闲时隙时遵循的策略。 一个问题是该表可能变满,即没有更多的空插槽。在这种情况下,需要调整表的大小并更改散列函数以考虑新的大小。必须重新插入表中的所有现有项,因为一旦更改了散列函数,它们的哈希码将不再具有相同的值。这可能需要一段时间。

这是哈希表的Java animation

答案 1 :(得分:2)

因为你做mod 5,你的表将有5个位置

位置0:90100

因为90100/10 mod 5的结果为0

出于同样的原因,你有:

位置1:无

位置2:45329

位置3:51288-> 41233-> 14236

位置4:12540-> 54991

您可以查看有关wikipedia

的更多信息

答案 2 :(得分:1)

在开放寻址中,我们必须使用任何技术(加载因子小于等于1)将元素存储在表中。

但是在链接哈希表的情况下只存储Linklist的头指针,因此加载因子可以大于1。