Сложность алгоритмов

21
Шатилов Максим 271ПИ

Upload: baxter

Post on 16-Jan-2016

84 views

Category:

Documents


0 download

DESCRIPTION

Сложность алгоритмов. Шатилов Максим 271 ПИ. Модель вычислений. 1) a ← b 2) a + b , a * b , a – b , a / b 3) a [ i ], a [ i, j ] 4) a > b, a ≥ b, a ≤ b, a = b 5) and, or, not 6) if ( a > b ) {…} else {…}. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Сложность алгоритмов

Шатилов Максим 271ПИ

Шатилов Максим 271ПИ

Page 2: Сложность алгоритмов

Модель вычислений - это множество базовых операций, используемыхдля вычисления, а также относительные издержки их применения.

Модель вычислений - это множество базовых операций, используемыхдля вычисления, а также относительные издержки их применения.

При асимптотической оценке сложности вычислений, модель вычислений определяется через множество базовых операций, для каждой из которых известная ее цена.

При асимптотической оценке сложности вычислений, модель вычислений определяется через множество базовых операций, для каждой из которых известная ее цена.

1) a ← b

2) a + b, a * b,

a – b, a / b

3) a [ i ], a [ i, j ]

4) a > b, a ≥ b,

a ≤ b, a = b

5) and, or, not6) if (a > b) {…} else {…}

Page 3: Сложность алгоритмов

Алгоритм А:D – вход алгоритма;|D|= n – длина входа;

fa (D) – трудоемкость, т.е. число базовых операций, заданных алгоритмом A на входе D;

Va (D) – объем памяти, максимальное число ячеек модели вычислений, задействованных алгоритмом A на входе D;

Dn = { D | |D| = n};

fa^

(n) = max f (D) - худший случай ; D Є Dn

fav (n) = min f (D) – лучший случай;

D Є Dn

Page 4: Сложность алгоритмов
Page 5: Сложность алгоритмов

«хорошо» описывающая алгоритм функция

Аргументами данной функции могут быть

Ресурсные оценки – требования алгоритма к ресурса компьютера(оперативная память, процессор). Например, требования алгоритмак памяти могут быть представлены в виде:V(n)=Vio+Vдоп+Vexe+Vстек

гдеVio - память для чтения/записиVдоп - память, содержащая переменные алгоритмаVexe - код программыVстек - память, выделенная для стека.

Информационная чувствительностьРазмах варьирования - fa

^ (n) - fa

v (n) = R(n);

Время выполнения.

Page 6: Сложность алгоритмов
Page 7: Сложность алгоритмов

f(n)=Θ(g(n))

Θ(g(n)) = { f(n): существуют положительные константы c1, c2 и n0

такие что 0≤ c1g(n)≤ f(n) ≤ c2g(n) для всех n≥ n0}

Θ(g(n)) = { f(n): существуют положительные константы c1, c2 и n0

такие что 0≤ c1g(n)≤ f(n) ≤ c2g(n) для всех n≥ n0}Функция g(n) является асимптотически точной оценкой функции f(n)

Функция g(n) является асимптотически точной оценкой функции f(n)

Page 8: Сложность алгоритмов

f(n) = О(g(n))

Функция g(n) является асимптотической верхней границей функции f(n)Функция g(n) является асимптотической верхней границей функции f(n)

O(g(n)) = { f(n): существуют положительные константы c1, c2 и n0

такие что 0≤ c1g(n)≤ f(n) ≤ c2g(n) для всех n≥ n0}

O(g(n)) = { f(n): существуют положительные константы c1, c2 и n0

такие что 0≤ c1g(n)≤ f(n) ≤ c2g(n) для всех n≥ n0}

Page 9: Сложность алгоритмов

Большую часть функций сложности можно разделить на следующие классы:

• O(1) – сложность типа константы• O(log(n)) – логарифмическая сложность• O(n) – линейная сложность• O(n log(n)) – сложность "n-log-n"• O(n2) – квадратичная сложность• O(n3) – кубическая сложность• O(2n) – экспоненциальная сложность

Функции f(x) и g(x) называются полиномиально-эквивалентнтными, если существуют такие полиномы p(x) и p’(x), что, (начиная с некоторого числа) f(x) p(g(x)) и g(x) p’(f(x)).

Page 10: Сложность алгоритмов

f1(n) Є O(n)f2(n) Є O(n2)

f3(n) Є O(log(n))

f4(n) Є O(n log(n))

f5(n) Є O(n3)

f6(n) Є O(2n)

Примечание: на рисунке изображены графики для маленьких n (0<n<10)

Page 11: Сложность алгоритмов

f1(n) Є O(n)f2(n) Є O(n2)

f3(n) Є O(log(n))

f4(n) Є O(n log(n))

f5(n) Є O(n3)

f6(n) Є O(2n)

Примечание: на рисунке изображены графики для средних n (0<n<6000)

Page 12: Сложность алгоритмов

f(n)=Ω(g(n))

Ω(g(n)) = { f(n): существуют положительные константы и n0

такие что 0≤ cg(n)≤ f(n) для всех n≥ n0}

Ω(g(n)) = { f(n): существуют положительные константы и n0

такие что 0≤ cg(n)≤ f(n) для всех n≥ n0}

