我想实现基本编辑距离算法的修改。也就是说,加权编辑距离。 (上下文:尝试创建搜索引擎时出现拼写错误)
例如,用 a 代替 s 的成本会比用 s 代替 p EM>
使用DP的算法需要简单的改变,即
d[i, j] := minimum(d[i-1, j] + 1, // deletion
d[i, j-1] + 1, // insertion
d[i-1, j-1] + substitutionCost) // substitution
我看了,但是我无法在任何地方找到这样的矩阵,这会给我所有字母对的 substitutionCost 。我的意思是,我希望成本基于键盘上字母之间的距离。还没有人明确定义这样的矩阵吗?
答案 0 :(得分:0)
我编写了一个应该可行的c ++代码,我也假设键是对称放置的:
#include<bits/stdc++.h>
using namespace std;
string s[3];
int mat[35][35];
int main() {
s[0] = "qwertyuiop";
s[1] = "asdfghjkl;";
s[2] = "zxcvbnm,./";
for(int i = 0;i < 10;i++){
for(int j = 0;j < 3;j++){
for(int k = 0;k < 10;k++){
for(int l = 0;l < 3;l++){
if(j == 1 && i > 8) continue;if(l == 1 && k > 8) continue;
if(j == 2 && i > 6) continue;if(l == 2 && k > 6) continue;
int st1 = s[j][i] - 'a';
int st2 = s[l][k] - 'a';
mat[st1][st2] = abs(j-l) + abs(i-k);
}
}
}
}
for(int i = 0;i < 26;i++){
for(int j = 0;j < 26;j++){
cout << (char)(i+'a') << " " << (char)(j+'a') << " " << mat[i][j] << endl;
}
}
return 0;
}
指向Ideone上的输出链接:http://ideone.com/xq7kKp
此处mat[i][j]
包含密钥之间的距离。