scirs2_text/simd_ops/
edit_distance.rs1pub struct SimdEditDistance;
8
9impl SimdEditDistance {
10 pub fn levenshtein(s1: &str, s2: &str) -> usize {
12 let chars1: Vec<char> = s1.chars().collect();
13 let chars2: Vec<char> = s2.chars().collect();
14 let len1 = chars1.len();
15 let len2 = chars2.len();
16
17 if len1 == 0 {
18 return len2;
19 }
20 if len2 == 0 {
21 return len1;
22 }
23
24 let mut matrix = vec![vec![0usize; len2 + 1]; len1 + 1];
26
27 for i in 0..=len1 {
29 matrix[i][0] = i;
30 }
31 for j in 0..=len2 {
32 matrix[0][j] = j;
33 }
34
35 for i in 1..=len1 {
37 for j in 1..=len2 {
38 let cost = if chars1[i - 1] == chars2[j - 1] { 0 } else { 1 };
39 matrix[i][j] = (matrix[i - 1][j] + 1)
40 .min(matrix[i][j - 1] + 1)
41 .min(matrix[i - 1][j - 1] + cost);
42 }
43 }
44
45 matrix[len1][len2]
46 }
47
48 pub fn damerau_levenshtein(s1: &str, s2: &str) -> usize {
50 let chars1: Vec<char> = s1.chars().collect();
51 let chars2: Vec<char> = s2.chars().collect();
52 let len1 = chars1.len();
53 let len2 = chars2.len();
54
55 if len1 == 0 {
56 return len2;
57 }
58 if len2 == 0 {
59 return len1;
60 }
61
62 Self::levenshtein(s1, s2)
65 }
66
67 pub fn optimal_string_alignment(s1: &str, s2: &str) -> usize {
69 Self::levenshtein(s1, s2)
71 }
72}