stringtranslate.com

Алгоритм Вагнера-Фишера

В информатике алгоритм Вагнера–Фишера — это динамический алгоритм программирования , который вычисляет расстояние редактирования между двумя строками символов.

История

Алгоритм Вагнера-Фишера имеет историю множественных изобретений . Наварро перечисляет следующих его изобретателей с указанием даты публикации и признает, что список неполный: [1] : 43 

Расчет расстояния

Алгоритм Вагнера-Фишера вычисляет расстояние редактирования на основе наблюдения, что если мы зарезервируем матрицу для хранения расстояний редактирования между всеми префиксами первой строки и всеми префиксами второй, то мы сможем вычислить значения в матрице путем ее заполнения и, таким образом, найти расстояние между двумя полными строками как последнее вычисленное значение.

Простая реализация в виде псевдокода для функции Distance , которая принимает две строки, s длины m и t длины n , и возвращает расстояние Левенштейна между ними, выглядит следующим образом. Входные строки имеют единичный индекс, а матрица d имеет нулевой индекс и [i..k]является замкнутым диапазоном.

function Distance ( char s [ 1 .. m ] , char t [ 1 .. n ]) : // для всех i и j, d[i,j] будет содержать расстояние между // первыми i символами s и первыми j символами t // обратите внимание, что d имеет (m+1)*(n+1) значений declare int d [ 0 .. m , 0 .. n ] устанавливает каждый элемент в d в ноль // исходные префиксы можно преобразовать в пустую строку, // отбросив все символы for i от 1 до m : d [ i , 0 ] := i // целевые префиксы можно получить из пустого исходного префикса , // вставив каждый символ for j от 1 до n : d [ 0 , j ] := j for j от 1 до n : for i от 1 до m : if s [ i ] = t [ j ] : substitutionCost := 0 else : стоимость замены := 1                                                                      d [ i , j ] := minimum ( d [ i - 1 , j ] + 1 , // удаление d [ i , j - 1 ] + 1 , // вставка d [ i - 1 , j - 1 ] + substitutionCost ) // подстановка return d [ m , n ]                     

Два примера результирующей матрицы (при наведении курсора на подчеркнутое число отображается операция, выполненная для получения этого числа):

Инвариант , поддерживаемый на протяжении всего алгоритма, заключается в том, что мы можем преобразовать начальный сегмент s[1..i]в t[1..j]с помощью минимума d[i,j]операций. В конце нижний правый элемент массива содержит ответ.

Доказательство правильности

Как упоминалось ранее, инвариант заключается в том, что мы можем преобразовать начальный сегмент s[1..i]в t[1..j]с использованием минимума d[i,j]операций. Этот инвариант выполняется, поскольку:

Это доказательство не подтверждает, что число, помещенное в , d[i,j]на самом деле является минимальным; это сложнее доказать, и оно включает в себя аргумент от противного, в котором мы предполагаем, d[i,j]что меньше минимального из трех, и используем это, чтобы показать, что одно из трех не является минимальным.

Возможные модификации

Возможные модификации этого алгоритма включают:

Вариант продавца для поиска по строке

Инициализируя первую строку матрицы нулями, мы получаем вариант алгоритма Вагнера–Фишера, который можно использовать для нечеткого поиска строки в тексте. [1] Эта модификация дает конечную позицию совпадающих подстрок текста. Чтобы определить начальную позицию совпадающих подстрок, количество вставок и удалений можно хранить отдельно и использовать для вычисления начальной позиции из конечной позиции. [4]

Полученный алгоритм ни в коем случае не является эффективным, но на момент своей публикации (1980) он был одним из первых алгоритмов, выполнявших приближенный поиск. [1]

Ссылки

  1. ^ abc Наварро, Гонсало (2001). "Путеводитель по приближенному сопоставлению строк" (PDF) . ACM Computing Surveys . 33 (1): 31–88. CiteSeerX  10.1.1.452.6317 . doi :10.1145/375360.375365. S2CID  207551224.
  2. ^ Гасфилд, Дэн (1997). Алгоритмы на строках, деревьях и последовательностях: компьютерная наука и вычислительная биология . Кембридж, Великобритания: Cambridge University Press. ISBN 978-0-521-58519-4.
  3. ^ Allison L (сентябрь 1992 г.). «Ленивое динамическое программирование может быть жадным». Inf. Proc. Letters . 43 (4): 207–12. doi :10.1016/0020-0190(92)90202-7.
  4. ^ Бруно Вольценлогель Палео. Приблизительный географический справочник для GATE на основе расстояния Левенштейна. Студенческая секция Европейской летней школы по логике, языку и информации ( ESSLLI ), 2007.