我正在嘗試改進現有的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