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

Hash 哈希表开放寻址处理探测周期,hash,hashtable,Hash,Hashtable,我一直在研究通过开放寻址实现的哈希表的各种冲突解决技术。然而,到目前为止我所研究的所有冲突解决方法(线性探测、二次探测、双重散列)都有一个陷阱,即存在一个探测序列,该序列产生一个长度小于表大小的循环。当您尝试插入具有开放寻址方案的元素时,这会出现问题,因为有空闲的bucket可以插入条目,但如果它们不是循环的一部分,则可能无法访问它们 例如,如果我们使用线性函数H(k,i)=(H(k)+4*i)mod 12对大小为12的表进行线性探测,那么如果某个特定键散列到8,并且所有插槽0、4和8都已填充,

我一直在研究通过开放寻址实现的哈希表的各种冲突解决技术。然而,到目前为止我所研究的所有冲突解决方法(线性探测、二次探测、双重散列)都有一个陷阱,即存在一个探测序列,该序列产生一个长度小于表大小的循环。当您尝试插入具有开放寻址方案的元素时,这会出现问题,因为有空闲的bucket可以插入条目,但如果它们不是循环的一部分,则可能无法访问它们

例如,如果我们使用线性函数H(k,i)=(H(k)+4*i)mod 12对大小为12的表进行线性探测,那么如果某个特定键散列到8,并且所有插槽0、4和8都已填充,则会发生一个循环:

H(k,0)=8+0模12=8

H(k,1)=8+4模12=0

H(k,2)=8+8模12=4

H(k,3)=8+12模12=8

H(k,4)=8+16模12=0

H(k,5)=8+20模12=4

H(k,6)=8+24模12=8


如果探测序列不好,二次散列和双散列也可以找到类似的循环,所以我的问题是如何处理循环?还是我们总是选择不允许周期太短的散列函数/特殊表大小?

在离散数学(特别是模运算)中,不鼓励使用这些周期,因为它们不会产生所有可能的结果,特别是对于散列函数。在创建散列函数时,我相信选择了共素数,因为这将导致它没有循环,从而使结果集的大小最大化。我知道我不能很好地解释这一点,但YouTube上有很多很棒的视频可以解释!我同意你的观点,选择一个不会产生所有可能结果的散列函数并不理想。然而,我问这个问题的原因是想知道是否有可能处理循环检测。如果你搞砸了并选择了一个循环散列函数,这将是有益的;最好能有一种故障保护的方法来处理这种情况。在离散数学(特别是模运算)中,不鼓励使用这些循环,因为它们不会产生所有可能的结果,特别是对于散列函数。在创建散列函数时,我相信选择了共素数,因为这将导致它没有循环,从而使结果集的大小最大化。我知道我不能很好地解释这一点,但YouTube上有很多很棒的视频可以解释!我同意你的观点,选择一个不会产生所有可能结果的散列函数并不理想。然而,我问这个问题的原因是想知道是否有可能处理循环检测。如果你搞砸了并选择了一个循环散列函数,这将是有益的;如果能有一个安全的方法来处理这种情况,那就太好了。