Оценка сложности алгоритмов: линейная сложность, квадратичная, логарифмическая...

Существует несколько способов измерения сложности алгоритма. Программисты обычно сосредотачивают внимание на скорости алгоритма, но не менее важны и другие показатели – требования к объёму памяти, например. Использование быстрого алгоритма не приведёт к ожидаемым результатам, если для его работы понадобится больше памяти, чем есть у компьютера.

При сравнении различных алгоритмов важно знать, как их сложность зависит от объёма входных данных.

$T(n): N -> Q^+ (>0)$

$T(n)=O(f(n))$ <=> сущ. C,N_0>0: T(n) \leq C*f(n), \all n \geq n_0

Лемма

$T(n) = a_0 * x^b + a_1 * x^{b-1} + ... + a_{n-1}*x^{1} + a_n*x^{0}$ $T(n) \leq c*x^b$ $n_0 = 1$ $c = |a_0| + |a_1| + ... $

Лемма 2

$\all k \geq 1, n^k \neq O(n^{k-1})$ \let (пусть) n^k = O(n^{k-1}) => \exist )C, $n^k \leq C * n^{k-1}$ $n \leq C, \forall n \geq n_0$

Худший случай..

$T(n) = \omega (f(n)) <=> \exist c,n_0 > 0: T(n) \geq c*f(n), \forall n \geq n.

$T(n) = \theta(f(n))$ \Leftrightarrow $T(n) = O(f(n))$ и $T(n) = \omega(f(n))$

$\exists c_1, c_2, n_0: C_1*f(n) \leq T(n) \leq C_2 * f(n), \forall n > n_0$

$\forall k > 0$ ...

Маленькая $o$

$T(n) = o(f(n))$ <=> $\forall c>0 \exists n_0:$ $T(n) \leq C*f(n)$ $\forall n \geq n_0$

Пример: $\forall k \geq 1$, $n^{k-1} = o(n^k)$

$O(1)$ - время выполнения алгоритма константа (не зависит от количества элементов во входном множестве).

$O(n)$ - линейная сложность.

Пример: поиск минимального элемента в массиве (цикл по всем элементам массива).

$O(n^2)$ - квадратичная сложность. Например, сортировки "пузырьком", вставками и т.д.

Пример: поиск двух точек на плоскости с максимальным расстоянием между ними.

$O(n^3)$ - кубическая сложность.

Пример: поиск треугольника максимальной площади с вершинами в точках на плоскости (перебор вершин тройным циклом).

Оценка $O(n)$ ассимптотическая (при $n$ стремящемся к бесконечности).

$O(\ln{n})$ - Бинарный поиск - логарифмическая сложность.

$O(n\log{n})$ - быстрая сортировка Хоара (рус) - QuickSort, HeapSort, MergeSort.

При оценке сложности важна только самая старшая степень. Например:

$O(n^3+n^2+4n)=O(n^3)$

Константа так же отбрасывается, так как нам важно лишь во сколько раз возрастает время выполнения программы при увеличении размера входных данных.