Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора информатика.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.68 Mб
Скачать

8. Разработка эффективных алгоритмов: методы жадные алгоритмы. Задача о выборе заявок. Принцип жадного выбора.

Одна из самых конструктивных идей состоит в разложении задачи “размерности” n на одну операцию некоторой сложности, например, O(n) или O(1), и похожую задачу размерности m, меньшей n, или в общем случае на k задач с размерностями m1, m2, …, mk таких, что m1+ m2 + …+mk £n. Эта идея открывает путь к решению многих задач. Из нее исходят, в частности, почти все методы сортировки.

Теорема 1. Пусть a, b, c – неотрицательные постоянные. Решение рекуррентных уравнений

где n - степень числа c, имеет вид:

Из этой теоремы вытекает, что разбиение задачи размера n (за линейное время) на две подзадачи размера n/2 дает алгоритм сложности O(nlogn): a = c = 2. Если бы подзадач было 3, 4 или 8 (c=2, a=3>2, a=4>2, a=8>2 ), то получился бы алгоритм сложности порядка nlog3, n2 и n3 соответственно.

С другой стороны, разбиение задачи на 4 подзадачи размера n/4 дает алгоритм сложности O(nlogn): a = c = 4. Если бы подзадач было 9 и 16 (c=4, a=9>4, a=16>4) – порядка nlog3 и n2 соответственно.

Поэтому асимптотически более быстрый алгоритм умножения целых чисел можно было бы получить, если бы удалось так разбить исходные целые числа на 4 части, чтобы суметь выразить исходное умножение через 8 или менее меньших умножений. Другой тип рекуррентных соотношений возникает в случае, когда работа по разбиению задачи на не пропорциональна ее размеру.

Жадные алгоритмы. Задачи выбора объединяют огромное множество ситуаций, возникающих в повседневной жизни. Все эти задачи имеют следующие характерные общие свойства:

конечность множества вариантов выбора (например, путей между городами, способов расположения деталей);каждому варианту сопоставляется количественная характеристика (например, суммарное время работы, вес предметов в каждой из двух частей);требуется выбрать вариант, который обладает тем свойством, что его числовая характеристика удовлетворяет некоторому заранее сформулированному условию, или ответить на вопрос о существовании такого варианта (при этом нужен лишь один вариант, а иногда – все такие варианты или не сам вариант, а лишь значение его числовой характеристики); очень часто требуется, чтобы эта характеристика достигала экстремума на выбранном варианте – такие задачи выбора называются экстремальными задачами выбора.

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

Большое количество задач выбора связано с организацией вычисления на ЭВМ элементарных функций, с хранением, поиском и представлением данных в памяти компьютера, т.е. с задачами поиска, сортировки и порождения объектов. Построено множество изящных и хитроумных способов решения таких задач.

Множество вариантов выбора должно быть «хорошо» описано в условии задачи. Очень часто для этой цели используется традиционный способ: варианты определяются как подмножества некоторого конечного множества, удовлетворяющие фиксированному набору свойств. В этом случае варианты выбора называют траекториями.

Градиентный алгоритм – в некотором смысле самый простой алгоритм решения задачи выбора: каждый раз из множества выбирается наилучший из оставшихся элементов и достраивается, если это возможно, решение с помощью этого элемента. Отсюда другое название градиентного алгоритма – жадный алгоритм (greedy algorithmus).

Для многих оптимизационных задач есть более простые и быстрые алгоритмы, чем динамическое программирование.

Жадные алгоритмы, как и динамическое программирование, применяются в тех случаях, когда искомый объект строится по частям. Такой алгоритм делает на каждом шаге локально оптимальный выбор, - в надежде, что итоговое решение также окажется оптимальным. Например, стараясь набрать данную сумму денег минимальным числом монет, можно последовательно брать монеты наибольшего возможного достоинства (не превосходящего той суммы, которую нужно набрать).