Программирование на C++: алгоритмы поиска и сортировки. II
Алгоритм — метод решения задачи, пригодный для реализации в виде компьютерной программы
Алгоритмы сравнивают по времени и памяти
Линейный поиск | Бинарный поиск | |
---|---|---|
Лучший случай | 1 | 1 |
Худший случай | \(n\) | \(\log_2(n)\) |
В среднем | \(n\) | \(\log_2(n)\) |
В таблице указано количество шагов (сравнений) алгоритмов поиска
Функция \(g(n)\) является \(O(f(n))\), если существуют такие постоянные \(c_0\) и \(n_0\), что \(g(n) < c_0 f(n)\) для всех \(n > n_0\)
Другими словами: при достаточно больших \(n\) функция \(g(n)\) растёт медленнее \(f(n)\)
Сложение | \(O(f_1) + O(f_2) = O(\max(f_1,f_2))\) |
Умножение | \(O(f_1)O(f_2) = O(f_1 f_2)\) |
Умножение на константу | \(O(|k| f) = O(f)\) |
\(O\)-нотация используется для описания асимптотических выражений*, которые используются для оценки вычислительной сложности алгоритмов
*выражения для больших \(n\)
\[ \frac{n(n+1)/2 + n}{n} = O(n) \]
Константная | \(O(1)\) |
Логарифмическая | \(O(\log(n))\) |
Линейная | \(O(n)\) |
Линейно-логарифмическая | \(O(n\log(n))\) |
Квадратичная | \(O(n^2)\) |
Экспоненциальная | \(O(2^n)\) |
Метод решения задач, в котором исходная задача делится на меньшие подзадачи
\[ T(n) = a T\left(\frac{n}{b}\right) + O(n^d) \]
\[ a \ge 1, b > 1 \]
\(a\) — количество подзадач, \(b\) — во сколько раз уменьшается подзадача, \(T\) — время вычисления, \(d\) — показатель экспоненты оценки сложности выполнения нерекурсивной части
Если \(a=b^d\) | \(T(n)=O(n^d \log(n))\) |
Если \(a < b^d\) | \(T(n)=O(n^d)\) |
Если \(a>b^d\) | \(T(n)=O(n^{\log_b a})\) |
Для бинарного поиска \(a=1\), \(b=2\), \(d=0\), то есть \(1 = 2^0\) (первый случай), следовательно асимптотическая оценка вычислительной сложность бинарного поиска \(O(n^0 \log(n)) = O(\log(n)) \)