Algorithm 删除BK树中的节点

Algorithm 删除BK树中的节点,algorithm,tree,time-complexity,abstract-data-type,bk-tree,Algorithm,Tree,Time Complexity,Abstract Data Type,Bk Tree,我在中看到了许多不同的BK树实现,实际上没有一个包含从树中删除节点的方法 甚至没有提供关于节点删除的有意义的见解,因为作者只是建议标记要删除的节点,以便忽略它: 删除结构1[BK树]和结构2中的密钥遵循与上述过程类似的过程,特别考虑要删除的密钥是代表性x°[根密钥]的情况。在这种情况下,不能简单地删除密钥,因为它对于结构信息至关重要。相反,必须为每个键使用一个额外的位,表示该键是否实际对应于记录。相应地修改搜索算法以忽略与记录不对应的键。这涉及到在更新过程中测试额外的位 虽然理论上可以正确删除B

我在中看到了许多不同的BK树实现,实际上没有一个包含从树中删除节点的方法

甚至没有提供关于节点删除的有意义的见解,因为作者只是建议标记要删除的节点,以便忽略它:

删除结构1[BK树]和结构2中的密钥遵循与上述过程类似的过程,特别考虑要删除的密钥是代表性x°[根密钥]的情况。在这种情况下,不能简单地删除密钥,因为它对于结构信息至关重要。相反,必须为每个键使用一个额外的位,表示该键是否实际对应于记录。相应地修改搜索算法以忽略与记录不对应的键。这涉及到在更新过程中测试额外的位

虽然理论上可以正确删除BK树中的节点,但在线性/次线性时间内是否可以这样做

虽然理论上可以正确删除BK树中的节点,但在线性/次线性时间内是否可以这样做

如果你想把它从BK树中移除,那么我想不出一种方法可以在线性时间内对所有情况进行移除。当节点被删除时,考虑<代码> 2 >代码>场景。请注意,我没有考虑与计算Levenshtein距离相关的时间复杂性,因为该操作不依赖于字数,尽管它也需要一些处理时间

删除非根节点
  • 在树中查找节点的父级
  • 保存节点的子节点
  • 取消父节点对节点的引用
  • 重新添加每个子节点,就像它是一个新节点一样
  • 这里,即使步骤
    1
    可以在O(1)中完成,步骤
    2
    4
    也要昂贵得多。插入单个节点是O(h),其中h是树的高度。更糟糕的是,必须对原始节点的每个子节点执行此操作,因此将是O(k*h),其中k是多个子节点

    删除根节点
  • 从头开始重建树,而不使用上一个根节点
  • 在最佳情况下,重建树至少为O(n),否则至少为O(h*n)

    替代解决方案 这就是为什么最好不要从物理上删除节点,而是将其保存在树中,并将其标记为已删除。这样,它将像以前一样用于插入新节点,但将从拼写错误的单词的建议结果中排除。这可以在O(1)中完成