Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Математическая логика и теория алгоритмов. Анализ алгоритмов

.pdf
Скачиваний:
3
Добавлен:
12.11.2023
Размер:
8.87 Mб
Скачать
Александр Иванович Миков
(род. 1949 г., Пермь)

создатель и заведующий кафедрой математического обеспечения вычислительных систем (1991–2003) механико-математического факультета Пермского государственного университета, заведующий кафедрой вычислительных технологий Кубанского университета (с 2003 г.).

Сложность – это один из элементов качества, эффективности алгоритмов. Кроме этого рассматривают также другой важный показатель – надёжность алгоритмов

(программ). Один из вариантов повышения надёжности (точнее, достоверности) – решение задачи разными алгоритмами со сравнением результатов.

Такой подход используется в так называемых гарантоспособных (dependability) вычислениях, который развивается в харьковскойнаучнойшколеподруководствомпрофессораВ.С.Харченко.

В.С. Харченко, профессор, заведующий кафедрой компьютерных систем и сетей ХАИ – Харьковского авиационного института (университета)

21

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

Применяется также следующий показатель – area-time- squared complexity (произведение площади требуемого кристалла микросхемы на квадрат времени выполнения алгоритма как функ- цияразмерностизадачи)–поверхностно-временнаясложность.

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

22

1. АНАЛИЗ СЛОЖНОСТИ НЕРЕКУРСИВНОГО АЛГОРИТМА ПО ПРОГРАММЕ ИЛИ СХЕМЕ

Интуитивно под алгоритмом понимается процесс последовательного решения задачи, протекающей в дискретном времени так, что в каждый следующий момент времени система объектов алгоритма получается по определённому закону из системы объектов, имевшихся в предыдущий момент времени [1]. Интуитивно потому, что, строго говоря, понятие алгоритма сродни понятию множества, которое является неопределимым.

В соответствии с ГОСТ 19.781–74 алгоритм – это точное предписание исполнителю совершить определенную последовательность действий для достижения поставленной цели за конечное число шагов. При этом предполагается наличие исполнителя алгоритма – такого объекта, который «умеет» выполнять эти действия.

Алгоритм характеризуется или имеет следующие свойства [1] (иногда говорят, что это требования к алгоритмам):

1)элементарность шагов: решение задачи распадается на ряд шагов, каждый из которых является достаточно простым (его способен выполнить вычислитель, это, например, команды процессора или операторы языка высокого уровня, которые потом преобразуются компилятором в последовательность команд);

2)детерминированность: после выполнения очередного шага однозначно определено, что делать на следующем шаге;

3)массовость: алгоритм пригоден для решения всех задач из заданного класса.

23

1.1.ПРИМЕР АНАЛИЗА АЛГОРИТМА ВЫЧИСЛЕНИЯ ФАКТОРИАЛА ЧИСЛА Х (X >0,X ЦЕЛОЕ ЧИСЛО)

Вычисление факториалов (!) часто бывает необходимо при решении комбинаторных задач, в том числе задач анализа сложности алгоритмов.

Программа итеративного вычисления факториала (на языке высокого уровня) может иметь следующий вид [2]:

function Factorial (x: integer): integer;

var m, i: integer;

begin m := 1;

for i := 2 to x do

m := m*i;

Factorial := m;

end.

Считаем количество операций при учёте условной сложности каждой = одной условной единице (рис. 1.1).

24

Рис. 1.1. Вычисление факториала

Итак, количество операций следующее:

один раз выполняется оператор присваивания: m := 1;

тело цикла (умножение и присваивание) выполняется 2(х – 1) раз;

один раз выполняется присваивание Factorial := m.

Если сложность каждой элементарной операции считать равной единице, то временная сложность приведенного алгоритма будет следующей:

1 + 2 (х – 1) + 1 = 2х.

(1.1)

За параметр сложности принимаем x. Таким образом, имеем линейную сложность.

Имеется приближённая (асимптотическая) формула Стирлинга (также Муавра – Стирлинга) – формула для приближённого вычисления факториала числа n:

n!

2 n(n)n

,

 

 

(1.2)

 

 

 

 

e

 

 

 

 

причём

 

 

 

 

 

 

1

 

 

 

1

 

 

2 n(n)n e

 

 

n!

2 n(n)n e

 

.

(1.3)

12n 1

12n

e

 

 

e

 

 

 

 

 

 

 

 

 

25

Формула названа в честь Джеймса Стирлинга и Абрахама де Муавра.

ДжеймсСтирлинг

АбрахамдеМуавр

(JamesStirling,1692–1770)–

(AbrahamdeMoivre,1667–1754)–

шотландскийматематик

английскийматематик

 

французскогопроисхождения

Спомощью формулы Стирлинга можно подсчитать, что:

100! ≈ 9,33×10157;

1000! ≈ 4,02×102567;

10 000! ≈ 2,85×1035 659.

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

26

2. АНАЛИЗ СЛОЖНОСТИ РЕКУРСИВНЫХ АЛГОРИТМОВ

