Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
21
Добавлен:
25.04.2015
Размер:
5.79 Кб
Скачать
{$mode objfpc}

var i, j, n: integer;
a: array of integer;
//a[i] = 1 - число зачёркнуто

begin
read(n);
setlength(a, n+1);

for i := 2 to n do begin
if a[i] = 1 then continue;
write(i, ' ');
j := 2*i;
while j <= n do begin O(nlnn) e-maxx.ru
a[j] := 1;
j += i;
end;
end;

writeln();
end.

{
II. Алгоритмы и структуры данных: построение и анализ
Кормен, Лейзерсон, Ривест, Штайн
ocw.mit.edu SMA5503

Алгоритм - формальная вычислительная процедура.
Т.е. последовательность шагов, которая получает результат по входным данным
Как соотносятся алгоритм и программа? Программа - это реализация алгоритма.

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

Задача: на входе a_1, a_2, ..., a_n - последовательность чисел.
Необходимо получить её перестановку a_1', a_2', ..., a_n',
такую что a_1' <= a_2' <= ... <= a_n'.

Сортировка вставками.

var i, j, n, key: integer;
a: array [1..100] of integer;

begin
read(n);
for i := 1 to n do
read(a[i]);

for i := 2 to n do begin
c_1 key := a[i];
c_2 j := i;
c_3*t_i while (j > 1) and (a[j-1] > key) do begin
c_4*(t_i-1) a[j] := a[j-1];
c_5*(t_i-1) dec(j);
end;
c_6 a[j] := key;
end;

for i := 1 to n do begin
write(a[i], ' ');
end;
writeln();
end.

Если последовательность уже отсортирована (лучший случай), то t_i = 1 для всех i из 2..n
Если последовательность отсортирована в обратном порядке (худший случай) t_i = i-1
Время работы алгоритма в лучшем случае: (n-1)(с_1 + с_2 + с_3 + с_6)
Время работы алгоритма в худшем случае: (n-1)(с_1 + с_2 + с_6) + c3*(n-1) + (c3+c4+c5)(n-2)*(n-1)/2
Время работы алгоритма в среднем случае: сейчас не будем

1. время работы бывает: в лучшем, в худшем, в среднем.
при этом "в среднем" и "в худшем" может отличаться слабо.
2. консанты c_k различны для различных компьютеров,
поэтому при анализе работы алгоритма мультипликативные константы будем отбрасывать.
3. нужно считать колчество дейсвий, полагая, что каждое действие RAM-машины занимет константное кол-во времени.

Асимптотический анализ времени работы

f(n) = (n-1)(с_1 + с_2 + с_6) + c3*(n-1) + (c3+c4+c5)(n-2)*(n-1)/2
g(n) = n^2

lim f(n)/g(n) = (с3+с4+с5)/2

f(n) - истинное время работы программы
g(n) - выражение, которым мы будем аппроксимировать время работы программы
f(n) и g(n) должны одинаково (с точностью до мультипликативной константы) расти при n -> inf

f(n) = O(g(n)) <=> (def, n->inf) E n_0, c>0: A n>n_0: f(n) <= c*g(n)
например
An^2 + Bn + C = O(n^2) т.к. в качестве "c" нужно взять A + eps
An^2 + Bn + C = O(n^3)
An^2 + Bn + C = O(n^4)

f(n) = omega(g(n)) <=> (def, n->inf) E n_0, c>0: A n>n_0: f(n) >= c*g(n)

f(n) = theta(g(n)) <=> (def, n->inf) E n_0, c1>0, c2>0: A n>n_0: c_1*g(n) <= f(n) <= c_2*g(n)


(n-1)(с_1 + с_2 + с_6) + c3*(n-1) + (c3+c4+c5)(n-2)*(n-1)/2 = Theta(n^2)

Следствия:
1. Если количество действий в алгоритме оценивается как многочлен
a_k*n^k + a_(k-1)*n^(k-1) + ... + a_0, то можно сказать,
что время работы алгоритма есть O(n^k).
2. Если время работы некоторого алгитма занимает фиксированное время,
то можно сказать, что это есть O(1).

Время работы сортировки пузырьком есть O(n^2).
Время работы сортировки вставками есть тоже O(n^2), но константа 1/2, и то, это оценка сверху
Время работы сортировки обменом есть O(n^2), и константа 1/2

Сортировка слиянием
6 1 4 | 3 5 2
1 4 6 | 2 3 5
1 2 3 4 5 6

........*********************|...........................

T(n) - количество действий для сортировки массива из n чисел
T(1) <= k
T(n) <= T(floor(n/2)) + T(ceil(n/2)) + k*n
n T(n)
1 k
2 k + k + 2k = 4k
3 T(2) + T(1) + 3k = 8k
4 T(2) + T(2) + 4k = 12k
5 T(2) + T(3) + 5k = 17k
6 T(3) + T(3) + 6k = 22k

T(n) = O(nlogn)

Карманная сортировка
O(m+n), где m - максимальное число в массиве

f(n, m) = O(g(n, m)) <=> def (n, m -> inf) Ex n0, m0, c >0: All n>n0, m>m0: f(n, m) <= c*g(n, m)

O(n^2) O(n+m) O(nlogn)

}