1 / 21

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

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

baxter
Download Presentation

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

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. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Сложность алгоритмов Шатилов Максим 271ПИ

  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, not 6) if (a > b) {…} else {…} Модель вычислений - это множество базовых операций, используемыхдля вычисления, а также относительные издержки их применения. При асимптотической оценке сложности вычислений, модель вычислений определяется через множество базовых операций, для каждой из которых известная ее цена.

  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

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

  5. Комплексный критерий оценки алгоритмов «хорошо» описывающая алгоритм функция Аргументами данной функции могут быть Ресурсные оценки – требования алгоритма к ресурса компьютера (оперативная память, процессор). Например, требования алгоритмак памяти могут быть представлены в виде: V(n)=Vio+Vдоп+Vexe+Vстек где Vio - память для чтения/записи Vдоп- память, содержащая переменные алгоритма Vexe - код программы Vстек- память, выделенная для стека. Информационная чувствительность Размах варьирования - fa^(n) - fav(n) = R(n); Время выполнения.

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

  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)

  8. О-обозначения 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)

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

  10. Графическое представление 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)

  11. Графическое представление 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)

  12. Ω-обозначения f(n)=Ω(g(n)) Ω(g(n)) = {f(n): существуют положительныеконстанты и n0такие что 0≤ cg(n)≤ f(n) для всех n≥ n0} Функция g(n) является асимптотической нижней оценкой функцииf(n)

  13. Пример: поиск максимума Задача: найти максимум в массиве 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)

  14. Пример: сравнение сложностиалгоритмов в нотации O Задача: найти максимальную сумму непрерывной подпоследовательностиэлементов последовательности A Пример: Суммаэлементов 27 43 32 Решение дальше

  15. Пример: сравнение сложности алгоритмовв нотации 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; }

  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; } n ΣΘ(n-i) = Θ((n-i)2) i=1 Θ(1) Θ(n-i)

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

  18. Оценка рекурсивных алгоритмов. Последовательность чисел Фибоначчи Совокупность равенств такого типаназывается рекуррентностью(возвратное соотношение или рекурсивнаязависимость) дерево рекурсивных вызововдля вычисления f(6) int f (int n) { if (n == 1) { return 1; } if (n == 2) { return 1; } return f(n-2) + f(n-1); }

  19. Решение рекуррентных уравнений При анализе рекурсивных алгоритмов часто возникают рекуррентныеуравнения вида где a,bи с– неотрицательные постоянные n – степень числа с Решение рекуррентных уравнение такого вида имеет вид Пример: быстрая сортировка Разбиение задачи размера n(за линейное время)на две подзадачи размера n / 2дает алгоритм сложности O(n log n).

  20. Алгоритм Карацубы Задача: перемножить два многочлена Т.е. можно рекурсивно свести данную задачу к трем подзадачам: Последний член вычисляется на основе решении этих трех подзадач Задача: найти сложность данного алгоритма

  21. Спасибо за внимание

More Related