【问题标题】:Deleting a node in a BK Tree删除 BK 树中的节点
【发布时间】:2017-07-03 00:11:53
【问题描述】:

我在 many different languages 中看到了许多不同的 BK 树实现,实际上它们似乎都没有包含从树中删除节点的方法。

即使the original article where BK Trees were first introduced 也没有提供关于节点删除的有意义的见解,因为作者只是建议标记要删除的节点以便将其忽略:

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

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

【问题讨论】:

    标签: algorithm tree time-complexity abstract-data-type bk-tree


    【解决方案1】:

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

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

    移除非根节点

    1. 在树中查找节点的父节点。
    2. 保存节点的子节点。
    3. 取消父节点对节点的引用。
    4. 重新添加每个子节点,就像它是一个新节点一样。

    在这里,即使步骤 1 可以在 O(1) 中完成,步骤 24 的成本也要高得多。插入单个节点是 O(h),其中 h 是树的高度。更糟糕的是,这必须对原始节点的每个子节点都进行,因此它是 O(k*h),其中 k 是子节点的数量。

    移除根节点

    1. 不使用之前的根节点从头开始重建树。

    重建一棵树在最好的情况下至少为 O(n),否则为 O(h*n)。

    替代解决方案

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多