Next:4.10
Методы порождения объектов
Up:4
Разработка алгоритмов
Previous:4.8
Метод ветвей и границ
В этом случае для решения задачи можно использовать очевидный рекурсивный
алгоритм. Однако, не всегда рекурсивная техника дает удовлетворительное
решение. Например, если разбиение таково, что решение размера
сводится к
подзадачам размера
,
то рекурсивный алгоритм будет, по-видимому, не приемлемым из-за его экспоненциальной
сложности. Другой пример, это возможная неэффективность рекурсивного алгоритма,
возникающая из-за большого числа повторений решения одной и той же подзадачи,
как это имеет место, например, при вычислении
-ого
числа Фибоначчи по формуле
.
Часто в этом случае можно получать эффективные алгоритмы с помощью табличной техники, называемой динамическим программированием. Динамическое программирование предполагает последовательное решение всех подзадач исходной задачи в порядке возрастания их размера с запоминанием ответов в специальной таблице по мере их получения. Преимущество этого метода по сравнению с рекурсивным алгоритмом состоит в том, что раз уж подзадача решена, ее ответ размещен в таблицу и в дальнейшем никогда не вычисляется повторно. Ответ подзадачи берется из таблицы каждый раз, когда он нужен для нахождения решения подзадачи большего размера. Понятно, что эта техника позволяет получать эффективные алгоритмы в тех случаях, когда объем хранимой в таблице информации оказывается не слишком большим.
Рассмотрим применение техники динамического программирования еще на
одном простом примере. Рассматривается множество так называемых раскроев
выпуклого -угольника
или, что то же самое, различных разбиений его на треугольники с помощью
непересекающихся диагоналей. Стоимость конкретного раскроя -- это
суммарная длина проведенных диагоналей. Пусть дан выпуклый
-угольник.
Требуется найти его раскрой минимальной стоимости.
Рис. 24.
Будем считать, что все вершины исходного многоугольника пронумерованы
в порядке обхода -угольника
по часовой стрелки, т.е.
-угольник
образован отрезками
,
Через
обозначим многоугольник, отрезаемый от исходного диагональю
где
Он образован отрезками
,
,
,
(см. рис. 24). Ясно, что при
многоугольник
вырождается в отрезок, при
он -- треугольник, а
-- это исходный
-угольник.
Для любых вершин
и
через
обозначим минимальную стоимость раскроя многоугольника
,
если
,
и полагаем
,
если
или
.
Получаем следующее очевидное рекуррентное соотношение (см. рис. 24):
,
где
-- это длина диагонали
,
если
,
и
,
если
.
Указанное соотношение позволяет составить таблицу для ,
заполняя ее в порядке возрастания числа
-- количества вершин в многоугольнике
.
Программа такого заполнения таблицы будет использовать память
и требовать время
,
поскольку всего существует
элементов таблицы, а для однократного применения рекуррентной формулы требуется
осуществить выбор минимального числа из не более чем
чисел.
После того, как вычислена таблица значений ,
мы получаем минимальную стоимость раскроя (она равна
)
и легко можем вычислить раскрой минимальной стоимости. Для этого можно
реализовать процесс обработки подзадач в порядке убывания их размера. Процесс
начинается обработкой исходной задачи и постепенно шаг за шагом находит
диагонали, образующие разрез минимальной стоимости. На каждом шаге рассматривается
многоугольник
и ищется такая вершина
,
,
что
.
Поскольку таких шагов будет меньше ,
а на каждом шаге требуется осуществить сравнение числа
со значениями не более чем
сумм
,
получаем оценку
для суммарной временной сложности двух этапов рассмотренного алгоритма.
Next:4.10
Методы порождения объектов
Up:4
Разработка алгоритмов
Previous:4.8
Метод ветвей и границ