2014-10-06 3 views
0

P.S. если существует различный вес для добавления, замены и удаления. Тогда есть какой-нибудь алгоритм, который мог бы мне помочь.какие изменения следует внести в области редактирования расстояния algo, если имеются разные веса для добавления/удаления или замены

Или какие модификации требуются в алгоритме Вагнера-Фишера, чтобы минимизировать расстояние редактирования, если веса для добавления/удаления и замены различны?

+0

Вы можете изменить [алгоритм Вагнера-Фишера] (http://en.wikipedia.org/ wiki/Wagner% E2% 80% 93Fischer_algorithm # Возможные улучшения) использовать линейное пространство, если вы только заботитесь о расстоянии редактирования, а не о фактической последовательности изменений. – Nemo

+1

Требуется отрегулировать требуемое расстояние - O (N). Я не вижу, чтобы вы могли уменьшить его до меньшего. – dasblinkenlight

+0

@ Немо может сказать, что другие имена вагнер-фишера? – dhruvsharma

ответ

0

Наиболее оптимален я знаю на сегодняшний день является Levenshtein, вы также можете взглянуть на this publication. Надеется, что это помогает :)

0

Не знает, если вы знаете, но так как в каждой строке редактирования расстояния PD зависит только предыдущий, вы можете сохранить только две последние строки. Таким образом, вы можете достичь сложности O (n), а не O (n^2) в наивной реализации.

Пример в Python (предполагая, что стоимость 2 для замены, 3 для добавления и 5 для удаления):

def levenshtein(s1, s2): 
    A = [0]*(len(s2)+1) 
    B = range(len(s2)+1) 
    for i, c1 in enumerate(s1, 1): 
     A[0] = i 
     for j, c2 in enumerate(s2, 1): 
      if c1 == c2: 
       A[j] = B[j-1] 
      else: 
       A[j] = min(B[j-1]+2, A[j-1]+3, B[j]+5) 
     A,B = B,A 

    return B[len(s2)] 

print levenshtein('kitten', 'sitting') 
+0

Отлично! Вы можете немного изменить его и уйти с заменой одного из целых массивов с помощью пары целочисленных переменных. Также вы можете гарантировать, что массив равен min (| s1 |, | s2 |). Это стоит того, если одна строка намного больше другой. – Gene

+0

Что делать, если у меня есть разный вес для добавления/удаления и замены, а значение общего веса ограничено. то вы можете предложить любой подход? – dhruvsharma

+0

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