我正在尝试改进现有的javascript levenstein距离计算源代码,以便不仅使用当前setps的值生成martix,而且还使用所采取的操作(插入,替换,删除或匹配)在Levenstein距离算法实现中填充动作矩阵
我得到错误的结果在 “动作” 矩阵:
在算法中我们看到,(不是JS,来自维基百科):
d[i, j] := minimum
(
d[i-1, j] + 1, // a deletion
d[i, j-1] + 1, // an insertion
d[i-1, j-1] + 1 // a substitution
)
所以在我的JS代码我做到以下几点:
// Step 6
d[i][j] = Minimum(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + cost);
// a deletion
if(d[i][j] == d[i - 1][j] + 1) {
actions[i][j] = 'D';
}
// a insertion
if(d[i][j] == d[i][j - 1] + 1) {
actions[i][j] = 'I';
}
// a substitution
if(d[i][j] == d[i - 1][j - 1] + cost) {
actions[i][j] = 'R';
}
一个d
矩阵(二维数组)是价值观,它得到的填充用正确的值。 但为什么相应的actions
矩阵显示不是逻辑算法会做什么?
我在分配'I','R','D'方面做错了什么?或者它是正确的,对我来说似乎并不合逻辑,因为我在前面的情景中认为插入会在第二步中发生。
顺便说一句,在Levenstein算法的情况下生成这样的“动作”矩阵实际上是否合理?
感谢您抽出时间并将其分解为我。我需要思考,也许会评论一个问题,只是为了澄清。 – 2012-03-01 20:38:46
例如,我了解我将如何从左下角的核心人员追踪最终矩阵 - 只是寻找调整后的上方值,但我如何重建为实现此目的而采取的“行动”?计算完成后它们会有什么关系? – 2012-03-01 20:40:42
当然,Levenstein和类似的算法需要一些时间来习惯和包裹头部。有一件事我错过了,在我重新阅读你的问题后,我注意到了:当你试图读取它时,你似乎是从“(0,0)”中追踪矩阵。虽然这看起来好像是一种好方法,但它不起作用。重建路径的唯一方法是从'(3,5)'(或任何你最后的角落)扫描。 – LiKao 2012-03-01 20:41:45