Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 5. Конспекты (12_06_19).rtf
Скачиваний:
61
Добавлен:
10.09.2019
Размер:
38.24 Кб
Скачать

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

Идеальным вариантом является алгоритм, который выбирает единственное правильное решение из нескольких альтернатив. Также имеет место принцип разделения. Но в каждой точке алгоритма есть данные для выбора одной из подзадач. Обычно это делается с учетом особенностей организации обрабатываемых данных или их избыточности.

Пример: бинарный поиск.

Основой жадных алгоритмов является принцип движения по линии наименьшего сопротивления к желаемому результату.

Полный перебор — исчерпывающий / комбинаторный.

Если неизвестна или не удается определить линии наименьшего сопротивления (маршрут), то остается полный перебор всех возможных вариантов решений задачи.

Динамическое программирование

В процессе порождения дерева рекурсивных вызовов возможно повторение подзадач с одними и теми же данными.

Если запоминать результат их выполнения, исключать повторное выполнение одних и тех же задач, то эффективность алгоритма может быть значительно увеличена.

Рекурсивное разделение

Идея алгоритма: разделяй и властвуй. Задача разбивается на идентичные подзадачи, результаты которых объединяются в общее решение.

Диапазон сложности: N ... N log N ... N2

Полный перебор

Идея алгоритма: хуже не бывает.

Диапазон сложности: 2N ... NN.

Динамическое программирование

Идея алгоритма: «дежавю». Запоминание результатов повторяющихся подзадач (как следствие, повышение производительности).

Диапазон сложности: разная.

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

Идея алгоритма: «рыцарь на распутье». Локальный выбор единственной из подзадач на каждом шаге с выходом на глобальное оптимальное решение.

Диапазон сложности: log N ... N.

Необходимое и достаточное условие для рекурсивного представления программ — необходимость обработки данных, имеющих рекурсивную структуру. Процедуры анализа рекурсивных структур наиболее эффективны, когда они сами по себе рекурсивны.

Если алгоритм, обрабатывающий набор некоторых данных, можно построить, разбивая эти данные на части и получая из этих частичных решений общее решение по всей совокупности данных, то данный прием называется «разделяй и властвуй». При его использовании, задачи следует разбивать на подзадачи одинаковой размерности (принцип равновесия). Если задача поставлена так, что её решением является выбор определенного варианта из некоторого множества возможных решений, то решение задачи определяется после некоторого конечного числа шагов: выбирая на каждом шаге вариант решения, мы удаляем часть данных из всего подлежащего обработке массива и пытаемся решить задачу на меньшем объеме данных.

Поиск решения завершается, когда либо заканчиваются данные (после очередного удаления), либо находятся решения на конечном наборе данных.

Если имеется рекурсивная схема некоторой функции, то существуют функции, которые легко можно определить нерекурсивно, но которые нельзя определить в терминах алгебраических выражений.

Основная идея динамического программирования: запоминание результатов решения повторяющихся подзадач, возникающих при поиске методом полного рекурсивного перебора с получением задач меньшей размерности.

Рекурсивная техника полезна, если задачу можно разбить на подзадачи за разумное время, а суммарный размер будет небольшим.

Если очевидное разбиение задачи размерности M сводит её к задаче M-1, то рекурсивный алгоритм, вероятно, имеет экспоненциальную сложность. Более эффективно использование динамического программирования.