繁体   English   中英

单独链接与中的哈希函数。 开放式寻址

Hash Function in Separate Chaining Vs. Open Addressing

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在阅读Weiss的《数据结构》一书,并且对“单独链接”中的散列函数之间的差异感到困惑。 打开寻址中的哈希函数。

在单独的链接中,哈希函数定义为:

hash(x) = x mod tableSize

而在公开寻址中:

h_i(x) = (hash(x) + f(i)) mod tableSize

其中,i是试验和f(i)的数目是函数,如F(I)= I为线性探测中,f(I)= I ^ 2为二次探测,等

我有两个问题:

1)在单独链接中,具有哈希函数是否有意义:

hash(x) = x mod 10

当表大小等于11时?

2)在打开解决,我们总是要通过国防部tableSize键(+间隙)两次?

1 个回复

1)不是。 这将是正确的,但效率不高。 如果mod不到表的大小,都会有至少一个未使用的水桶,在您的桌面的顶部。 如果有特殊原因,选择值mod的(有可能是,如果你正在寻找某些属性),那么你可以只修剪表,该尺寸,避免浪费。

2)并不是真正必要的(( ((a mod c) + b) mod c是多余的),并且它不是唯一的唯一定义。 一般而言,您有h_i(x) = f(x, i) mod tableSizef一些明显选择包括

  • f(x, i) = x + i (线性探测)
  • 对于某些常数ab != 0 f(x, i) = x + a * i + b * i * i (二次探测)
  • f(x, i) = h1(x) + i * h2(x)用于某些合适的哈希函数h1h2 (双哈希)

最后一个特别容易溢出,这可能会弄乱某些属性,因此您可能希望对表大小进行模运算(尤其是如果这是一个质数,因为这样您就可以使用一个不错的字段了)。

同样,在需要f(x, i + 1)之前,您总是要使用f(x, i) mod tablesize ,因此您最好递增地计算f ,因为在每个步骤中,通过tablesize进行mod无论如何都要做。

但是,我们当然不仅限于这些形式的f ,甚至不限于我们在寻找开放位置的这种开放式编址方案。 布谷鸟哈希 (和变体)有两个候选位置可插入一个项目,如果两个位置都已满(请注意避免无限循环),它将踢出一个项目并将其移至其alt位置(可能还会移动一个项目) )。 这样,查找只需要查看两个位置,而不是整个表。 它有许多变体。

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

对于链接: 有人可以向我解释这个概念,并提供一个理论示例和一个简单的代码吗? 我想到了“每个表的位置都指向散列到该位置的项目的链表(链)”,但是我似乎无法说明实际情况。 假设我们有h(x)(哈希函数)= x / 10 mod5。现在哈希12540、51288、90100、412 ...

2 开放式寻址中的双重哈希,什么哈希函数和表长度

在Cormen的书“算法简介”中,我读到了双重哈希(在开放式寻址中)函数的形式为: 其中k是键, i是发生冲突时的下一个索引, m是表长度, hX是哈希函数。 他说双重哈希的主要问题是利用表中的所有索引。 为了解决这个问题,我们应该将m设置为2的幂,并且h2函数应该返回奇数值。 ...

3 哈希表中的链表与开放式寻址

我有一个包含130000个元素的数据集,并且我有两个不同的数据结构,即双链表和哈希表。 将数据集元素插入链表时,我使用尾指针将节点放置在链表的末尾。 将数据集元素插入哈希表时,我受益于带有探测功能的开放式寻址方法。 对于数据集中的最后10个元素,我面临110000次碰撞。 但是,两个 ...

4 开放式寻址与链式哈希

开放式寻址通常比链式哈希处理更快。 我正在通过低负载率(0.1)的成功研究来测试我的代码,但是对于链式散列而不是开放式寻址,我一直获得最佳的时间结果。 差别很小,有时打开地址的速度甚至更快,但是平均而言,使用链式精加工时,插入100次插入的时间会更好。 我将vector<stri ...

2015-09-03 18:57:35 0 135   c++/ hash
5 开放式寻址中的线性探测

我有一个大小为m = 11的数组,而我的哈希函数是除法: h(k) = k mod m我有一个整数k = 10而10 mod 11 is -1那么我应该将此键放在数组中的什么位置? 我应该把它放在索引为10的插槽中吗? 请帮我谢谢 编辑:例如,为了得到很好的答案,我有整数,例如k = ...

2010-06-23 04:08:46 1 896   hash
6 如何基于开放式寻址找到以下哈希表的答案?

哈希表有m个插槽,并使用带有线性探测的开放式寻址来解决冲突。该表最初为空。将密钥k1插入表中,然后是k2,然后是k3。 说明插入这些键时必须有4个探针的条件? 获得4个探针的概率是多少? ...

7 哈希表开放式寻址处理探测周期

我一直在研究通过开放寻址实现的哈希表的各种冲突解决技术。 但是,到目前为止,我研究过的所有冲突解决方法(线性探测,二次探测,双哈希)都有一个陷阱,那就是存在一个探测序列,该序列会产生一个长度小于表大小的循环。 当您尝试使用开放式寻址方案插入元素时,这将成为问题,因为有可用的存储桶来插入条目, ...

8 开放式寻址分析

我目前正在从“算法简介3”中学习哈希表。 尝试从统计角度理解开放式寻址时会感到很困惑。 假设m为哈希表长度,则线性探测和二次探测只能生成m个可能的探测序列。 但是,如在开放式寻址中定义的那样,可能的键值数量大于哈希值的数量,即负载因子n / m <1。实际上,如果预定义了哈希函数,则 ...

10 HashMap(开放式寻址)实现非常慢

出于某种原因,我使用开放式寻址的HashMap实现在处理大型数据集时运行非常缓慢,但我无法弄清楚原因。 谁能提供一些见识? 我只是一位数据结构专业的学生,​​试图弄清楚为什么我的数据结构如此低效。 我在较小的数据集上运行它,并且可以按预期的时间运行,但是一旦将其启动,它就会对我失败。 ...

暂无
暂无

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

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