当前位置: 首页 > 知识库问答 >
问题:

线性探测如何在不中断查找的情况下处理删除?

胡景澄
2023-03-14

以下是我对线性探测的理解。

对于插入:-我们散列到某个位置。如果该位置已经有一个值,我们线性增加到下一个位置,直到我们遇到一个空位置,然后我们在那里插入。这是有意义的。

我的问题围绕着查找。从我读过的描述中,我相信查找是这样工作的:

  • 我们查看要查找散列的项的位置

那么,当我们从散列中删除一项时,这是如何工作的呢?这不会把查找搞砸吗?假设两个项目散列到同一位置。我们添加两个项目,然后删除我们添加的第一个项目。所以现在,第二个项目的预期位置(由于第一个项目最初占用了它,所以必须移动到另一个位置)是空的。删除会以某种方式处理这个问题吗?

共有2个答案

戈曾琪
2023-03-14

线性探测(开放寻址)中的删除是以这样一种方式进行的,即在删除值的索引处分配任何标记,如“删除”。[可以在该索引处键入除“无”之外的任何值,以指示该索引处的值已被删除]。请看下面的代码片段,以说明我如何使用“删除”标记来填充删除值的索引

        if self.table[index] == value:
          print("key {} is found in the table and hence deletion tag is updated at that position".format(value))
          self.table[index] = "Deletion"

现在,当再次完成搜索时会发生什么,这个位置不是无,搜索将继续。请参阅下面的片段,搜索是如何在线性探针中实现的

    def search(self, value):
      index = value % self.table_size

      if self.table[index] != value:
        while self.table[index] is not None and self.table[index] != value:
            index = (index + 1) % self.table_size
      if self.table[index] == value:
        print("Key is found in the table")
      else:
        print("key is not found in the table")

还可以查看github代码,它解释了线性探测中的删除,而不中断查找。

钱弘壮
2023-03-14

好问题!你完全正确,仅仅从线性探测表中删除一个项目,就会在你报告的情况下产生问题。

有几种解决方案。一种是使用墓碑删除。在删除墓碑中,要删除一个元素,可以用一个名为墓碑的标记替换该元素,该标记指示“一个元素以前在这里,但后来被删除了”然后,在进行查找时,使用与之前相同的过程:跳转到散列位置,然后继续前进,直到找到一个空白点。这里的想法是,墓碑不算作空白点,所以你会不断地扫描它,以找到你正在搜索的内容。

为了保持较低的墓碑数量,您可以使用一些很好的技术,例如在插入过程中覆盖墓碑,或者在墓碑数量过多时全局重建表。

另一个选择是使用Robin Hood哈希和后移删除。在Robin Hood哈希中,你存储表中元素的方式基本上是让它们按照哈希代码排序(表前面的环绕会让事情变得更复杂,但这是一般的想法)。从那里开始,在进行删除时,你可以向后移动元素一点,以填补被删除元素的空白,直到你找到一个空白或一个已经在正确位置且不需要移动的元素。

有关此的更多信息,请查看这些关于线性探测和罗宾汉哈希的讲座幻灯片。

希望这有帮助!

 类似资料:
  • //类B扩展类并添加一个附加变量 //这是主类 在不使用铸造的情况下如何设计解决上述问题?很抱歉问了这个低级的问题(我是java新手)。

  • 问题内容: 我有以下情况。我的工作是: 在给定的时间后可能会超时,如果发生则需要抛出异常 如果没有超时,将返回结果 如果此作业返回结果,则必须尽快将其返回,因为性能非常重要。因此,异步解决方案已经不在市场上了,通过锤子自然捆绑系统也是一种选择。 最后,系统必须符合EJB标准,因此不建议使用普通线程的AFAIK,因为这是严格禁止的。 我们当前的解决方案使用一个线程,该线程在存在一定时间后将被抛出异常

  • 在我的代码中进行一系列计算后,我有了一个,其值为 然后,我需要将这个乘以,我希望计算出的值为

  • 我正在建立一个应用程序,用户将把他们的测试和作业和任何东西。我想知道我的应用程序是否有可能在测试前一周和一天发出通知? 我看到的到处都是firebase通知和push通知。 我不想要这些在线通知,我将需要应用程序发送他们自己离线。这可能吗?

  • 问题内容: 我有一系列的Java小数,例如: 我希望将所有小数点后5位保留下来。这怎么可能? 问题答案: 如果您想让事情变得简单快捷。;) 版画

  • 假设我有一个旋转90度的正方形(我发现这是为我的计算机准备的)和一个旋转75度的第二个正方形。第一个正方形的左上角和第二个正方形的左下角相连。 我的目标是使用三角学来编辑第二个正方形的位置,以便它的右下角和第一个正方形的右上角(两个高亮的角)连接起来。 在一张不太硬的纸上。我会用sin和cos来求x和y的偏移量。在本例中,代码类似于: