Відредагуйте відстань списку унікальними елементами


12

Відстань редагування Левенштайн-Відстань між списками - добре вивчена проблема. Але я не можу знайти багато можливих вдосконалень, якщо відомо, що жоден елемент не зустрічається більше одного разу у кожному списку .

Припустимо також, що елементи порівнянні / сортувані (але списки для порівняння для початку не відсортовані).

Зокрема, мене цікавить, чи унікальність елементів дозволяє вдосконалити алгоритм Укконена для редагування відстані, що має часову складність і складність простору O (\ min (s, m, n) s) , де s - мінімальна вартість етапів редагування .O(min(m,n)s)O(min(s,m,n)s)s

Більш офіційно,

наскільки ефективно ми можемо обчислити відстань редагування між двома заданими рядками s,tΣ обіцяючи, що у них немає повторень?

Σ - це дуже великий алфавіт.


Яке ваше запитання зараз; як прискорити попарно редагування відстані чи як прискорити обчислення всіх парних відстаней списку рядків?
Рафаель

2
Я підозрюю, що питання: як обчислити відстань редагування між , де це рядки над дуже великим алфавітом , і ми гарантуємо, що жодна літера не з’являється двічі в або в (ОП представляє кожен рядок у вигляді списку літер, тобто списку елементів). Але для цього потрібно підтвердження. s,ts,tΣΣst
DW

Так, у цьому випадку великий алфавіт складається з індексів баз даних, а "рядки", s і t - це списки, що містять ці індекси.
користувач362178

Для тих, хто цікавиться складностями: і - довжини вхідних рядків, - фактична відстань редагування, тому вона включається в складність. Вартість кожного редагування вважається 1 , але, ймовірно , не має значення для обчислення цієї відстані (скільки разів ви редагували ). mnss
Альберт Хендрікс

Відповіді:


3

TL; DR: Трохи більш обмежений вид відстані редагування, на якому ми можемо вставляти та видаляти лише окремі символи, може бути обчислений у лінійно-часовий час, коли обидва (або навіть лише один) рядків мають унікальні символи. Це дає корисну верхню та нижню межі на відстані редагування Левенштейна.

Вставити / видалити відстань редагування та найдовші загальні підпорядкування

Відстань редагування Левенштейна дозволяє вставляти, видаляти та замінювати однозначні символи, призначаючи кожну вартість 1. Якщо ми обмежимось лише вставками та видаленнями, ми отримаємо аналогічний показник відстані, який тепер призводить до того, що заміна має вартість 2 (оскільки будь-яка заміна може імітувати за допомогою вставки та видалення). Я не знаю стандартного імені для цього більш обмеженого виду відстані редагування, тому я зателефоную йому "вставити / видалити редагування відстані". Вона відповідає тій самій тривалій загальній задачі підрядності (LCS) , в якій нам задаються два рядки, довжиною і відповідно, і хочеться знати довжину найдовшої послідовності, яка з'являється в обох. Якщо два рядки мають LCSmnL, тоді вони мають вставити / видалити відстань редагуванняn+m2L : найпростіший спосіб побачити це вирівнювання рядків таким чином, щоб символи в LCS відображалися укладеними один на одного, тоді як символи, що не в LCS, з'являються навпроти -проміжку характер. Тоді буде очевидно, що ми можемо відредагувати перший рядок у другий, зробивши вставку там, де є -у верхньому рядку, та видалимо, де є -в нижньому рядку. Наприклад:

-C-IRC-LE
T-RI-CKLE

Тут ЛГП з CIRCLEі TRICKLE, ICLEмає довжину 4, а відстань редагування дійсно .6+724=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)rndiffdiffO(nd)d - це відстань редагування для вставки / видалення, оскільки це краще, коли загальні відмінності невеликі, але деякі "символи" (текстові рядки) часто з'являються (наприклад, рядок, що містить лише початковий діапазон у програмному коді C).

Хант, Дж .; Szymanski, T. (1977), "Швидкий алгоритм обчислення найдовших загальних підрядів", Communications ACM, 20 (5): 350–353, doi: 10.1145 / 359581.359603

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.