Реализации алгоритмов/Расстояние Левенштейна: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Улучшение
Строка 96:
== Алгоритм Левенштейна на языке [[JavaScript|JavaScript]] ==
<source lang="javascript">
function levenshteinlevenshtein_orig(ss1, ts2, cdcr, ci, cscd) {
var cuthalf = 150;
var bufi, j, =l1, newl2, Array((cuthalfflip, *ch, 2)ii, -ii2, 1)cutHalf;
m l1 = ss1.length;
n l2 = ts2.length;
}
cutHalf = flip = Math.max(l1, l2);
 
var minCost = min3Math.min(cd, ci, cscr);
function min3(a, b, c) { // вспомогательная функция
return var minD = Math.minmax(Math.min(aminCost,b (l1 - l2),c * cd);
var minI = Math.max( minCost, (nl2 - ml1) * ci );
}
var buf = new Array((cutHalf * 2) - 1);
 
for (i = 10; i <= ml2; i++i) {
// s, t - строки преобразования
buf[i] = i * minD;
// cd, ci, cs - стоимость удаления, вставки и замены
function levenshtein(s, t, cd, ci, cs) {
var i, j, m, n, cost, flip, result;
s = s.substr(0,cuthalf);
t = t.substr(0,cuthalf);
m = s.length;
n = t.length;
if (m === 0)
result = n;
else if (n === 0)
result = m;
else {
cd = cd || 1;
ci = ci || 1;
cs = cs || 1;
var minCost = min3(cd, ci, cs);
var minD = Math.max( minCost, (m - n) * cd );
var minI = Math.max( minCost, (n - m) * ci );
flip = false;
for (i = 0; i <= n; i++)
buf[i] = i * minD;
for (i = 1; i <= m; i++) {
if (flip)
buf[0] = i * minI;
else
buf[cuthalf] = i * minI;
for (j = 1; j <= n; j++) {
if (s.charAt(i-1) == t.charAt(j-1))
cost = 0;
else
cost = cs;
if (flip)
buf[j] = min3((buf[cuthalf + j] + cd), // delete
(buf[j - 1] + ci), // insert
(buf[cuthalf + j - 1] + cost)); // substitute
else
buf[cuthalf + j] = min3((buf[j] + cd), // delete
(buf[cuthalf + j - 1] + ci), // insert
(buf[j - 1] + cost)); // substitute
}
flip = !flip;
}
 
if (flip)
for (i = 0; i <= nl1; i++i, flip = cutHalf - flip) {
result = buf[cuthalf + n];
else ch = s1[i];
 
result = buf[n];
buf[0flip] = (i + 1) * minI;
}
 
return result;
result ii = nflip;
ii2 = costcutHalf =- 0flip;
 
for (j = 10; j <= nl2; ++j, ++ii, ++ii2) {
buf[ii + 1] = Math.min(buf[ii2 + 1] + cd, buf[ii] + ci, buf[ii2] + cr * (ch !== s2[j]));
cd = cd || 1;}
}
return buf[l2 + cutHalf - flip];
}
</source>