【发布时间】:2020-06-29 02:34:29
【问题描述】:
我是编程新手,我正在构建一个文件相似度查找器,它可以找出两个文件的相似程度。 到目前为止,我将文件存储为两个字符串,然后使用 levenshtein distance 来找出文件的相似程度。
问题是,没有levenshtein距离的执行时间是206ms,这是由于文件到字符串的转换。 当我使用 levenshtein 距离时,执行时间高达 19504 毫秒
将文件转换为字符串所需的时间将近 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 的用法,但这对于将多个字符串与源进行比较很有用。除此之外,我运气不佳
【问题讨论】:
-
你为什么用 python 标记这个?
-
我也接受参考 python 的答案。我愿意用两种语言制作程序
-
你很接受你。但是,我们不会用任何特定语言为您编写整段代码。如果您的问题中没有 python,请删除标签。 (c 也是一种不同的语言,也请删除该标签)。
-
这使问题偏离主题,因为您正在寻求外部资源的建议。
-
您使用的算法不是最有效的(只需要两行,而不是完整的矩阵)。但在任何情况下,Levenshtein 距离的计算速度都不能比
O(n^2)快,所以不要指望有任何显着的改进。有一些方法可以在大致线性的时间内计算 an approximate value - 看看这是否足够好。
标签: python c++ c optimization levenshtein-distance