Рекуррентный – (лат. recurrens – возвращающийся). Реку́рсия (от лат. recurrere – «возвращаться») – самоповтор; метод определения понятия через само себя; включение некоторого объекта или события в само себя как части.

Рекурсивная функция – числовая функция числового аргумента, которая в своём определении содержит себя же.

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

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

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

f (0) 1;

(2.1)

 

f (x 1) f (x) (x 1).

 

Вычисляем: f (0) = 1, f (1) = f (0) 1 = 1, f (2) = f (1) 2 = 2,

f (3) = f (2) 3 = 6, …

 

Таким образом, (2.1) задает функцию факториала х:

 

f (x) = x!

(2.2)

Формула Стирлинга (1.2, 1.3) являет собой пример реше-

ния рекуррентного соотношения f (x 1) f (x) (x 1) с

пере-

менным коэффициентом (x 1).

27

2.1.РЕШЕНИЕ РЕКУРРЕНТНЫХ СООТНОШЕНИЙ

Рекуррентным называют соотношение, в котором для вычисления некоторого члена числовой последовательности используют значения предыдущих членов. Решением рекуррентного соотношения называют получение формулы, в которой значение функцииопределяетсяявнойзависимостьюотn.

В общем случае линейное рекуррентное соотношение с постояннымикоэффициентами имеет вид[3, 4]:

xn k ak 1xn k 1 ak 2xn k 2 .... a0xn ,

(2.3)

где ai (i = 0,1, 2…k–1) – постоянные коэффициенты, а x1, x2,…,xk – начальныезначениязаданнойпоследовательности(2.3).

Решение находим в виде:

xn pn .

(2.4)

Подставляя в исходное выражение (2.4), получаем полином k-й степени:

pn k a

 

pn k 1

a

pn k 2 .... a pn

 

k 1

 

 

 

k 2

 

 

 

0

(2.5)

pn (pk a

pk 1 a

 

pk 2 ... a ) 0.

 

 

 

 

 

k 1

 

 

k 2

 

o

 

Уравнение pk a

k 1

pk 1

a

 

pk 2 ... a

0 имеет k корней

 

 

 

k 2

 

 

o

 

 

p1, p2, …, pk (по основной теореме алгебры всякое уравнение имеетровностолькокорней,каковастепеньегостаршегочлена).

Тогда общее решение (2.3), удовлетворяющее (2.5) и начальным значениям, имеет вид:

k

 

xn ci pn ,

(2.6)

i 1

где неизвестные коэффициенты c корней p находят по начальным условиям, составляя соответствующую систему линейных уравнений [3].

28

Пример 1. Рассмотрим ряд Фибоначчи:

fn 2 fn 1 fn ,

(2.7)

f0 0; f1 1.

 

Берём:

 

fn pn ,

(2.8)

то есть

 

pn 2 pn 1 pn ,

 

pn 2 pn 1 pn 0,

(2.9)

pn (p2 p1 1) 0.

 

Воттуткакбынадо,чтобыудовлетворялоипервойчасти pn , ивторой:

(p2 p1 1)

Ибо мы хотим, чтобы fn pn , а тогда

f0 p0 0; f1 p1 1; f2 p2 1; f3 p3 2; f4 p4

И конструируем из корней:

f0 p0 c1 1 2 5 0 c2 1 2 5 0 0,

где

c1 c2 f0 0;

c1 c2 0;c1 c2.

Следовательно, получается не просто а fn c1p1n c1p2n ,

3... (2.10)

(2.11)

(2.12)

fn pn ,

1

c1

 

1 5

1

c2

 

1 5

1

1.

(2.13)

f1 p

 

 

 

 

 

 

 

 

 

2

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

29

Найдём коэффициенты, используя начальные условия для первой степени:

 

 

 

1

 

5 1

 

 

 

 

1

 

5

1

1

(2.14)

f1 1 c1

 

 

 

 

 

c2

 

 

 

 

 

p .

 

 

 

 

 

2

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таким образом, подставляя c1 c2 :

 

 

 

 

 

 

1 5

1

c1

 

1 5

1

1.

 

 

(2.15)

c1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Следовательно,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

c

 

 

 

 

1

 

 

 

 

 

 

 

1

 

 

 

 

1

,

(2.16)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

1 5

 

1

 

5 2 5

 

 

 

 

5

 

 

 

2

 

 

 

 

2

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

c

2

 

1

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Поэтому

 

1

 

1

5

n

 

 

1

 

1

5

n

 

 

fn

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

2

 

 

 

 

5

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(2.17)

 

1

 

5

n

 

 

1

 

 

5

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

fn

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Это и есть формула Бине, где

 

 

 

5 1

1,6180339887

34...

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

21

 

такназываемое«золотое»сечение.

Фибоначчи изучал свойства этого ряда. Интересно, что при делении каждого достаточно большого числа на следующее полу-

чают около 0,618 (89/144 =0,618; 55/89 =0,618; 34/55=0,618…);

результат деления «через одно число» приближен к 0,382

30