Levenstein
distance algorithm
by mtambulut
JavaScript
function sift4Distance(s1, s2, maxOffset) {
// sift4: https://siderite.blogspot.com/2014/11/super-fast-and-accurate-string-distance.html
debugger;
if (maxOffset === undefined) {
maxOffset = 5; //default
}
if (!s1||!s1.length) {
if (!s2) {
return 0;
}
return s2.length;
}
if (!s2||!s2.length) {
return s1.length;
}
var l1=s1.length;
var l2=s2.length;
var c1 = 0; //cursor for string 1
var c2 = 0; //cursor for string 2
var lcss = 0; //largest common subsequence
var local_cs = 0; //local common substring
var trans = 0; //number of transpositions ('ab' vs 'ba')
var offset_arr=[]; //offset pair array, for computing the transpositions
while ((c1 < l1) && (c2 < l2)) {
if (s1.charAt(c1) == s2.charAt(c2)) {
local_cs++;
var isTrans=false;
//see if current match is a transposition
var i=0;
while (i<offset_arr.length) {
var ofs=offset_arr[i];
if (c1<=ofs.c1 || c2 <= ofs.c2) {
// when two matches cross, the one considered a transposition is the one with the largest difference in offsets
isTrans=Math.abs(c2-c1)>=Math.abs(ofs.c2-ofs.c1);
if (isTrans)
{
trans++;
} else
{
if (!ofs.trans) {
ofs.trans=true;
trans++;
}
}
break;
} else {
if (c1>ofs.c2 && c2>ofs.c1) {
offset_arr.splice(i,1);
} else {
i++;
}
}
}
offset_arr.push({
c1:c1,
c2:c2,
trans:isTrans
...