- •Глава 1. Основы анализа алгоритмов §1. Интуитивное понятие алгоритма и его уточнение
- •§2. Меры сложности алгоритмов
- •§3. Асимптотический анализ оценки сложности алгоритмов
- •§4. Свойства асимптотических оценок функций.
- •Если и , то , т. Е.
- •§5. Практический анализ эффективности программ.
- •§6. Анализ рекурсивных программ. Рекуррентные отношения.
- •§7. Стратегия декомпозиции. Анализ сложности алгоритмов декомпозиции.
- •I. Мультипликативные управляющие функции
- •II. Другие управляющие функции.
§4. Свойства асимптотических оценок функций.
Теорема 1.
Если и , то , т. Е.
Если , то , т. е.
Если , то , т. е.
– правило произведений.
–правило сумм, где под функцией понимается функция такая, что =
Доказательство
Т. к. , то .
Т. к. , то по определению 1 §3 .
Пусть причем по определению 1 §3 . Пусть , причем .
Обозначим . Тогда .
Таким образом , т. е. и, таким образом, .
Пусть , . Тогда , причем по определению 1 §3
Пусть , ,
Пусть ,
Тогда , . Теорема доказана.
Замечание 1. Правило сумм (Теорема 1 (6)) используется для вычисления времени выполнения последовательных фрагментов программ.
Пусть два программных фрагмента и выполняются соответственно за время и . Время их последовательного выполнения
Лемма 1. Если существует конечный предел =k, то при .
Используя определение 1 §3 или лемму 1 можно доказать следующую теорему.
Теорема 2.
.
Пусть . Тогда
.
§5. Практический анализ эффективности программ.
Приведем общие правила анализа программ без определения констант пропорциональности:
Время выполнения операторов присваивания обычно имеет порядок .
Исключение составляют языки программирования, где можно присваивать большие массивы, вызывать функции в операторах присваивания.
Временная сложность программных фрагментов, выполняемых последовательно, оценивается а) при фиксированном количестве фрагментов с помощью правила сумм (см.Т.1§4): б) при количестве программных фрагментов, зависящем от n (в т.ч. в цикле, где число итераций зависит от n), применяется свойство: (1)
Время выполнения условных операторов if-then-else состоит из
а) времени вычисления логического выражения, стоящего после if (обычно это время ).
б) наибольшего из времен выполнения операторов групп then и else.
Время выполнения цикла – сумма времени выполнения всех итераций цикла, включая проверку условия прекращения (обычно ).
Для программ, содержащих несколько процедур, среди которых нет рекурсивных:
а) определить время выполнения процедуры , не имеющей вызовов других процедур (такая существует, например, это самая внутренняя из вложенных процедур);
б) определить время выполнения процедур, вызывающих эту процедуру и т. д.
в) определить время выполнения всех процедур найти время выполнения всей программы.
Пример 1. Проанализируем программу сортировки методом «пузырька». Массив А упорядочивается по возрастанию.
procedure bubble(var A: array[1..n] of integer)
var
i, j, temp : integer;
begin
(1) for i := 1 to n-1 do
(2) for j := n downto i + 1 do
(3) if A[j -1] > A[j] then
begin
{Переставляем местами A[j -1] и A[j ]}
(4) temp := A[j-1];
(5) A[j-1] := A[j];
(6) A[j] := Temp ;
end;
end
Пусть n – объем вводимых данных, т. е. количество элементов, подлежащих сортировке.
Проанализируем время выполнения программы, переходя от внутренних операторов к внешним.
Группа операторов присваивания (4)-(6) выполняется за время каждый (см. п.1). Вся последовательность (4)-(6) по правилу п.2 за время .
Для оператора if в строке (3) вычисление логического условия A[j -1] > A[j] требует времени (см. п. 3).
Наибольшее время выполнения имеет группа операторов then (4)-(6) - как показано выше, . Таким образом, время выполнения группы (3) – (6) требует времени .
Цикл (2)-(6) выполняется n-i раз, причем на каждом проходе группа операторов тела цикла (3)-(6) требует времени
Итого, применяя свойство (1), получим .
Цикл (1)-(6) выполняется n-1 раз при i от 1 до n-1, каждый раз тело цикла требует времени , таким образом, весь цикл, согласно свойству (1), выполнится за время
Полученная сумма является арифметической прогрессией, члены которой , , тогда сумма первых членов будет равна , то есть искомое время
Согласно правилам пп. 1-5 найдена эффективность, то есть асимптотическая временная сложность алгоритма в худшем случае.