【问题标题】:Has this algorithm been implemented properly?该算法是否已正确实施?
【发布时间】:2011-04-21 09:52:39
【问题描述】:

我目前正在实施BK-Tree 来进行拼写检查。我正在使用的字典非常大(数百万字),这就是我无法承受任何低效率的原因。但是,我知道我编写的查找函数(可以说是整个程序中最重要的部分)可以做得更好。我希望能找到一些关于同样的帮助。这是我写的查找:

public int get(String query, int maxDistance)
{
    calculateLevenshteinDistance cld = new calculateLevenshteinDistance();
    int d = cld.calculate(root, query);
    int tempDistance=0;

    if(d==0)
        return 0;

    if(maxDistance==Integer.MAX_VALUE)
        maxDistance=d;

    int i = Math.max(d-maxDistance, 1);
    BKTree temp=null;

    for(;i<=maxDistance+d;i++)
    {
        temp=children.get(i);
        if(temp!=null)
        {
            tempDistance=temp.get(query, maxDistance);
        }
        if(maxDistance<tempDistance)
            maxDistance=tempDistance;
    }

    return maxDistance;
}

我知道我运行循环的次数非常多,而且我们可以修剪搜索空间以加快查找速度。我只是不确定如何最好地做到这一点。

【问题讨论】:

  • @Mitch - 这可能是真的......但是仅仅以被接受为借口回答的人开始变得有点老了。人们不应该回答是有帮助的吗?
  • @efficiencyIsBliss - 我回答问题是因为我需要接受我的答案。祝你好运。
  • @Justin,我知道你来自哪里。但我认为可以提出一个健康的论点,即从公共知识库的角度来看,鼓励公民参与最佳实践是好的。对于遇到 SO 的随机谷歌用户来说,带有已检查答案的问题比没有这样答案的问题更有用。
  • 你看到上面的那个盒子了吗?说“未答复”的那个。这就是为什么人们需要接受答案。他们污染了列表,浪费了人们试图帮助解决实际上没有答案的问题的时间。
  • 出于好奇,什么语言拼写需要百万字

标签: java algorithm performance implementation bk-tree


【解决方案1】:

如果有点拜占庭式,您的循环看起来通常是正确的。但是,您尝试细化停止条件(使用 tempdistance/maxdistance)是不正确的:BK-tree 的结构要求您探索在当前节点的 dk 到 d+k 的 levenshtein 距离内的所有节点,如果您想找到所有结果,所以你不能那样修剪它。

是什么让你觉得你对这棵树的探索太多了?

您可能会发现我在 Levenshtein Automata 上的后续帖子很有启发性,因为它们比 BK-trees 更有效。但是,如果您正在构建拼写检查器,我建议您遵循 Favonius 的建议并查看 this article 以了解如何编写。它比简单的字符串距离检查更适合拼写纠正。

【讨论】:

  • 我知道 d-k 到 d+k 部分并且我实现了它,但它给了我不正确的结果,这就是我完全摆脱它的原因。这就是为什么我如此确定我没有有效地修剪搜索空间。你能在这里多解释一下那部分吗? d 和 k 是保持不变还是随着树的每次迭代而变化?
  • 'k' 是阈值,并且保持不变。 “d”是搜索词与当前节点之间的距离,取决于您正在评估的节点。
  • 为了减少搜索空间,我们可以改变k来镜像目前找到的最小距离吗?如果我们知道我们看到的第一个词与我们的词的距离为 5,那么查看距离可能为 6 或更高的词就没有意义了,对吧?
猜你喜欢
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2014-04-15
  • 2017-12-02
相关资源
最近更新 更多