Algorithm 正在哈希表中搜索非';没有吗?(线性探测)

Algorithm 正在哈希表中搜索非';没有吗?(线性探测),algorithm,hashtable,Algorithm,Hashtable,只是试图理解线性探测逻辑 使用开放寻址的as哈希表,如何确认表中没有元素 例如,假设您有一个10桶hashmap。 假设您散列一个键,然后插入它。现在,如果要插入元素A和B并将其散列并减少到同一个桶中,那么使用线性探针的元素A和B很可能会彼此相邻 现在,仅仅因为bucket是空的,并不意味着地图中不存在元素。e、 g.在元素A第一次被删除后搜索元素B。首先,你得到一个空桶,你希望B在那里,但你需要再探测一个,你就会找到B。它真的在那里。如果这个逻辑是正确的,那么您不需要搜索整个表来确认是否有键吗

只是试图理解线性探测逻辑

使用开放寻址的as哈希表,如何确认表中没有元素

例如,假设您有一个10桶hashmap。 假设您散列一个键,然后插入它。现在,如果要插入元素A和B并将其散列并减少到同一个桶中,那么使用线性探针的元素A和B很可能会彼此相邻

现在,仅仅因为bucket是空的,并不意味着地图中不存在元素。e、 g.在元素A第一次被删除后搜索元素B。首先,你得到一个空桶,你希望B在那里,但你需要再探测一个,你就会找到B。它真的在那里。如果这个逻辑是正确的,那么您不需要搜索整个表来确认是否有键吗?i、 每次都有e.O(n)的表现

我想说的是,你不需要浏览整个地图来确认它不在那里吗

使用hashmap的单独链接方法,这个问题就不存在了

例如:

如果约翰·史密斯被删除,我们会设法找到桑德拉·迪

或者使用线性寻址是为了移动元素,这样就不会有孔。i、 e.如果删除了John Smith,那么从152到154的元素是否应该移回一个位置?它在描述中并没有真正看到这一点,但这可能有点道理。除非ted baker将散列为154,而不是如上所述的153。需要比我想象的更多的工作


可能只是在每个bucket上使用一个简单的链表。

使用哈希表来解决与探测策略的冲突,这对数据结构的删除功能提出了严格的要求。删除项时,必须对哈希表进行补偿,使其仍然满足搜索所需的要求(这是哈希表的要点)

使用线性探测,如果删除项目,则移动到下一个插槽。如果它与我们刚刚删除的插槽的哈希匹配,请移动它。冲洗并重复,直到你到达一个空槽。也有延迟删除策略,其中项目被标记为删除,然后在下一次搜索中实际删除/补偿


假设三个项目{A0,A1,A2}具有相同的散列值。设{A0,A1}在哈希表中,{A2}不在哈希表中。如果我们删除A0,我们将其标记为删除。当我们搜索A2(不在哈希表中)时,我们找到A0(已删除),然后移动到A1,重新定位到A0的插槽中,完成删除。我们移动到下一个插槽(可能是A2,或者插槽A1的候选者刚刚占用),但发现它是空的,所以我们清除了A1刚刚腾出的插槽,哈希表恢复到原始状态

在绝对最坏的情况下,是的,确定某个项目是否在表中的算法是O(n)。然而,这在一个正确管理的哈希表中永远不会发生

移除物品时,应将墓碑放置在从中移除物品的桌子插槽处。墓碑仅仅是一些数据,表明那里曾经有一个元素,但它已被删除。这样,每次搜索元素时,都必须遵循所使用的探测序列,直到找到一个空插槽为止。如果插槽为空,则您已完成该哈希值的探测序列,并且知道它不会位于表中的任何其他位置


您必须搜索探测序列中每个插槽的唯一方法是探测序列中没有空插槽。因为您应该始终将哈希表的目标设置为大约一半空,所以不应该发生这种情况。

我认为这已经晚了,但是这里提到了哈希表的探测序列和最大探测序列

每次插入一个元素时,您都会记录您在过去已经执行的最大探测数,以及“maxProb”小于您在插入当前元素时执行的探测数

最后,当您在哈希表中搜索一个元素时,最多只执行maxProb搜索

现在考虑到不允许无限或N个探测,其中N是哈希表的容量,运行时间将是O(x),其中x是最坏情况下允许的最大探测


假设您的哈希键生成算法迫使您进行多次探测,那么您可以以这样的方式实现数据结构,即如果插入需要x个探测,它应该考虑重新定义自己。< /强>

我的意思是,如果你使用一个数组来实现一个桶,并且桶本身就像打开地址一样保持了键/值。通过使用术语bucket,我假设您使用的是支持冲突的哈希表。我看到您正在使用非冲突哈希表来探测冲突解决方案。谢谢,我相信您是对的。这个问题的两个答案都是正确的。“我喜欢墓碑式的方法。”伊萨卡比亚克谢谢你的解释。我在搜索这个,并提供了同样的赏金。如果你能回答我的问题,这个问题需要更详细一点,我会接受它,并将赏金奖励给你。请在这里找到问题的链接。谢谢,这是有道理的。事实上,我认为@Ethan的答案也是正确的。找到了一个关于哈希表的很棒的教程。如果要有效地测试某个值是否不在表中,可以查看Bloom筛选器: