Существует ли алгоритм нечеткого поиска, такой как расстояние Левенштейна, специализированный для набора упорядоченных символов?

Я нашел алгоритм (на https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance) и, прочитав немного больше о Левенштейне, понял, что должен быть лучший способ сообщить расстояние редактирования двух строк, если эти строки строго состоят из алфавитно-упорядоченных и уникальных символов.

Это означает, что для каждого a и b, такого как a

И это точно означает, что есть лучший способ определить расстояние редактирования между двумя строками такого типа.

Если это полезно, класс, который я использую для организации своих персонажей, это TreeSet of Character.

1 ответ

Решение

Это решение, которое я придумал: я использовал его со значениями: String test, String target, 1, 0.

/** returns the cost of the difference between a tested CharSequence and a target CharSequence. CS = CharSequence
 * @param tested input, the CS which will be compared to the target. all letters sorted by ASCII order and unique
 * @param target is the CS to which the tested will be compared. all letters sorted by ASCII order and unique
 * @param positiveDifferenceCost is the cost to add when a letter is in the tested CS but not in the target.
 * @param negativeDifferenceCost is the cost to add when a letter is in the target CS but not in the tested.
 * @return int the number of differences.
 */


public static int oneSidedOAUDistance(final CharSequence tested, final CharSequence target,
                                      final int positiveDifferenceCost, final int negativeDifferenceCost) {
    int diffCount = 0;
    int index_tested = 0;
    int index_target = 0;

    if (positiveDifferenceCost == 0 && negativeDifferenceCost == 0)
        return 0;


    for (; index_tested < tested.length() && index_target < target.length(); ) {
        if (tested.charAt(index_tested) == target.charAt(index_target)) {
            ++index_tested;
            ++index_target;
            continue;
        }
        if (tested.charAt(index_tested) < target.charAt(index_target)) {
            //some letters should not be there in tested string.
            diffCount+= positiveDifferenceCost;
            index_tested++;

        } else {
            //some letters miss in tested string.
            diffCount+=negativeDifferenceCost;
            index_target++;
        }
    }


    return diffCount;
}
Другие вопросы по тегам