【问题标题】:How do I balance a BK-Tree and is it necessary?如何平衡 BK-Tree,是否有必要?
【发布时间】:2012-12-15 13:35:29
【问题描述】:

我正在研究使用Edit Distance 算法在名称数据库中实现模糊搜索。

我发现了一种数据结构,据说可以通过分而治之的方法帮助加快这一进程 - Burkhard-Keller Trees。问题是我找不到关于这种特定类型树的太多信息。

如果我用任意节点填充我的 BK-tree,我遇到平衡问题的可能性有多大?

如果我有可能或可能对 BK-Trees 有平衡问题,有什么方法可以在构建这种树后平衡它?

正确平衡 BK-tree 的算法是什么样的?

我目前的想法:

似乎子节点在距离上是不同的,所以我不能简单地旋转树中的给定节点而不重新校准它下面的整个树。但是,如果我能找到一个最佳的新根节点,这可能正是我应该做的。不过,我不确定如何找到最佳的新根节点。

我还将尝试一些方法,看看是否可以从一棵空树开始,并插入预先分配的数据,从而获得一棵相当平衡的树。

  • 从按字母顺序排列的列表开始,然后从中间开始排队。 (我不确定这是一个好主意,因为按字母顺序排列与按编辑距离排序不同)。
  • 完全洗牌的数据。 (这在很大程度上依赖于运气来偶然选择一个“不那么糟糕”的根。它可能会严重失败,并且可能在概率上保证是次优的)。
  • 从列表中的任意单词开始,然后按照与该项目的编辑距离对其余项目进行排序。然后从中间排队。 (我觉得这会很昂贵,而且效果仍然很差,因为它不会计算所有单词之间的度量空间连接 - 只是每个单词和一个参考单词)。
  • 使用任何方法构建一个初始树,将其展平(基本上类似于前序遍历),然后从中间排队等待新树。 (这也会很昂贵,而且我认为它可能仍然表现不佳,因为它不会提前计算所有单词之间的度量空间连接性,并且只会得到不同且仍然不均匀的分布)。
  • 按名称频率排序,首先插入最流行的,摒弃平衡树的概念。 (这可能是最有意义的,因为我的数据不是均匀分布的,而且我不会有纯随机词进来)。

仅供参考,我目前并不担心名称同义词问题(Bill vs William)。我会分开处理,我认为完全不同的策略会适用。

【问题讨论】:

  • 您找到问题的答案了吗?
  • 我认为按名称频率排序(首先插入最受欢迎的)会是最快的。然而,在我的尝试中,我测量到反向频率(最后插入最受欢迎的)优于我所有的尝试。我不明白为什么,我的预期正好相反。

标签: algorithm data-structures levenshtein-distance edit-distance bk-tree


【解决方案1】:

文章中有一个 lisp 示例:http://cliki.net/bk-tree。关于不平衡树我认为数据结构和方法似乎足够复杂,而且作者没有说任何关于不平衡树的内容。当您遇到不平衡的树时,也许它不适合您?

【讨论】:

  • 感谢您的链接,但我对构建 BK-tree 的基本算法没有任何问题。 lisp 示例是如何使用他们的库,并没有说明树平衡。 “当你遇到不平衡的树时,也许它不适合你?” - 你能扩展一下吗?我还有哪些其他选择?例如,我可以使用一些特定的 Vantage Point Tree 衍生产品吗?
  • 我不确定 BK-tree 是否有用。例如,特里或卡丁车轮胎也可以解决您的问题。当然,在 2d euklidian 空间中,您可以使用快捷方式。阅读三角形不等式。
  • 尝试(基数树)有助于自动完成(这不是我想要实现的),但对于拼写错误几乎没有那么多。我想可以修改它们以帮助加快 Levinshtein 计算,但它们不会给我一个基于编辑距离/度量空间的模糊匹配集。 “当然,在 2d euklidian 空间中,你可以有捷径”——这就是 BK-trees 的用途……它们只是一个度量空间树。
  • 可以,但您可以实现通配符搜索:phpir.com/tries-and-wildcards
猜你喜欢
  • 2015-11-20
  • 2013-06-05
  • 1970-01-01
  • 2019-11-01
  • 2010-10-19
  • 2013-02-02
  • 2020-12-31
  • 2015-04-16
  • 1970-01-01
相关资源
最近更新 更多