提问者:小点点

两个文件的Levenshtein距离占用太多时间


我是编程新手,我正在构建一个文件相似性查找器,它查找两个文件有多相似。 到目前为止,我将文件存储为两个字符串,然后使用levenshtein距离来查找文件的相似性。

问题是,没有levenshtein距离的执行时间为206ms,这是由于文件到字符串的转换。 当我使用levenshtein距离时,执行时间是惊人的19504ms

几乎是将文件转换为字符串所花费时间的95倍,这使其成为我的项目中的一个瓶颈

我对C,C++和Python很熟悉。 如果你能给我提供任何消息来源,我将不胜感激

下面是我用来计算Levenshtein距离的函数的C++代码:

//LEVENSHTEIN
int levenshtein(std::string a, std::string b){
  int len_a = a.length();
  int len_b = b.length();
  int d[len_a + 1][len_b+1];

  for(int i = 0; i < len_a + 1; i++)
    d[i][0] = i;

  for(int j = 0; j < len_b + 1; j++)
    d[0][j] = j;

  for(int i = 1; i < len_a + 1; i++){
    for(int j = 1; j < len_b + 1; j++){
      if(a[i - 1] == b[j - 1]){
        d[i][j] = d[i - 1][j - 1];
      }
      else{
        d[i][j] = 1 + min(min(d[i][j-1],d[i-1][j]),d[i-1][j-1]);
      }
    }
  }

  int answer = d[len_a][len_b];

  return answer;
}

我只需要比较两个文件,而不是更多。 我在levenshtein中读到了trie的用法,但这对于比较多个字符串和源代码很有用。 除此之外,我的运气不太好


共1个答案

匿名用户

有一个叫做NLTK的软件包。 看看吧。

from nltk import distance
print(distance.edit_distance('aa', 'ab'))

输出:

1