in src/main/java/org/apache/commons/text/similarity/LevenshteinDistance.java [234:283]
private static <E> int unlimitedCompare(SimilarityInput<E> left, SimilarityInput<E> right) {
if (left == null || right == null) {
throw new IllegalArgumentException("CharSequences must not be null");
}
/*
* This implementation use two variable to record the previous cost counts, So this implementation use less memory than previous impl.
*/
int n = left.length(); // length of left
int m = right.length(); // length of right
if (n == 0) {
return m;
}
if (m == 0) {
return n;
}
if (n > m) {
// swap the input strings to consume less memory
final SimilarityInput<E> tmp = left;
left = right;
right = tmp;
n = m;
m = right.length();
}
final int[] p = new int[n + 1];
// indexes into strings left and right
int i; // iterates through left
int j; // iterates through right
int upperLeft;
int upper;
E rightJ; // jth character of right
int cost; // cost
for (i = 0; i <= n; i++) {
p[i] = i;
}
for (j = 1; j <= m; j++) {
upperLeft = p[0];
rightJ = right.at(j - 1);
p[0] = j;
for (i = 1; i <= n; i++) {
upper = p[i];
cost = left.at(i - 1).equals(rightJ) ? 0 : 1;
// minimum of cell to the left+1, to the top+1, diagonally left and up +cost
p[i] = Math.min(Math.min(p[i - 1] + 1, p[i] + 1), upperLeft + cost);
upperLeft = upper;
}
}
return p[n];
}