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

6. Разработка эффективных алгоритмов: методы «Разделяй и влавствуй» и «Балансировки».

Одна из самых конструктивных идей состоит в разложении задачи “размерности” 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 или менее меньших умножений. Другой тип рекуррентных соотношений возникает в случае, когда работа по разбиению задачи на не пропорциональна ее размеру.

Балансировка (уравновешивание)

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

Метод “разделяй и властвуй” – не единственная техника, при использовании которой полезна балансировка для разработки эффективных алгоритмов. Например, эффективные алгоритмы получаются в результате балансировки размеров поддеревьев или весов операций.

Для иллюстрации принципа уравновешивания приведем два алгоритма сортировки и сопоставим эффекты от разбиения задачи на подзадачи неравных и равных размеров.

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

1) Алгоритм “пузырьковой сортировки”. Поскольку при исследовании последовательности сначала ищется наименьший (наибольший) элемент и меняется с первым (с последним), а затем процесс повторяется на остальных n-1 элементах, то этот алгоритм приводит к рекуррентному соотношению вида

для числа сравнений, произведенных между сортируемыми элементами. Решением для (13) служит T(n) = n(n–1)/2, что составляет O(n2).

Хотя этот алгоритм можно считать рекурсивным применением приема “разделяй и властвуй” с разбиением задачи на неравные части, он не эффективен для больших n. Для разработки асимптотически эффективного алгоритма сортировки надо позаботиться о сбалансированности. Вместо того, чтобы разбивать задачу размера n на две подзадачи, одна из которых имеет размер 1, а другая – размер n–1, надо разбить ее на две подзадачи с размерами примерно n/2. Это выполняется методом, известным как сортировка слиянием.

2) Алгоритм сортировки слиянием. Метод слияний - один из самых первых методов, предназначенных для сортировки на ЭВМ; он был придуман фон Нейманом еще в 1945 г В основе этого метода лежит идея, согласно которой слияние двух отсортированных списков выполняется быстро. Список из одного элемента уже отсортирован, поэтому сортировка слиянием разбивает список на одноэлементные куски, а затем постепенно их сливает. Поэтому вся деятельность заключается в слиянии двух списков.

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

решением которого по теореме 1 является T(n) = O(nlogn).

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

Сортировка слиянием особенно интересна для структур данных, отличных от массивов. Но следует помнить, что для слияния списков требуется дополнительная память.