Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 该算法是否已正确实现?_Java_Algorithm_Performance_Implementation_Bk Tree - Fatal编程技术网

Java 该算法是否已正确实现?

Java 该算法是否已正确实现?,java,algorithm,performance,implementation,bk-tree,Java,Algorithm,Performance,Implementation,Bk Tree,我目前正在实现一个用于制作拼写检查器的。我正在使用的词典非常大(数百万个单词),这就是为什么我根本无法承受任何低效的原因。但是,我知道我编写的查找函数(可以说是整个程序中最重要的部分)可以做得更好。我希望在这方面能找到一些帮助。以下是我编写的查找: public int get(String query, int maxDistance) { calculateLevenshteinDistance cld = new calculateLevenshteinDistance();

我目前正在实现一个用于制作拼写检查器的。我正在使用的词典非常大(数百万个单词),这就是为什么我根本无法承受任何低效的原因。但是,我知道我编写的查找函数(可以说是整个程序中最重要的部分)可以做得更好。我希望在这方面能找到一些帮助。以下是我编写的查找:

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;
}
public int-get(字符串查询,int-maxDistance)
{
CalculateLevenshteIndication cld=新的CalculateLevenshteIndication();
int d=cld.calculate(根,查询);
int-tempdance=0;
如果(d==0)
返回0;
if(maxDistance==整数.MAX_值)
最大距离=d;
int i=数学最大值(d-maxDistance,1);
BKTree temp=null;

对于(;i您的循环看起来基本正确,如果有一点拜占庭式的话。您尝试优化停止条件(使用tempdistance/maxdistance)但是,这是不正确的:BK树的结构要求您搜索当前节点的levenshtein距离d-k到d+k内的所有节点,如果您想找到所有结果,那么您不能像这样修剪它

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


你可能会发现我在L上的后续文章很有启发性,因为它们比BK树更有效。不过,如果你要建立一个拼写检查器,我建议你遵循法沃纽斯的建议,检查如何编写一个。它比简单的字符串距离检查更适合拼写更正。

@Mitch-这可能是真的……但人们仅仅以被接受为借口回答问题已经开始变得有点老了。人们回答问题不是为了提供帮助吗?@efficiencyIsBliss-我回答问题是因为我需要我的答案被接受。祝你好运。@Justin,我理解你的来历。但我认为从个人角度来看,这是一个健康的论点公共知识库的目标是鼓励公民参与最佳实践。一个带有勾选答案的问题对于偶然遇到的谷歌搜索者来说比一个没有这样答案的搜索者更有用。你看到顶部的方框了吗?那个写着“未回答”的方框。这就是人们需要接受答案的原因。他们正在污染列表,浪费人们试图帮助解决实际上没有答案的问题的时间。出于好奇,什么语言拼写需要数百万个单词?我知道d-k到d+k部分,并实施了它,但它给了我不正确的结果,这就是为什么我放弃了它这是完全正确的。这就是为什么我如此确信我没有有效地修剪搜索空间。你能在这里进一步解释一下这一部分吗?d和k是保持不变还是随着树的每次迭代而变化?“k”是阈值,并且保持不变。“d”是搜索项和当前节点之间的距离,取决于t您正在评估的节点。为了减少搜索空间,我们可以更改k以反映到目前为止找到的最小距离吗?如果我们知道我们查看的第一个单词与我们的单词的距离为5,那么查看距离为6或更高的单词是没有意义的,对吗?