TL; DR: Трохи більш обмежений вид відстані редагування, на якому ми можемо вставляти та видаляти лише окремі символи, може бути обчислений у лінійно-часовий час, коли обидва (або навіть лише один) рядків мають унікальні символи. Це дає корисну верхню та нижню межі на відстані редагування Левенштейна.
Вставити / видалити відстань редагування та найдовші загальні підпорядкування
Відстань редагування Левенштейна дозволяє вставляти, видаляти та замінювати однозначні символи, призначаючи кожну вартість 1. Якщо ми обмежимось лише вставками та видаленнями, ми отримаємо аналогічний показник відстані, який тепер призводить до того, що заміна має вартість 2 (оскільки будь-яка заміна може імітувати за допомогою вставки та видалення). Я не знаю стандартного імені для цього більш обмеженого виду відстані редагування, тому я зателефоную йому "вставити / видалити редагування відстані". Вона відповідає тій самій тривалій загальній задачі підрядності (LCS) , в якій нам задаються два рядки, довжиною і відповідно, і хочеться знати довжину найдовшої послідовності, яка з'являється в обох. Якщо два рядки мають LCSmnL, тоді вони мають вставити / видалити відстань редагуванняn+m−2L : найпростіший спосіб побачити це вирівнювання рядків таким чином, щоб символи в LCS відображалися укладеними один на одного, тоді як символи, що не в LCS, з'являються навпроти -
проміжку характер. Тоді буде очевидно, що ми можемо відредагувати перший рядок у другий, зробивши вставку там, де є -
у верхньому рядку, та видалимо, де є -
в нижньому рядку. Наприклад:
-C-IRC-LE
T-RI-CKLE
Тут ЛГП з CIRCLE
і TRICKLE
, ICLE
має довжину 4, а відстань редагування дійсно .6+7−2∗4=5
Найдовше зростаючі піддані
Причиною цього обходу є те, що існує дуже ефективний спосіб обчислити LCS (і, таким чином, відстань редагування вставки / видалення), коли принаймні одна з послідовностей містить лише окремі символи: У цьому випадку проблема LCS може бути перетворена на проблема пошуку найбільш тривалої зростаючої послідовності , яку можна вирішити в часі . Припустимо, нам дано два рядки і , а рядок має різні символи. Ми можемо перейменувати перший символ у до 1, другий - 2 і так далі, відстежуючи, яке число ми призначили кожному символу в таблиці. Тоді вO(nlogn)ABAAB, ми перейменовуємо його символи за допомогою цієї таблиці (тобто, кожне виникнення того, що було першим символом A
, змінюється на 1 тощо). Нарешті, ми шукаємо найдовше зростаючу послідовність у Росії B
. Це відповідає LCS між A
і B
, і звідти ми можемо відразу обчислити відстань редагування вставки / видалення. Загальний необхідний час становить просто якщо і мають довжини і відповідно.O(n+mlogm)ABnm
Межі на Левенштейн редагувати відстань
Відстань вставки / видалення чітко забезпечує верхню межу на відстані Левенштейна (оскільки будь-яка дійсна послідовність операцій редагування на відстані вставки / видалення також є дійсною послідовністю операцій редагування Левенштейна). Поділ відстані редагування вставки / видалення на 2 також дає нижню межу, оскільки в гіршому випадку будь-яка операція редагування Левенштайна може бути змінена на 2 операції редагування вставлення / видалення.
Узагальнення
Вже в 1977 році Хант і Шиманський придумали алгоритм, який можна розглядати як узагальнення найдовшого алгоритму зростаючої послідовності. Це ефективно, коли кількість пар відповідних позицій символів між двома рядками невелика. Якщо є таких пар, їх алгоритм займає час . (Зауважте, що якщо всі символи в одній строці є різними.) Цей алгоритм був основою оригінальної програми, яка розглядала цілі рядки тексту як окремі символи. пізніше перейшли на використання алгоритму часу Майєрса , деrO((r+n)logn)r≤ndiff
diff
O(nd)d - це відстань редагування для вставки / видалення, оскільки це краще, коли загальні відмінності невеликі, але деякі "символи" (текстові рядки) часто з'являються (наприклад, рядок, що містить лише початковий діапазон у програмному коді C).
Хант, Дж .; Szymanski, T. (1977), "Швидкий алгоритм обчислення найдовших загальних підрядів", Communications ACM, 20 (5): 350–353, doi: 10.1145 / 359581.359603