Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и анализ сложности Пособие.doc
Скачиваний:
130
Добавлен:
12.01.2017
Размер:
539.14 Кб
Скачать

7.3 Анализ алгоритма точного решения задачи о сумме

Рассмотрим лучший и худший случай для данного алгоритма:

а) В лучшем случае, когда последний элемент массива совпадает со значением V: V=S[N],необходимо выполнить только одно суммирование, что приводит к оценке: Faˇ(N)=Q(N);

б) В худшем случае, если решения вообще нет, то придется проверить все варианты, и Faˆ(N) = Q (N*2N).

Получим детальную оценку для худшего случая, используя принятую методику подсчета элементарных операций:

Faˆ(N) = 2+N*(3+2)+2+(2N-1)*{2+N*(3+5)+1+1+fcnt+2+2} (7.2)

Для получения значения fcnt - количества операций, необходимых для увеличения счетчика на «1» рассмотрим по шагам проходы цикла While, в котором выполняется эта операция:

CNT

Количество проходов в While

Операций

001

1

6+2

010

0

2

011

2

2*6+2

100

0

2

101

1

6+2

110

0

2

111

3

3*6+2

Таким образом:

fcnt = (1/2)*(2)+(1/2)*(2)+(1/2)*((1/2)*1*6+(1/4)*2*6+(1/8)*3*6+…) =

¥

k=1

=2 + 1/2 * 6 * (1/21+2/22+3/23+…) = 2+ 3 * (å k/2k);

Так как å k*xk = x/(1-x)2, [6]

то å k*(1/2)k = (1/2)/(1-(1/2))2 = 2, и, следовательно:

fCnt = 8 (! и не зависит от длины счетчика)

Подстановка fCnt в (7.2) дает:

FˆA(N) = 4+5*N+(2N-1)*(8*N+16), и окончательно:

A(N) =8*N*2N+16*2N-3*N-12,

что согласуется с асимптотической оценкой – формула (1).

7.4 Вопросы для самоконтроля

  1. Формулировка задачи о сумме;

  2. Асимптотическая оценка сложности алгоритма для прямого перебора;

  3. Алгоритм решения задачи о сумме;

  4. Подалгоритм увеличения на единицу двоичного счетчика;

  5. Оценки трудоемкости для лучшего и худшего случая;

  6. Функция трудоемкости алгоритма для решения задачи о сумме в худшем случае;

8. Рекурсивные функции и алгоритмы

8.1 Рекурсивные функции

а) Терминологическое введение

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

Под индукцией понимается метод доказательства утверждений, который строится на базе индукции при n=0,1, затем утверждение полагается правильным при n=n b и проводится доказательство для n+1.

Под рекурсией понимается метод определения функции через её предыдущие и ранее определенные значения, а так же способ организации вычислений, при котором функция вызывает сама себя с другим аргументом.

Термин рекуррентные соотношения связан с американским научным стилем и определяет математическое задание функции с помощью рекурсии.

Основной задачей исследования рекурсивно заданных функций является получение ¦(n) в явной или как еще говорят «замкнутой» форме, т.е. в виде аналитически заданной функции. В связи с этим рассмотрим ряд примеров:

б) Примеры рекурсивного задания функций

1.¦(0)=0

¦(n)= ¦(n-1)+1

Здесь нетрудно сообразить, что ¦(n)=n.

2. ¦(0)=1

¦(n)= n*¦(n-1)

Последовательная подстановка дает – ¦(n)=1*2*3*…*n = n!

Для полноты сведений приведем формулу Стирлинга для приближенного вычисления факториала для больших n:

n! » (2pn)1/2 *(nn)/(en)

3. ¦(0)=1

¦(1)=1

¦(n)= ¦(n-1)+ ¦(n-2), n³2

Эта рекурсивная функция определяет числа Фибоначчи: 1 1 2 3 5 8 13, которые достаточно часто возникают при анализе различных задач, в том числе и при анализе алгоритмов. Отметим, что асимптотически ¦(n)» [1,618n] [9].

4. ¦(0)=1

¦(n)= ¦(n-1)+¦(n-2)+…+1 = å¦(i)+1

Для получения функции в явном виде рассмотрим ее последовательные значения: ¦(0)=1, ¦(1)=2, ¦(2)=4, ¦(3)=8, что позволяет предположить, что¦(n)=2n, точное доказательство выполняется по индукции.

5. ¦(0)=1

¦(n)= 2*¦(n-1)

Мы имеем дело с примером того, что одна и та же функция может иметь различные рекурсивные определения – ¦(n)=2n, как и в примере 4, что проверяется элементарной подстановкой.

6. ¦(0)=1

¦(1)=2

¦(n)= ¦(n-1)*¦(n-2)

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

¦(2) = 2 = 21

¦(3) = 4 = 22

¦(4) = 8 = 23

¦(5) = 32 = 25

¦(6) = 256 = 28

Обозначив через Fn - n -ое число Фибоначчи, имеем: ¦(n)=2Fn.