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