Algorithm 编辑距离算法

Algorithm 编辑距离算法,algorithm,levenshtein-distance,Algorithm,Levenshtein Distance,我有一本n个单词的字典,有m个问题需要回答。我想输出字典中编辑距离为1或2的单词数。我想优化结果集,因为n和m大约是3000 从下面的答案中添加编辑: 我会尝试用不同的词来表达 最初,有n个单词作为一组字典单词给出。接下来给出的“m”字是查询字,对于每个查询字,我需要找出字典中是否已经存在该字(编辑距离“0”),或者字典中距离字典字编辑距离1或2的字总数 我希望问题现在清楚了 如果时间复杂度为(m*n)n,则超时。简单使用DP编辑距离算法超时。即使计算2k+1的对角线元素也会出错,在上面的例子中

我有一本n个单词的字典,有m个问题需要回答。我想输出字典中编辑距离为1或2的单词数。我想优化结果集,因为n和m大约是3000

从下面的答案中添加编辑:


我会尝试用不同的词来表达

最初,有n个单词作为一组字典单词给出。接下来给出的“m”字是查询字,对于每个查询字,我需要找出字典中是否已经存在该字(编辑距离“0”),或者字典中距离字典字编辑距离1或2的字总数

我希望问题现在清楚了

如果时间复杂度为(m*n)n,则超时。简单使用DP编辑距离算法超时。即使计算2k+1的对角线元素也会出错,在上面的例子中,k是阈值,这里k=3。

您想在两个单词之间使用,但我假设您知道,因为这是问题的标签所说的

您必须遍历列表(假设),并将列表中的每个单词与当前执行的查询进行比较。你可以建立一个搜索引擎来限制你的搜索空间,但如果你只有约3000个单词,那听起来就太过分了

var upperLimit = 2;
var allWords = GetAllWords();
var matchingWords = allWords
        .Where(word => Levenshtein(query, word) <= upperLimit)
        .ToList();
var上限=2;
var allWords=GetAllWords();
var matchingWords=allWords

.Where(word=>Levenshtein(query,word)我将尝试用不同的词来表达它

最初,有n个单词作为一组字典单词给出。 接下来给出的“m”字是查询字,对于每个查询字,我需要找出字典中是否已经存在该字(编辑距离“0”),或者字典中距离字典字编辑距离1或2的字总数

我希望问题现在清楚了

如果时间复杂度为(m*n)*n,则超时。简单使用DP编辑距离算法超时。 即使计算2*k+1的对角线元素也会出错,其中k是阈值,在上述情况下k=3

PS:BK树应该满足这个目的。C++中实现的任何链接。< /P> <代码>公共类解决方案{

public class Solution   {
    public int minDistance(String word1, String word2) {
        int[][] table = new int[word1.length()+1][word2.length()+1];
        for(int i = 0; i < table.length; ++i) {
            for(int j = 0; j < table[i].length; ++j) {
                if(i == 0)
                    table[i][j] = j;
                else if(j == 0)
                    table[i][j] = i;
                else {
                    if(word1.charAt(i-1) == word2.charAt(j-1))
                        table[i][j] = table[i-1][j-1];
                    else
                        table[i][j] = 1 + Math.min(Math.min(table[i-1][j-1], 
                            table[i-1][j]), table[i][j-1]);
                }
            }
        }
        return table[word1.length()][word2.length()];
    }
}
public int minDistance(字符串word1、字符串word2){ int[][]table=newint[word1.length()+1][word2.length()+1]; 对于(int i=0;i
你能对问题进行一点扩展并给出一些上下文吗?我不确定你现在的措辞要求是什么。OP希望在一个约3000个单词的字典上高效地执行约3000个查询,并在字典中以1或2的编辑距离为每个查询返回单词。你是说“Levenshtein距离”。我将您的澄清移到原来的问题中。另一个选项是预先计算编辑距离2内的一组单词或字典中的每个单词,并将其存储。@Nick Johnson,预先计算数据假定您有固定的搜索空间和固定的输入。任何更改都将无法使用预先计算的值。@Simon斯文森:我会说一个固定的搜索空间,输入和尼克的评论有什么关系?