Может кто-нибудь объяснить, какая матрица Левенштейна создается в этом видео?Я запутался в некоторых моментах - PullRequest
0 голосов
/ 12 июля 2019

В этом видео: https://www.youtube.com/watch?v=aEIhvv5p-V8&t=520s у нас есть следующий код и интерактивная демонстрация построения матрицы Левенштейна.Мой вопрос: почему этот метод и соответствующий код имеют смысл?

Грубая реализация C ++:

for (i = 0; i < txt1.length(); i++) {
    for (j = 0;j < txt2.length(); j++) {
        edit = 0
        if txt1[i] != txt2[j] {
            edit = 1
        }
        mat[i + 1][j + 1] = min(
            mat[i][j + 1] + 1, // from txt1
            mat[i + 1][j] + 1, // from txt2
            mat[i][j] + edit, // from both
        )
    }
}
distance = mat[txt1.length()][txt2.length()]

Если вы пропустите примерно 3:45 в видео, вы можете увидетьпроизводитель начать заполнять матрицу.Я знаю, что любые горизонтальные перемещения приводят к вставке для "Google", а вертикальные перемещения вниз приводят к удалению для "Google".Диагональные - это совпадения или модификации.

Что я не уверен, так это формация из 3 ящиков, которая движется по мере продвижения автора видео.Для каждой строки или буквы «взглянуть» автор просматривает все буквы «Google» и в конце получает полную матрицу.

Я не совсем уверен, как работает формирование 3 ящиков с формулой минимума:

           mat[i][j + 1] + 1, // from txt1
            mat[i + 1][j] + 1, // from txt2
            mat[i][j] + edit, // from both

Почему мы берем минимум предыдущих?Как это говорит нам о том, что делать дальше и помещать в следующее поле?

Также я не уверен, почему горизонтальные сдвиги означают вставку, а вертикальные - удаление.

Спасибо за любыепомогите пока.Очень стараюсь понять DP.

1 Ответ

1 голос
/ 12 июля 2019

Левенштейн - сбивающий с толку алгоритм - мне потребовалось немало недоумений, когда я захотел добавить некоторую чувствительность к контексту (угадать, что может быть связано, вместо того, чтобы пытаться исправить ошибку.)

Что происходитОн заключается в том, что при построении таблицы каждая ячейка содержит количество изменений между двумя частями двух строк, представленных положением в таблице.Чтобы заполнить следующую ячейку в таблице, вы посмотрите на три возможных ячейки, из которых вы могли бы прийти, чтобы попасть туда.Вертикальный и горизонтальный подходы по своей сути являются правками, поэтому он добавляет 1 к счету.Диагональ редактируется, только если символы не совпадают.Затем вы выбираете наиболее эффективный из трех подходов, чтобы вычислить значение для текущей ячейки.

Сила этого подхода в том, что нет возврата назад, и, следовательно, он выполняется за время O (n ^ 2).Вам не нужно знать, как редактировать строку, чтобы преобразовать одну в другую, вам нужно только знать стоимость ее выполнения.(Хотя, если вы хотите знать, какие изменения необходимы, вы можете сохранить информацию о том, какой путь был выбран в функции max (), и пройти назад по цепочке, чтобы создать список изменений.)

Что касаетсяпочему ходы означают то, что они делают: каждая ячейка массива - это сравнение первых x символов первой строки с первыми y символами второй строки.Движение вправо означает получение символа из первой строки.Перемещение вниз означает взятие символа из второй строки.Выполнение любого из них является несоответствием и увеличивает ваш счетчик редактирования.Выполнение обоих одновременно означает, что вы взяли символ из обеих строк, вы увеличиваете количество правок, только если они не совпадают.

Базовый алгоритм не говорит вам как Вы попали туда, только сколько шагов потребовалось.Если вам нужно это выяснить, вы сохраняете решение, принятое на каждом этапе.

...