Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации лекций по ТОИ / 10-Сложность алгоритмов.pps
Скачиваний:
64
Добавлен:
02.06.2015
Размер:
449.02 Кб
Скачать

Оценка рекурсивных алгоритмов (простая рекурсия)

В общем случае для простой рекурсии (алгоритм ) можно построить следующее рекуррентное соотношение:

T (Vin) = TCond (Vin ,S) + (TH (Vin) + T (f(Vin)) + Tf (Vin)), где TCond (Vin ,S) – сложность проверки условия;

Tf (Vin) – сложность вычислений, понижающих сложность исходных данных; T (f(Vin)) – сложность операций, выполняемых при рекурсивном

вызове с новыми данными («упрощенными») данными;

 

TH (Vin) – сложность вычислений, выполняемых каждый раз при выборе

 

рекурсивной ветви, но не связанных с рекурсивным вызовом или

 

понижением сложности данных.

 

Это – уравнение для T (Vin). Его можно решить, используя известное

 

начальное условие, которое описывает сложность выбора и выполнения

 

нерекурсивной ветви:

31

T (S) = TCond (S, S) + TD (S).

 

Оценка рекурсивных алгоритмов (простая рекурсия)

В общем случае получаем систему:

T (Vin) = TCond (Vin ,S) + (TH (Vin) + T (f(Vin)) + Tf (Vin)) T (S) = TCond (S, S) + TD (S).

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

32

Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала

Рассмотри решение системы для частного случая – для вычисления факториала (Factorial(X)) при X≥0:

function Factorial (X: integer): integer; begin

if X = 0 then Factorial := 1

else Factorial := Factorial(X–1)*X

end;

Выделим в данном коде перечисленные выше фрагменты, определяющие сложность вычислений

33

Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала

Рекурсивная

ветвь

T (f(Vin) = ?

Tf (Vin) = 1

 

(операция –)

TCond (Vin ,S) = 1

(операция =)

34

TH (Vin) = 1+1 = 2

(операции * и :=)

Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала

Нерекурсивная

ветвь

TCond (S , S) = 1

(операция =)

 

TD (S) = 1

35

(операция :=)

 

Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала

Получаем систему:

T (X) = TCond (0 ,0) + (TH (Xn) + T (X–1) + Tf (X–1)) T (0) = TCond (0, 0) + TD (0)

Делаем подстановку сложности выделенных фрагментов алгоритма: T (X) = 1 + (2 + T (X–1) + 1)

T (0) = 1 + 1 Получаем:

T (X) = 4 + T (X–1) T (0) = 2

36

Оценка рекурсивных алгоритмов (простая рекурсия). Пример – оценка сложности функции вычисления факториала

Рассмотрим первое уравнение (рекуррентное) для данного случая: T (X) = 4 + T (X–1) =

=4 + (4 + T (X–2)) =

=4 + (4 + (4 + T (X–3))) = … =

=4 + (4 + (4 + … + (4 + T (1))…)) =

=4 + (4 + (4 + … + (4 + (4 + T (0)))…)) =

=4 + (4 + (4 + … + (4 + (4 + 2))…)) = 4 X + 2

Получили итоговую оценку сложности алгоритма: T (X) = 4 X + 2

37

Пример – оценка сложности итерационной функции вычисления факториала

Оценка сложности итерационного алгоритма function Factorial (X: integer): integer;

var M, I: integer;

begin

M := 1;

for I := 2 to X do M := M*I; Factorial := M

end;

будет следующей:

T (X) = 1 + (X – 1) (1+1) + 1 = (X – 1) 2 + 2 = X 2

38

Понятие задачи и классы сложности задач

Под задачей понимается некоторый вопрос, на который нужно найти (вычислить) ответ.

Задачи бывают общие (массовые - сравните со свойством алгоритма) и частные (индивидуальные).

 

Общая задача определяется

 

1)

списком параметров - свободных переменных, конкретные

 

значения которых не определены;

 

2)

формулировкой условий - свойств, которыми должен

 

обладать ответ (решение задачи).

 

Частная задача получается из общей задачи, если всем

 

параметрам общей задачи придать конкретные значения (задать

39

исходные данные). Для алгоритма мы сказали бы: на место

формальных параметров подставить фактические.

Понятие задачи и классы сложности задач

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

Сложность самого простого из алгоритмов решения задачи можно считать сложностью задачи.

Процесс поиска для данной задачи алгоритма минимальной сложности был назван оптимизацией алгоритма. К сожалению, в

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

40