Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
40_алгоритмов_Python.pdf
Скачиваний:
8
Добавлен:
07.04.2024
Размер:
13.02 Mб
Скачать

104

Глава 4. Разработка алгоритмов

повторно использовать результаты тяжелых вычислений. Этот интеллектуаль­ ный механизм кэширования называется мемоизацией (memorization).

Динамическое программирование увеличивает производительность, когда за­ дачу можно разделить на подзадачи. В подзадачах могут выполняться одни и те же вычисления. Идея состоит в том, чтобы выполнить какое-то вычисление единожды (что является трудоемким шагом), а затем повторно использовать его для других подзадач. Это возможно при помощи мемоизации, что особенно полезно при решении рекурсивных задач, которые могут многократно получать одни и те же входные данные.

Жадные алгоритмы

Прежде чем мы погрузимся в эту тему, дадим определения двум понятиям:

zz Алгоритмические затраты (algorithmic overheads). Всякий раз, когда мы пытаемся найти оптимальное решение какой-то задачи, это занимает время. По мере того как задачи становятся все более и более сложными, время по­ иска оптимального решения также возрастает. Обозначим алгоритмические затраты как Ωi.

zzДельта от оптимального (delta from optimal). Для некоторой задачи опти­ мизации существует оптимальное решение. Как правило, мы итеративно оптимизируем решение, используя выбранный алгоритм. Для любой задачи всегда существует идеальное решение, называемое оптимальным решением. Как уже говорилось, если классифицировать задачу, может оказаться, что оптимальное решение неизвестно или что для его расчета и проверки по­ требуется неоправданно много времени. Предполагая, что оптимальное ре­ шение известно, разницу между ним и текущим решением на i-й итерации мы называем дельтой от оптимального и представляем как i.

Для решения комплексных задач нам доступны две возможные стратегии:

zz Стратегия 1. Потратить больше времени на поиск решения, наиболее близ­ кого к оптимальному, чтобы i оказалось как можно меньше.

zzСтратегия 2. Минимизировать алгоритмические затраты Ωi и на скорую руку выбрать работоспособное решение.

Жадные алгоритмы основаны на второй стратегии, в которой мы не прилагаем усилий для поиска наилучшего решения и вместо этого минимизируем затраты алгоритма.