Это не сделано, потому что вам не разрешено редактировать обе строки. Определение расстояния редактирования (из википедии):
Серия минимальных весов операций редактирования, которая преобразует a в b.
Так вы специально искали (вес) последовательности операций для выполнения на строке a
, чтобы преобразовать его в строку b
.
Кроме того, расстояние редактирования не обязательно симметрично. Если ваши расходы на вставки и делеции идентичны расстояние симметрично: d(a,b) = d(b,a)
Рассмотрим пример википедии, но с разными затратами:
- затраты на вставках: w_ins = 1
- стоимость для удалений: w_del = 2
- затраты на замещений: w_sub = 1
расстояние котенка и сидит все еще 3,
kitten -> sitten (substitution k->s, cost 1)
sitten -> sittin (substitution e->i, cost 1)
sittin -> sitting (insertion of g, cost 1)
=> d(kitten, sitting) = 3
но расстояние сидя и котенка нет:
sitting -> kitting (substitution s->k, cost 1)
kitting -> kitteng (substitution i->e, cost 1)
kitteng -> kitten (deletion of g, cost 2)
=> d(kitten, sitting) = 4
Вы видите, что d(kitten, sitting) != d(kitten, sitting)
.
С другой стороны, если вы используете симметричные затраты, так как расстояние Левенштейна (которое является расстоянием редактирования с единичными затратами), вы можете предположить, что имеет место d(a,b) = d(b,a)
. Тогда вы ничего не выигрываете, рассматривая обратные случаи. То, что вы теряете, - это информация, в которой символ был заменен в строке, что затрудняет извлечение последовательности операций после этого.
Wagner-Fisher algorithm, который вы показываете в своем вопросе, может извлечь это из матрицы DP, возвратив трассу с минимальными затратами. Рассмотрим эти два редактирования матрицы между к и Foo с удельных затрат:
t o f o o
f 1 2 t 1 2 3
o 2 1 o 2 1 2
o 3 2
Обратите внимание, что если вы транспонировать матрицу для d(to, foo)
вы получите матрицу для d(foo, to)
. Обратите внимание, что посредством этого вставка в первой матрице становится удалением во второй матрице и наоборот. Так вот эта симметрия, которую вы ищете, подходит снова.
Я надеюсь, что это помогает :)
Я думаю, что расстояние Левенштейн легче понять, если вы начинаете с одной струной и пройти через операцию, чтобы превратить его в другую строку. Следовательно, необходимость как вставки, так и удаления. –
Я думаю, что в задаче редактирования расстояния нам разрешено выполнять изменения в обеих строках ... – rondo