C++ C++;散列:开放寻址和链接

C++ C++;散列:开放寻址和链接,c++,hash,chaining,addressing,C++,Hash,Chaining,Addressing,对于链接: 有人能给我解释一下这个概念,并给我提供一个理论示例和一个简单的代码示例吗 我的想法是“每个表位置指向散列到此位置的项目的链接列表(链)”,但我似乎无法说明实际发生了什么 假设我们有h(x)(散列函数)=x/10 mod 5。现在来散列1254051288901041233549914532914236,会是什么样子 对于开放寻址(线性探测、二次探测和每个R位置的探测),有人能给我解释一下吗?我试着在谷歌上搜索,但我似乎更困惑了。因为你使用mod 5,你的桌子将有5个位置 地点0:90

对于链接:

有人能给我解释一下这个概念,并给我提供一个理论示例和一个简单的代码示例吗

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

假设我们有h(x)(散列函数)=x/10 mod 5。现在来散列1254051288901041233549914532914236,会是什么样子


对于开放寻址(线性探测、二次探测和每个R位置的探测),有人能给我解释一下吗?我试着在谷歌上搜索,但我似乎更困惑了。

因为你使用mod 5,你的桌子将有5个位置

地点0:90100

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

出于同样的原因,您有:

地点1:无

地点2:45329

位置3:51288->41233->14236

位置4:12540->54991


您可以查看更多有关链接的信息,链接可能是最明显的哈希形式。哈希表实际上是一组最初为空的链表。通过在项目的计算表索引处向链表添加新节点来插入项目。如果发生碰撞,则新节点将链接到链接列表的前一个尾部节点。(实际上,一个实现可能会对列表中的项目进行排序,但让我们保持简单)。这种模式的一个优点是哈希表永远不会变为“满”,缺点是你经常在内存中跳转,你的CPU缓存会讨厌你

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


这是一个哈希表的示例。

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


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

“仅存储头指针”是相关的。不过,接近1的负载系数很少见。哈希表的目的是避免搜索速度慢,而线性列表搜索速度慢,再加上散列的随机(不均衡)分布。当负载系数超过0.5到0.7时,性能迅速下降。通常情况下(大多数标准库哈希表),当加载因子达到某个常量分数时,一个新表将被分配更大的常量因子,并复制所有项。这听起来效率很低,但在摊销的意义上,仍然会得到预期的O(1)。在负载因子增加的开放寻址中,我们重新刷新了表。使用较大的表大小,然后再次使用哈希函数重新插入键。