Применение метода четырёх русских в задачах ДП на примере задачи о НОП — различия между версиями
(Новая страница: «{{В разработке}} == Описание алгоритма == Рассмотрим задачу о наибольшей общей подпоследова…») |
(нет различий)
|
Версия 05:20, 6 декабря 2010
Описание алгоритма
Рассмотрим задачу о наибольшей общей подпоследовательности для двух последовательностей одинаковой длины. Тогда таблица динамического программирования имеет размер
. Разобьём её на квадраты размера следующим образом: выделим каждую -ую строчку, начиная с первой. Аналогично выделяем столбцы.Требуется, чтобы
делило , но это не является ограничением - можно дописать в конец последовательностей символы, которые не встречались в других местах этих последовательностей (символы для каждой последовательности должны быть разными). Тогда ответ на задачу не изменится, а длину можно "довести" до делителя .Предпосчитаем действие каждого возможного квадрата. Понятно, что окончательный результат зависит только от значений в верхнем левом "уголке" квадрата и подстрок, для которых считается ответ. Окончательным результатом будут значения в нижнем правом "уголке" квадрата.
Может показаться, что таких уголков может быть много. Но, так как соседние числа в матрице отличаются не более, чем на один, то результат зависит только от константы в верхнем левом элементе матрицы, и возрастания чисел в верхнем и левом крае квадрата. Возрастание чисел будем хранить с помощью битовых масок: сначала
бит кодирует возрастание чисел в верхнем крае квадрата (0 - элемент равен предыдущему, 1 - больше предыдущего на один), потом бит кодируют возрастание чисел в квадрате по левому краю аналогичным образом.Более того, константу в верхнем левом элементе квадрата можно вообще не хранить - её можно прибавить при надобности к каждому элементу результата.
Итого, получается
предпосчитанных квадратов, подсчёт каждого происходит за время, пропорциональное .После этого ответ для самой задачи НОП считается аналогично обычному алгоритму, только на этот раз пересчитывается не каждый элемент матрицы, а только уголки.
Время работы
Суммарное время работы алгоритма
. Понятно, что для получения выигрыша в производительности по сравнению с обычным алгоритмом необходимо, чтобы первое слагаемое не превышало второе. Это достигается при условии