880 likes | 1.15k Views
Основы анализа алгоритмов. Алгоритм - точное предписание, задающее процесс преобразования исходных данных в результаты. Свойства: Результативность Конечность Однозначность Массовость Детерминированность Эффективность. Обозначения. M – набор машинных инструкций, составляющих программу;
E N D
Алгоритм - точное предписание, задающее процесс преобразования исходных данных в результаты. • Свойства: • Результативность • Конечность • Однозначность • Массовость • Детерминированность • Эффективность
Обозначения • M – набор машинных инструкций, составляющих программу; • S – память для стека и хранения промежуточных результатов; • d(n) – набор входных данных; • D(n) = {d(n)} – множество всевозможных наборов входных данных; • Т = {t} – время выполнения программы;
Допущения • каждая машинная команда выполняется не более чем за фиксированное время; • рассматриваем правильные и финитные алгоритмы, т.е. алгоритмы, дающие единственное решение общей проблемы
В силу сделанных допущений • Для любого начального набора данных алгоритм выполняет не более, чем конечное количество «элементарных» операций абстрактной машины. • Под трудоемкостью Fdалгоритма для данного набора начальных данных – d(n), будем понимать количество «элементарных» операций (время их выполнения), соверша-емых алгоритмом для решения конкретной проблемы, в данной формальной системе.
Время выполнения программы t = c1* d(n) + c2 * M + c3 * S, здесь ci(d(n)) – «веса» ресурсов T^ = maxdD T – наихудший случай Tv = mindD T – наилучший случай Ť = Σ t /|T|–средний случай
Классификация алгоритмов по виду функции трудоёмкости • Параметрически-зависимые (порядко-независимые) Fd = f(n); T^ = Tv = Ť • Порядко-зависимые Fd = f(d,n); T^(d,n) Ť(n) Tv(d,n)
c2g(n) f(n) c1g(n) f,g n n0 Асимптотические оценки • (тета) f(n) и g(n): c1,c2,n0:n>n0 c2*g(n)f(n)c1*g(n) f(n) = ( g(n) ) Ex: F(x) = 4x2+ sin(x) = (x2)
cg(n) f(n) Асимптотические оценки • O (О большое) f(n) и g(n): c,n0:n>n0 c*g(n)≥f(n)>0 f(n) = O( g(n) ) Ex: F(x) = 4x2+ x = O(x2)
F(n) cg(n) Асимптотические оценки • Ω (Омега) f(n) и g(n): c,n0:n>n0 f(n) c*g(n) 0 f(n) = Ω( g(n) ) Ex: Ω( x*ln(x) ) – класс функций, которые растут не медленнее, чем x*ln(x)
Сравнение времен выполнения алгоритмов 1 мин
Казни Иосифа • n = 10 • m = 3 • k = 1
Казни Иосифа • n = 10 • m = 3 • k = 2
Казни Иосифа • n = 10 • m = 3 • k = 3 3
Казни Иосифа • n = 10 • m = 3 • k = 4 • 3
Казни Иосифа • n = 10 • m = 3 • k = 5 • 3
Казни Иосифа • n = 3 • m = 10 • k = 6 • 3 6
Казни Иосифа • n = 3 • m = 10 • k = 7 • 3 6
Казни Иосифа • n = 3 • m = 10 • k = 8 • 3 6
Казни Иосифа • n = 3 • m = 10 • k = 9 • 3 6 9
Казни Иосифа • n = 10 • m = 3 • k = 10 • 3 6 9
Казни Иосифа • n = 10 • m = 3 • k = 11 • 3 6 9
Казни Иосифа • n = 10 • m = 3 • k = 12 • 3 6 9
Казни Иосифа • n = 10 • m = 3 • k = 13 • 3 6 9 2
Казни Иосифа • n = 10 • m = 3 • k = 14 • 3 6 9 2
Казни Иосифа • n = 10 • m = 3 • k = 15 • 3 6 9 2
Казни Иосифа • n = 10 • m = 3 • k = 16 • 3 6 9 2
Казни Иосифа • n = 10 • m = 3 • k = 17 • 3 6 9 2
Казни Иосифа • n = 10 • m = 3 • k = 18 • 3 6 9 2 7
Казни Иосифа • n = 10 • m = 3 • k = 19 • 3 6 9 2 7
Казни Иосифа • n = 10 • m = 3 • k = 20 • 3 6 9 2 7
Казни Иосифа • n = 10 • m = 3 • k = 21 • 3 6 9 2 7
Казни Иосифа • n = 10 • m = 3 • k = 22 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 23 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 24 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 25 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 26 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 27 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 28 • 3 6 9 2 7 1
Казни Иосифа • n = 10 • m = 3 • k = 29 • 3 6 9 2 7 1 8
Казни Иосифа • n = 10 • m = 3 • k = 30 • 3 6 9 2 7 1 8
Казни Иосифа • n = 10 • m = 3 • k = 34 • 3 6 9 2 7 1 8
Казни Иосифа • n = 10 • m = 3 • k = 35 • 3 6 9 2 7 1 8
Казни Иосифа • n = 10 • m = 3 • k = 36 • 3 6 9 2 7 1 8 5
Казни Иосифа • n = 10 • m = 3 • k = 40 • 3 6 9 2 7 1 8 5
Казни Иосифа • n = 10 • m = 3 • k = 40 • 3 6 9 2 7 1 8 5
Казни Иосифа • n = 10 • m = 3 • k = 44 • 3 6 9 2 7 1 8 5
Казни Иосифа • n = 10 • m = 3 • k = 50 • 3 6 9 2 7 1 8 5
Казни Иосифа • n = 10 • m = 3 • k = 51 • 3 6 9 2 7 1 8 5 10
Казни Иосифа #include <iostream.h> const int n=1000,m=1000; void main(void) { long s=0; int a[n],i,j=0,k=m; for(i=0;i<n;i++) a[i]=i+1; for(i=0;i<n-1;i++,k=m) { while(k) { if(a[j]) --k; j=j==n-1?0:j+1; s++; } a[(j?j:n)-1]=0; } for(i=0; i<n; i++) if(a[i]) break; cout << n << ' ' << m << '\t' << a[i] << '\t' << s << '\n';}