Сложность алгоритмов
Download
1 / 21

Сложность алгоритмов - PowerPoint PPT Presentation


  • 166 Views
  • Uploaded on

Сложность алгоритмов. Шатилов Максим 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 {…}.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Сложность алгоритмов' - baxter


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

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

Шатилов Максим 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

{…}

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

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


Ресурсные функции

Алгоритм А:

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



Комплексный критерий оценки алгоритмов

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

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

Ресурсные оценки – требования алгоритма к ресурса компьютера

(оперативная память, процессор). Например, требования алгоритмак памяти могут быть представлены в виде:

V(n)=Vio+Vдоп+Vexe+Vстек

где

Vio - память для чтения/записи

Vдоп- память, содержащая переменные алгоритма

Vexe - код программы

Vстек- память, выделенная для стека.

Информационная чувствительность

Размах варьирования - fa^(n) - fav(n) = R(n);

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


Оценки алгоритмов алгоритмов


Θ алгоритмов-обозначения

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

Θ(g(n)) = {f(n): существуют положительныеконстанты c1, c2и n0такие что 0≤ c1g(n)≤ f(n) ≤ c2g(n) для всех n≥ n0}

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


О алгоритмов-обозначения

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

O(g(n)) = {f(n): существуют положительныеконстанты c1, c2и n0такие что 0≤ c1g(n)≤ f(n) ≤ c2g(n) для всех n≥ n0}

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


О алгоритмов-обозначения

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

• 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)).


Графическое представление алгоритмов I

f5(n) ЄO(n3)

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

f1(n) ЄO(n)

f6(n) ЄO(2n)

f2(n) ЄO(n2)

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

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


Графическое представление алгоритмов II

f5(n) ЄO(n3)

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

f1(n) ЄO(n)

f6(n) ЄO(2n)

f2(n) ЄO(n2)

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

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


Ω алгоритмов-обозначения

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

Ω(g(n)) = {f(n): существуют положительныеконстанты и n0такие что 0≤ cg(n)≤ f(n) для всех n≥ n0}

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


Пример алгоритмов: поиск максимума

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

Решение:

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)


Пример: сравнение сложности алгоритмовалгоритмов в нотации O

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

Пример:

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

27

43

32

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


Пример: сравнение сложности алгоритмовв нотации O

/ / Алгоритм поиска максимальной суммы подпоследовательности,

/ / имеющий линейную сложность (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(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(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;

}


Пример: вычисление сложности алгоритма в нотации Θ

/ / Алгоритм поиска максимальной суммы подпоследовательности,

// имеющий квадратическую сложность (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;

}

n

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

i=1

Θ(1)

Θ(n-i)


Переход от сложности алгоритма ко времени его работы

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

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


Оценка рекурсивных алгоритмов. Последовательность чисел Фибоначчи

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

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

int f (int n) {

if (n == 1) {

return 1;

}

if (n == 2) {

return 1;

}

return f(n-2) + f(n-1);

}


Решение рекуррентных уравнений Последовательность чисел Фибоначчи

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

где

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

n – степень числа с

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

Пример: быстрая сортировка

Разбиение задачи размера n(за линейное время)на две подзадачи

размера n / 2дает алгоритм сложности O(n log n).


Алгоритм Последовательность чисел ФибоначчиКарацубы

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

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

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

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


Спасибо за внимание Последовательность чисел Фибоначчи