Class: String

Inherits:
Object
  • Object
show all
Defined in:
lib/string_dot_levenshtein/levenshtein_rb.rb,
ext/levenshtein.c

Instance Method Summary collapse

Instance Method Details

#levenshtein(arg) ⇒ Object



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
# File 'ext/levenshtein.c', line 5

VALUE levenshtein(VALUE obj, VALUE arg) {
	char *a = StringValuePtr(obj), *b = StringValuePtr(arg) ;
	char b_i_1 ;

	if (strcmp(a, b) == 0) return INT2FIX(0) ;
	if (strcmp(a, "") == 0) return INT2FIX(strlen(b)) ;
	if (strcmp(b, "") == 0) return INT2FIX(strlen(a)) ;

	uint64_t a_len = strlen(a) + 1 ;
	uint64_t b_len = strlen(b) + 1 ;

	if (a_len > 4096 || b_len > 4096)
		rb_raise(rb_eRuntimeError, "More than 4096 characters were given") ;

	uint16_t ary[b_len][a_len], *ary_i, *ary_i_1 ;
	uint16_t i, i_1 ;
	uint16_t j, j_1 ;
	uint16_t diag, up, left, min ;

	for(i = 0 ; i < a_len ; ++i) ary[0][i] = i ;
	for(i = 0 ; i < b_len ; ++i) ary[i][0] = i ;

	for(i = 1 ; i < b_len ; ++i) {
		i_1 = i - 1 ;
		ary_i = ary[i] ;
		ary_i_1 = ary[i_1] ;
		b_i_1 = b[i_1] ;

		for(j = 1 ; j < a_len ; ++j) {
			j_1 = j - 1 ;
			diag = ary_i_1[j_1] ;

			if (a[j_1] == b_i_1) {
				ary_i[j] = diag ;
			} else {
				up = ary_i_1[j] ;
				left = ary_i[j_1] ;

				min = diag ;
				if (up < min) min = up ;
				if (left < min) min = left ;

				ary_i[j] = min + 1 ;
			}
		}
	}

	return INT2FIX(ary[b_len - 1][a_len - 1]) ;
}

#levenshtein_rb(arg) ⇒ Object



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
# File 'lib/string_dot_levenshtein/levenshtein_rb.rb', line 2

def levenshtein_rb(arg)
	a_len = length + 1
	b_len = arg.length + 1

	x_chars = chars
	y_chars = arg.chars

	ary = Array.new(b_len) { Array.new(a_len) }

	i = -1
	ary[0][i] = i while (i += 1) < a_len

	i = -1
	ary[i][0] = i while (i += 1) < b_len

	i = 0
	while (i += 1) < b_len
		j = 0
		i_1 = i - 1
		ary_i = ary[i]
		ary_i_1 = ary[i - 1]

		while (j += 1) < a_len
			j_1 = j - 1
			diag = ary_i_1[j_1]

			if x_chars[j_1] == y_chars[i_1]
				ary_i[j] = diag
			else
				up = ary_i_1[j]
				left = ary_i[j_1]

				min = diag
				min = up if up < min
				min = left if left < min

				ary_i[j] = min + 1
			end
		end
	end

	ary[b_len - 1][a_len - 1]
end