forked from bitovi/documentjs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
distance.js
54 lines (50 loc) · 1.04 KB
/
distance.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
steal.then(function() {
// the distance between 2 strings
DocumentJS.distance = function( s1, s2 ) {
if ( s1 == s2 ) {
return 0;
}
var s1_len = s1.length,
s2_len = s2.length;
if ( s1_len === 0 ) {
return s2_len;
}
if ( s2_len === 0 ) {
return s1_len;
}
s1 = s1.split('');
s2 = s2.split('');
var v0 = new Array(s1_len + 1),
v1 = new Array(s1_len + 1),
s1_idx = 0,
s2_idx = 0,
cost = 0;
for ( s1_idx = 0; s1_idx < s1_len + 1; s1_idx++ ) {
v0[s1_idx] = s1_idx;
}
var char_s1 = '',
char_s2 = '';
for ( s2_idx = 1; s2_idx <= s2_len; s2_idx++ ) {
v1[0] = s2_idx;
char_s2 = s2[s2_idx - 1];
for ( s1_idx = 0; s1_idx < s1_len; s1_idx++ ) {
char_s1 = s1[s1_idx];
cost = (char_s1 == char_s2) ? 0 : 1;
var m_min = v0[s1_idx + 1] + 1;
var b = v1[s1_idx] + 1;
var c = v0[s1_idx] + cost;
if ( b < m_min ) {
m_min = b;
}
if ( c < m_min ) {
m_min = c;
}
v1[s1_idx + 1] = m_min;
}
var v_tmp = v0;
v0 = v1;
v1 = v_tmp;
}
return v0[s1_len];
}
})