Algorithm 是否存在哈希表不为';还没有装满一个插入罐';不会发生吗?

Algorithm 是否存在哈希表不为';还没有装满一个插入罐';不会发生吗?,algorithm,hash,logic,hashtable,Algorithm,Hash,Logic,Hashtable,我想问的是,对于一个遵循质数标准大小的哈希表,是否有可能出现(插入键的)场景,即使存在一些空槽,也不可能进一步插入给定元素?什么样的散列函数可以实现这一点 因此,大多数散列函数都允许冲突(“散列冲突”是一个短语,你应该通过谷歌来更好地理解它。)处理冲突的方法是使用二级数据结构,如列表,来存储在具有相同散列的键处插入的所有值 由于这些数据结构通常可以存储任意多个元素,因此始终可以将其插入哈希表,但性能会越来越差,接近后台数据结构的性能 如果没有备份数据结构,那么一旦两个内容添加到同一位置,就无法插

我想问的是,对于一个遵循质数标准大小的哈希表,是否有可能出现(插入键的)场景,即使存在一些空槽,也不可能进一步插入给定元素?什么样的散列函数可以实现这一点

因此,大多数散列函数都允许冲突(“散列冲突”是一个短语,你应该通过谷歌来更好地理解它。)处理冲突的方法是使用二级数据结构,如列表,来存储在具有相同散列的键处插入的所有值

由于这些数据结构通常可以存储任意多个元素,因此始终可以将其插入哈希表,但性能会越来越差,接近后台数据结构的性能


如果没有备份数据结构,那么一旦两个内容添加到同一位置,就无法插入。因为一个好的散列函数可以均匀有效地随机分布数据,所以这种情况很快就会发生(请参阅“生日问题”)。

对于某些但不是所有的散列表实现,插入场景是失败的

例如,实现使用一些逻辑来创建一系列bucket,在这些bucket中,它们将“探测”由于冲突而在散列到bucket中找不到的值。在现实世界中,有时序列创建非常基本,例如:

  • 程序员可能已经硬编码了N个素数,认为依次添加这些素数,仍然找不到空桶的几率很低(但知道哈希表设计的恶意用户可能能够计算出使该表失败的值,或者该表可能太满以至于概率不再好,或者——尽管更空——一个统计异常事件)

  • 程序员可能会做一些事情,比如选择一个他们喜欢的素数(比如13903),每次添加到最后一个探测的bucket中,直到找到一个空闲的bucket,但是如果表大小恰好也是13903,它会继续检查同一个bucket


尽管如此,还是有一些探索性的方法,比如保证尝试所有bucket(除非实现对重试设置了限制)但是,并且并不总是最佳选择。

如果使用而不是实现哈希表,则最好至少保留1个插槽为空,以简化算法

在开放寻址中,当我们试图找到一个元素时,我们首先计算散列索引i,然后检查索引{i,i+1,i+2,直到我们找到我们想要的元素或找到一个空槽。您可以看到,在这个算法中,如果没有槽是空的,但找不到元素,那么搜索将永远循环


但是,我要强调的是,强制执行只会简化搜索算法。因为另外,搜索算法可以记住起始索引I,并在扫描完整个表并返回索引I时停止搜索。

冲突可以通过其他策略处理。请参阅以获取不同的策略。谢谢,生日快乐这个问题是伟大的研究有关这!