저는 두 단어 사이에 0 또는 1의 거리가 있는지 확인하고 그럴 경우 참을 리턴 할 필요가있는 게임을하고 있습니다. 나는 범용 levenshtein 거리 알고리즘 발견 작동1의 거리를 확인하기 위해 levenshtein 거리를 최적화하는 방법은 무엇입니까?
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;
}
을하지만,이 지점은 핫스팟으로 잠재적으로 수천 번 두 번째 수백을 실행할 것입니다 그리고 내가하지 않기 때문에이를 최적화 할 범용 알고리즘, 0의 거리 또는 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;
}
을하지만 프로파일 후 나는 내 코드는 것을 발견 두 번 느리게, 나는 놀랐다. 왜냐하면 나는 g eneral 목적 알고리즘은 O (n * m)이고 나는 내 것이 O (n)라고 생각한다.
나는이 바이올린의 성능 차이를 테스트했습니다 :
https://jsfiddle.net/aubtze2L/3/는 거기에 내가 사용할 수있는 더 나은 알고리즘이나 내가 더 빨리 내 코드를 최적화 할 수있는 방법을?
'let's을'var'으로 바꿀 때 가장 빠릅니다. 내 컴퓨터의 속도를 160ms에서 120ms로 변경합니다. 감사. –