繁体   English   中英

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

[英]C++ hashing: Open addressing and Chaining

对于链接:

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

我想到了“每个表的位置都指向散列到该位置的项目的链表(链)”,但是我似乎无法说明实际情况。

假设我们有h(x)(哈希函数)= x / 10 mod5。现在哈希12540、51288、90100、41233、54991、45329、14236,它看起来像什么?

对于开放式寻址(线性探测,二次探测以及对每个R位置的探测),有人还能向我解释吗? 我尝试了Googling,但似乎进一步感到困惑。

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

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

这是哈希表的Java动画

因为您执行的是mod 5,所以您的表格将有5个位置

位置0:90100

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

出于同样的原因,您有:

位置1:无

位置2:45329

位置3:51288-> 41233-> 14236

位置4:12540-> 54991

您可以在Wikipedia上查看更多信息

在开放式寻址中,我们必须使用任何一种技术(负载系数小于等于1)将元素存储在表中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM