Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоцровневые методы информатики и првые методы информатики и программированияограммирования.doc
Скачиваний:
332
Добавлен:
01.05.2014
Размер:
14.7 Mб
Скачать

2.3.2 Анализ времени работы алгоритмов «разделяй и властвуй»

Как оценить время работы рекурсивного алгоритма? При подсчёте требуется учитывать время, затрачиваемое на рекурсивные вызовы, так что получа­ется некоторое рекуррентное соотношение (recurrence equation). Далее следует оценить время работы, исходя из этого соотношения.

Предположим, что алгоритм разбивает за­дачу размера п на а подзадач, каждая из которых имеет в b раз меньший размер. Будем считать, что разбиение требует времени D(n), а соединение полученных решений – времени С(п). Тогда получаем соотношение для времени работы Т(п) на задачах размера п (в худшем случае):

Т(п) = a·T(/ b) + D(n) + С(п).

Это соотношение выполнено для достаточно больших n, когда задачу имеет смысл разбивать на подзадачи. Для малых n, когда такое разбиение невозможно или не нужно, применяется один из прямых методов решения задачи. Поскольку n огра­ничено, время работы тоже не превосходит некоторой константы.

2.3.2 Анализ времени работы сортировки слиянием через рекуррентное соотношение

Для простоты будем предполагать, что размер массива есть степень двойки. Тогда на каждом шаге сортируемый участок делится на две равные половины. Разбиение на части (вычисление границы) требует времени Θ(1), а слияние – времени Θ(n). Получаем соотношение

Это соотношение влечёт T(n) = Θ(nlog n), где через log обозначается двоичный логарифм (основание логарифмов, впрочем, не играет роли, так как приводит лишь к изменению константы). Поэтому для больших n сортировка слиянием эффективнее сортировки вставками, требующей времени (n2).

2.3.3 Анализ времени работы сортировки слиянием через геометрическую интерпретацию

На каждом из уровней рекурсии количество сортируемых элементов не изменяется. Известно также, что при слиянии отсортированных массивов каждый элемент проходит через «соревнование» курсоров, копируясь в целевой массив. Это означает, что суммарные затраты на перемещение элементов разными ветками рекурсии по срезу одной глубины будут равны. Если отбросить связи между элементами в рассматриваемом дереве рекурсии, то оно может быть вписано в прямоугольник с основанием шириной n (размер входа, т.е. количество элементов исходного массива), где n – количество элементов на входе алгоритма. Высота же прямоугольника будет равна высоте дерева, т.е. log n. Таким образом, временные затраты на обратный ход рекурсии составят n · log n. Прямой ход рекурсии не требует столь большого количества вычислительных ресурсов (там нет перемещения элементов из массива в массив), но, тем не менее, количество вызовов прямо пропорционально объему массива, а, следовательно, также описывается как n · log n, пусть и с меньшей константой. Аналогичным способом может оцениваться время работы любой сортировки сравнениями, работающей по принципу «разделяй и властвуй».

n0 n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14 n15

n0 n1 n2 n3 n4 n5 n6 n7

n8 n9 n10 n11 n12 n13 n14 n15

n0 n1 n2 n3

n4 n5 n6 n7

n8 n9 n10 n11

n12 n13 n14 n15

n0 n1

n2 n3

n4 n5

n6 n7

n8 n9

n10 n11

n12 n13

n14 n15

n0

n1

n2

n3

n4

n5

n6

n7

n8

n9

n10

n11

n12

n13

n14

n15

Рисунок 2.3 – Геометрическая интерпретация алгоритма сортировки слиянием