私は、2つの単語の間に0または1の距離があるかどうかを確認し、そうであれば真を返すだけのゲームに取り組んでいます。1の距離をチェックするためにレベンショニング距離を最適化する方法は?
function levenshtein(s, t) {
if (s === t) { return 0; }
var n = s.length, m = t.length;
if (n === 0 || m === 0) { return n + m; }
var x = 0, y, a, b, c, d, g, h, k;
var p = new Array(n);
for (y = 0; y < n;) { p[y] = ++y; }
for (;
(x + 3) < m; x += 4) {
var e1 = t.charCodeAt(x);
var e2 = t.charCodeAt(x + 1);
var e3 = t.charCodeAt(x + 2);
var e4 = t.charCodeAt(x + 3);
c = x; b = x + 1; d = x + 2; g = x + 3; h = x + 4;
for (y = 0; y < n; y++) {
k = s.charCodeAt(y);
a = p[y];
if (a < c || b < c) { c = (a > b ? b + 1 : a + 1); }
else { if (e1 !== k) { c++; } }
if (c < b || d < b) { b = (c > d ? d + 1 : c + 1); }
else { if (e2 !== k) { b++; } }
if (b < d || g < d) { d = (b > g ? g + 1 : b + 1); }
else { if (e3 !== k) { d++; } }
if (d < g || h < g) { g = (d > h ? h + 1 : d + 1); }
else { if (e4 !== k) { g++; } }
p[y] = h = g; g = d; d = b; b = c; c = a;
}
}
for (; x < m;) {
var e = t.charCodeAt(x);
c = x;
d = ++x;
for (y = 0; y < n; y++) {
a = p[y];
if (a < c || d < c) { d = (a > d ? d + 1 : a + 1); }
else {
if (e !== s.charCodeAt(y)) { d = c + 1; }
else { d = c; }
}
p[y] = d;
c = a;
}
h = d;
}
return h;
}
動作しますが、このスポットはホットスポットになるだろうと私がいないため、2番目の潜在的に何百何千回ものを実行し、私はそれを最適化したいこと:私は、汎用のレーベンシュタイン距離アルゴリズムを発見しました汎用アルゴリズムを必要とし、0または1
の距離がある場合、私はそれを書いてみましたし、これを思いついチェックするだけで1:
function closeGuess(guess, word) {
if (Math.abs(word.length - guess.length) > 1) { return false; }
var errors = 0, guessIndex = 0, wordIndex = 0;
while (guessIndex < guess.length || wordIndex < word.length) {
if (errors > 1) { return false; }
if (guess[guessIndex] !== word[wordIndex]) {
if (guess.length < word.length) { wordIndex++; }
else { guessIndex++; }
errors++;
} else {
wordIndex++;
guessIndex++;
}
}
return true;
}
しかし、それをプロファイリングした後、私は私のコードがあることがわかりました2倍遅く、私は驚いたエネルナル目的アルゴリズムはO(n * m)であり、私はO(n)と考える。
私はこのフィドルにパフォーマンスの違いをテストしてきた:https://jsfiddle.net/aubtze2L/3/
は、私が使用できる任意のより良いアルゴリズムや私がより速くなるために私のコードを最適化することができます任意の方法はありますか?
すべての 'let'sを' var'で置き換えると、これが最も速くなります。マシンの速度を160msから120msに変更します。ありがとう。 –