Skip to content

Instantly share code, notes, and snippets.

@tmslnz
Created September 21, 2014 13:31
Show Gist options
  • Save tmslnz/756bd192eeab1d48df9a to your computer and use it in GitHub Desktop.
Save tmslnz/756bd192eeab1d48df9a to your computer and use it in GitHub Desktop.
String distance
// http://siderite.blogspot.com/2007/04/super-fast-and-accurate-string-distance.html
function sift3B(s1, s2, maxOffset, maxDistance) {
if (s1 == null||!s1.length) {
if (s2 == null) {
return 0;
}
return s2.length;
}
if (s2 == null||!s2.length) {
return s1.length;
}
var c1 = 0;
var c2 = 0;
var lcs = 0;
var temporaryDistance;
while ((c1 < s1.length) && (c2 < s2.length)) {
if (s1.charAt(c1) == s2.charAt(c2)) {
lcs++;
} else {
if (c1<c2) {
c2=c1;
} else {
c1=c2;
}
for (var i = 0; i < maxOffset; i++) {
if ((c1 + i < s1.length) && (s1.charAt(c1 + i) == s2.charAt(c2))) {
c1+= i;
break;
}
if ((c2 + i < s2.length) && (s1.charAt(c1) == s2.charAt(c2 + i))) {
c2+= i;
break;
}
}
}
c1++;
c2++;
if (maxDistance)
{
temporaryDistance=(c1+c2)/1.5-lcs;
if (temporaryDistance>=maxDistance) return Math.round(temporaryDistance);
}
}
return Math.round((s1.length + s2.length) / 1.5 - lcs);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment