Worst Case – максимальное время выполнения («хуже не бывает», наихудший случай).
О – нотация - O(f(N)) - (О - сложность алгоритма -«читается большое О от f» – это все функции, растущие медленнее, чем f;
О - нотация описывает скорость роста асимптотической сложности и дает верхний предел его настоящей сложности (верхнюю оценку временной сложности алгоритма).
Т.е. O-нотация говорит о том, что наш код никогда не будет работать медленнее определённого предела («хуже не бывает», что дает возможность оценить достаточно ли хороша наша программа.
Например, если сложность O(N2), то это говорит о том, что наша программа асимптотически не хуже, чем N2. Она будет работать или лучше, или также.
Худший случай соответствует наименее удачному набору входных данных, когда алгоритму для решения задачи приходится выполнить максимальное число элементарных операций.
Т.к. “плохие” данные могут быть намеренно поданы на вход злоумышленником худшему случаю всегда уделяется особое внимание.
верхняя граница времени работы алгоритма
Основные недостатки о - анализа
получение O-оценок очень трудоемко
часто трудно определить сложность "в среднем",
оценки слишком грубые для отображения более тонких отличий алгоритмов:
если
алгоритм А решает задачу за 0.001*N с,
алгоритма В требуется за 1000*N с,
то значит В в миллион раз быстрее, чем А.
Тем не менее А и В имеют одну и ту же временную сложность O(N).
дает слишком мало информации для
анализа поведения алгоритмов при обработке
Best Case – минимальное время («лучше не бывает», наилучший случай).
Ω(f(N)) (омега большое) – функции, растущие быстрее, чем f(N) -нижняя граница сложности алгоритма;
Ограниченность функции f(N) снизу функцией Т(N) записывается следующим образом:
f(N)=Ω(Т(N)).
Ω - сложность – это сложность лучше которой наша программа быть не может.
Например, высказывание, что алгоритм является Ω( N3 ), означает, что алгоритм не лучше, чем N3.
В лучшем случае набор входных данных обеспечит минимально возможное число операций.
Нотация полезна, если:
хотим доказать, что программа работает медленно или алгоритм является плохим
когда утверждаем, что алгоритм слишком медленный для использования в данном конкретном случае.
нижняя граница времени работы алгоритма
Θ(f(N)) - Average Case – среднее время выполнения (точная оценка - настоящая сложность)
Θ(f(N)) (тета от N) – функции, растущие с той же скоростью, что и f(N).
Например, если алгоритм является Θ( N ), то его точная сложность - N.
Нотация Θ(T(N)) говорит о том, что если мы посчитаем количество необходимых программе команд, и оно будет равно 2n, то асимптотика этого алгоритма описывается как n.
Нотации Ω и O взаимозаменяемы:
T(N)=O(f(N))⇔ f(N) =Ω(T(N)).
Программы с большим Θ выполняются медленнее, чем с маленьким.
Существуют специальные названия:
Θ( 1 ) - алгоритм с константным временем,
Θ( N ) - линейный
Θ( N2 ) - квадратичный.
Θ(log( N )) - логарифмический
Например, верны математические утверждения:
N6 + 3N ∈ Θ( N6)
2N + 12 ∈ Θ( 2N )
3N + 2N ∈ Θ( 3N )
nN + N ∈ Θ( Nn )
Конечно, лучше, когда можно найти точные границы для алгоритма, чтобы иметь больше информации о его поведении, но, к сожалению, это не всегда легко сделать. Выяснить O-сложность алгоритма проще, чем его Θ-сложность.
Средний случай определяется сложно:
входные данные разбиваются на возможные группы, для каждой из которых трудоемкость алгоритма для любого набора данных одинакова
далее, определяется вероятность появления каждой группы
после чего досчитывается время работы алгоритма на данных каждой группы.
Понятие среднего случая используется для оценки поведения алгоритма с расчетом на то, что наборы данных равновероятны.
Время работы алгоритма в худшем и в лучшем случаях может сильно отличаться.
На практике оперируют максимальным временем выполнения алгоритма - время работы в худшем случае.
Зная его можно гарантировать, что при любом входе работа будет длиться не дольше;
