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