Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Глава 4
ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
129
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
4.1.2. Асимптотика
1 x2
роста функций. Говорят, что при х функция "ведёт себя, как х",
x
или "возрастает с такой же скоростью, как х", и при х0 "ведёт себя, как
1/x". Говорят, что "logx при x0 и любом >0 ведёт себя, как x, и что
n
log i при n растёт не быстрее, чем nlogn". Такие неточные, но
i 1
lim f ( x)
только если x x0 g( x )
=1.
=0.
Говорят, что при xx0 f(x) растёт медленнее, чем g(x), или что f(x)
"есть о-малое" от g(x).
Определение 3. f(x)=О(g(x)) при xx0, если и только если
130
О.Н. Паулин. Основы теории алгоритмов
lim f ( x)
существует константа С такая, что sup x x0 g( x )
=С.
В этом случае говорят, что f(x) растёт не быстрее, чем g(x), или что
при xx0 f(x) "есть О-большое" от g(x).
Cоотношение f(x)=g(x)+o(h(x)) при x означает, что f(x)-g(x)=o(h(x)).
Аналогично f(x)=g(x)+О(h(x)) означает, что f(x)-g(x)=О(h(x)).
Выражения О() и о() могут использоваться также и в неравенствах.
Например, неравенство x+o(x)2x при x0 означает, что для любой
функции f(x) такой, что f(x)=o(x), при x имеет место соотношение
x+f(x)2x для всех достаточно больших значений х.
Приведём некоторые полезные асимптотические равенства.
Полином асимптотически равен своему старшему члену:
k
a i x i O ( x k ) при x; (4.1)
i 0
k
a i x i o( x k 1) при x; (4.2)
i 0
k
a i x i ~ a k ( x k ) при x и ak0. (4.3)
i 0
131
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
132
О.Н. Паулин. Основы теории алгоритмов
133
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
134
О.Н. Паулин. Основы теории алгоритмов
n
(1 x )n C rn x r . (4.17)
i 0
135
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
136
О.Н. Паулин. Основы теории алгоритмов
137
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
138
О.Н. Паулин. Основы теории алгоритмов
4.3.1. Рекурсия
139
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
140
О.Н. Паулин. Основы теории алгоритмов
141
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
142
О.Н. Паулин. Основы теории алгоритмов
begin
COT := 1 ;
ND := RT;
STK := 0;
L: while LES[ND] 0 do
begin
PUSH; (* затолкнуть узел в стек *)
ND := LES[ND]
end;
C: NUM[ND] := COT;
COT := COT +1;
if RIS[ND] 0 then
begin
ND := RIS[ND];
goto L;
end;
143
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
if STK 0 then
begin
ND := ETS; (*ETS - номер элемента в вершине стека*)
POP; (* вытолкнуть узел из стека *)
goto C;
end
end.
144
О.Н. Паулин. Основы теории алгоритмов
145
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
146
О.Н. Паулин. Основы теории алгоритмов
procedure P;
begin
if I<n then
begin
I := I+1; F := F*I; P
end
end. (4.29)
function F(I);
begin
if I>0 then F(I) := F(I-1)*I
else F(I) := 1
end. (4.30)
I := 0; F := 1;
while I<n do
begin
147
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
I := I+1; F := F*I
end. (4.31)
function Fib(n);
begin
if n=0 then Fib(n) := 0 else
if n=1 then Fib(n) := 1 else
Fib(n) := Fib(n-1) + Fib(n-2)
еnd. (4.34)
148
О.Н. Паулин. Основы теории алгоритмов
begin
z := x; i := i+1;
x :=x+y; y := z
end.
149
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
150
О.Н. Паулин. Основы теории алгоритмов
151
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
числа с, является
O(n), если a < c
T (n) O(n log 2 n), если a = c . (4.37)
O(nlogc a), если а > c
Из теоремы вытекает, что разбиение задачи размера n (за линейное
время) на две подзадачи размера n/2 даёт алгоритм сложности О(nlog2n).
Если бы подзадач было 3, 4 или 16, то получился бы алгоритм сложности
порядка nlog23 , n2 или n4 соответственно. С другой стороны, разбиение
задачи на 4 подзадачи размера n/4 даёт сложность порядка nlog2n, а на 9 и
16 - порядка n log 2 3 и n2 соответственно.
Если n не является степенью числа С, то обычно можно вложить
задачу размера n в задачу размера n', где n' - наименьшая степень числа
С, большая n. Поэтому порядки роста, приведенные в теореме 4.1,
сохраняются для любого n. На практике часто можно разработать
рекурсивные алгоритмы, разбивающие задачи произвольного размера на
С равных частей, где С велико, насколько возможно. Эти алгоритмы, как
правило, эффективнее (на постоянный множитель) тех, которые
получаются путем представления размера входа в виде ближайшей
сверху степени числа С.
152
О.Н. Паулин. Основы теории алгоритмов
153
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
подпоследовательности х1, х2, ... , хn/2 и xn/2+1, ... , хn, упорядочить каждую
из них и затем слить их. Под “слиянием” понимают объединение двух уже
упорядоченных последовательностей в одну упорядоченную
последовательность.
Алгоритм 4.4. Сортировка слиянием
ВХОД. Последовательность чисел х1, x2,..., хn, где n - степень числа 2.
ВЫХОД. Последовательность чисел у1, y2,..., уn, которая является
перестановкой входа и удовлетворяет неравенствам y1y2...yn .
МЕТОД. Применим процедуру MERGE(S, Т) (merge - слияние),
входом которой служат две упорядоченные последовательности S и Т, а
выходом - последовательность Q элементов из S и Т, расположенных в
порядке неубывания. Поскольку S и Т упорядочены, MERGE требует
сравнений не больше, чем сумма длин S и Т без единицы (|S| + |T| -1).
Работа этой процедуры состоит в выборе большего из наибольших
элементов, остающихся в S и Т, и в последующем удалении выбранного
элемента и перезаписи его в Q. В случае совпадения можно отдавать
предпочтение последовательности S. Кроме того, применяется процедура
SORT(i, j) (см. ниже), сортирующая подпоследовательность xi, xi+1, ... , xj в
предположении, что она имеет длину 2k для некоторого k0. Для
сортировки исходной последовательности вызывается процедура
SORT(1, n).
procedure SORT(i, j)
if i=j then return xi
else
begin
m(i+j-1)/2;
return MERGE(SORT(i, m), SORT(m+1, j))
end.
154
О.Н. Паулин. Основы теории алгоритмов
155
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
156
О.Н. Паулин. Основы теории алгоритмов
157
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
end
end
until удачно (k=m)
end.
4.4. Построение и анализ алгоритма
158
О.Н. Паулин. Основы теории алгоритмов
159
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
160
О.Н. Паулин. Основы теории алгоритмов
161
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
Осуществление плана
162
О.Н. Паулин. Основы теории алгоритмов
Взгляд назад
163
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
постановка задачи;
построение модели;
разработка алгоритма;
проверка правильности алгоритма;
реализация алгоритма;
анализ алгоритма и его сложности;
написание программы на подходящем языке;
отладка программы;
составление документации.
Постановка задачи
164
О.Н. Паулин. Основы теории алгоритмов
Построение модели
165
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
Разработка алгоритма
166
О.Н. Паулин. Основы теории алгоритмов
Правильность алгоритма
167
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
Реализация алгоритма
168
О.Н. Паулин. Основы теории алгоритмов
169
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
170
О.Н. Паулин. Основы теории алгоритмов
171
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
172
О.Н. Паулин. Основы теории алгоритмов
173
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
1.5*2N-1 = O(2N).
Итак, оценкой временной сложности является T(N) = O(2N).
Ёмкостная сложность Е(N)
174
О.Н. Паулин. Основы теории алгоритмов
175
Глава 4. ПОСТРОЕНИЕ И АНАЛИЗ АЛГОРИТМОВ
Заключение
176
О.Н. Паулин. Основы теории алгоритмов
177