Микрооптимизация для вычисления расстояния редактирования: это правильно?

10

В Википедии дается реализация восходящей схемы динамического программирования для расстояния редактирования. Это не следует определению полностью; внутренние ячейки вычисляются следующим образом:

if s[i] = t[j] then  
  d[i, j] := d[i-1, j-1]       // no operation required
else
  d[i, j] := minimum
             (
               d[i-1, j] + 1,  // a deletion
               d[i, j-1] + 1,  // an insertion
               d[i-1, j-1] + 1 // a substitution
             )
}

Как видите, алгоритм всегда выбирает значение из верхнего левого соседа, если есть совпадение, сохраняя некоторые обращения к памяти, операции ALU и сравнения.

Однако удаление (или вставка) может привести к меньшему значению, поэтому алгоритм локально некорректен, то есть нарушает критерий оптимальности. Но, возможно, ошибка не меняет конечный результат - он может быть отменен.

Является ли эта микрооптимизация действительной и почему (нет)?

Рафаэль
источник

Ответы:

6

Я не думаю, что алгоритм имеет недостатки. Если две строки совпадают, мы сначала сравниваем последние два символа (а затем повторяем). Если они одинаковые, мы можем сопоставить их, чтобы получить оптимальное выравнивание. Например, рассмотрим строки testи testat. Если вы не соответствуете двум последним ts, то один из ts остается не сопоставленным, так как в противном случае ваше соответствие будет выглядеть так:

введите описание изображения здесь

Это невозможно, поскольку стрелкам не разрешено «пересекаться». Совпадение tвызывает несколько вставок (зеленые прямоугольники на рисунке), как показано слева:

введите описание изображения здесь

Но тогда вы можете просто найти одинаково хорошее выравнивание, изображенное справа. В обоих случаях вы соответствуете tи у вас есть две вставки.

Аргумент для замены одного из последних ts такой же. Поэтому, если вы подставите один из последних ts, вы можете вместо этого сопоставить последние два t и получить лучшее выравнивание (см. Рисунок).

введите описание изображения здесь

A.Schulz
источник
Ах, нисходящий аргумент для восходящей проблемы. Ницца!
Рафаэль