#java #levenshtein-distance
#java #Левенштейн-расстояние
Вопрос:
Я пытаюсь реализовать алгоритм Левенштейна на Java, вдохновленный этой статьей в Википедии
public static int indicator(char a, char b) {
return (a == b) ? 0 : 1;
}
public static int levenshtein(String token1, String token2) {
int[] levi = new int[token2.length() 1];
int[] levi_1 = new int[token2.length() 1];
// initialize column i=0
for (int j = 0; j <= token2.length(); j )
levi_1[j] = j;
// columns i=1 -> i=len(token1)
for (int i = 1; i <= token1.length(); i ) {
// lev_a,b(i,0) = i
levi[0] = i;
// update rest of column i
for (int j = 1; j <= token2.length(); j ) {
levi[j] = Math.min(Math.min(levi_1[j] 1, levi[j - 1] 1),
levi_1[j - 1] indicator(token1.charAt(i - 1), token2.charAt(j - 1)));
}
// save column i to update column i 1
levi_1 = levi;
}
return levi[token2.length()];
}
Но тестирование этого на строках «Maus» и «Haus» дает мне неправильный ответ 4. Можете ли вы помочь мне с тем, что я делаю неправильно?
Комментарии:
1. Что это за
indicator
метод?2. добавил его в код.
3. Что возвращает ваш метод? Я вижу, что он должен выводить целое число, не так ли
levi[levi.length - 1]
?4. исправлено. да, он возвращает это
Ответ №1:
Проблема возникает из этой строки:
levi_1 = levi;
Эта строка не изменяет каждое значение из levi_1
массива, она только изменяет его ссылку; значения остаются теми же, когда вы вызываете levi_1[0]
levi_1[1]
, и т.д.
Я бы посоветовал вам вместо этого написать эти строки:
for (int k = 0; k < levi.length; k )
levi_1[k] = levi[k];