книги / Математическая логика и теория алгоритмов. Анализ алгоритмов
.pdfсоздатель и заведующий кафедрой математического обеспечения вычислительных систем (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