Функция g(n) является асимптотической нижней оценкой функции f(n)

Функция g(n) является асимптотической нижней оценкой функции f(n)

Page 13: Сложность алгоритмов

Max(A, n; max)begin max ← A[1] for i ← 2 to n if max < A[i] then max ← A[i]end

О(g(n)) = fa^

(n) = 2 + 1 + (n-1)(3+2+2) = 7n - 4

Ω(g(n)) = fav (n) = 2 + 1 + (n-1)(3+2) = 5n - 2

Θ(g(n)) = Θ(n)

Задача: найти максимум в массиве A длинной n. Найти асимптотическую верхнюю,асимптотическую нижнею и асимптотически точную границы сложности алгоритма.

Решение:

Page 14: Сложность алгоритмов

Суммаэлементов

27

43

32

Задача: найти максимальную сумму непрерывной подпоследовательности элементов последовательности A

Пример:

Решение дальше

Page 15: Сложность алгоритмов

/ / Алгоритм поиска максимальной суммы подпоследовательности, // имеющий кубическую сложность (O(n3) )./ / seqStart – индекс начала подпоследовательности/ / seqEnd – индекс конца подпоследовательностиtemplate <class Comparable>Comparable maxSubsequenceSum( const vector<Comparable> & a,

int & seqStart, int & seqEnd ) { int n = a. size ( ) ; Comparable maxSum = 0;

for( int i = 0; i < n; i++ ) for( int j = i; j < n; j++ ) { Comparable thissum = 0; for( int k = i; k<= j; k++) thissum += a[ k ] ; if( thissum > maxSum ) { maxSum = thissum; seqStart = i; seqEnd = j ; } } return maxSum;}

/ / Алгоритм поиска максимальной суммы подпоследовательности, / / имеющий линейную сложность (O(n) )./ / seqStart – индекс начала подпоследовательности/ / seqEnd – индекс конца подпоследовательности template <class Comparable>Comparable maxSubsequenceSum( const vector<Comparable> & a,

int & seqstart, int & seqEnd ){ int n = a. size ( ) ; Comparable thissum = 0, maxSum = 0;

for( int i = 0, j = 0; j < n; j++ ) { thissum += a [ j ] ; if( thissum > maxSum ) { maxSum = thissum; seqstart = i; seqEnd = j ; } else if ( thissum < 0 ) { i = j + 1 ; thissum = 0; } } return maxSum;}

/ / Алгоритм поиска максимальной суммы подпоследовательности, // имеющий квадратическую сложность (O(n2) )./ / seqStart – индекс начала подпоследовательности/ / seqEnd – индекс конца подпоследовательностиtemplate <class Comparable>Comparable maxSubsequenceSum( const vector<Comparable> & a,

int & seqstart, int & seqEnd ){ int n = a.size( ) ; Comparable maxSum = 0;

for( int i = 0; i < n; i++ ) { Comparable thissum = 0; for( int j = i; j < n; j++ ) { thissum += a [ j ] ; if ( thissum > maxSum ) { maxSum = thissum; seqStart = i; seqEnd = j ; } } } return maxSum;}

Page 16: Сложность алгоритмов

/ / Алгоритм поиска максимальной суммы подпоследовательности, // имеющий квадратическую сложность (O(n2) )./ / seqStart – индекс начала подпоследовательности/ / seqEnd – индекс конца подпоследовательностиtemplate <class Comparable>Comparable maxSubsequenceSum( const vector<Comparable> & a,

int & seqstart, int & seqEnd ){ int n = a.size( ) ; Comparable maxSum = 0;

for( int i = 0; i < n; i++ ) { Comparable thissum = 0; for( int j = i; j < n; j++ ) { thissum += a [ j ] ; if ( thissum > maxSum ) { maxSum = thissum; seqStart = i; seqEnd = j ; } } } return maxSum;}

Θ(1) Θ(n-i) n

ΣΘ(n-i) = Θ((n-i)2)i=1

Page 17: Сложность алгоритмов

N O(n3) O(n2) O(n)

10 0.000009 0.000004 0.000003

100 0.002580 0.000109 0.000006

1000 2.281013 0.010203 0.000031

10000 - 1.2329 0.000317

100000 - 135 0.003206

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

заданной последовательностипри входных данных различной длины

Page 18: Сложность алгоритмов

дерево рекурсивных вызовов для вычисления f(6)

int f (int n) { if (n == 1) { return 1; } if (n == 2) { return 1; } return f(n-2) + f(n-1);}

Совокупность равенств такого типаназывается рекуррентностью(возвратное соотношение или рекурсивнаязависимость)

Page 19: Сложность алгоритмов

При анализе рекурсивных алгоритмов часто возникают рекуррентныеуравнения вида

где a, b и с – неотрицательные постоянныеn – степень числа с

Решение рекуррентных уравнение такого вида имеет вид

Пример: быстрая сортировкаРазбиение задачи размера n (за линейное время) на две подзадачиразмера n / 2 дает алгоритм сложности O(n log n).

Page 20: Сложность алгоритмов

Задача: перемножить два многочлена

Т.е. можно рекурсивно свести данную задачу к трем подзадачам:

Последний член вычисляется на основе решении этих трех подзадач

Задача: найти сложность данного алгоритма

Page 21: Сложность алгоритмов