Big O - это инструмент анализа, используемый для сравнения алгоритмов. Большой O - верхняя граница функции. Думайте о верхней границе как о максимальном количестве времени, которое алгоритм может занять для запуска.
Big O часто использует переменную n для обозначения различного количества элементов в алгоритме. Например, если вы выполняете операцию над каждым элементом массива, n будет обозначать размер массива. Вам нужно будет выполнить операцию n раз.
Программисты используют это обозначение, чтобы иметь общее представление о том, насколько сложен алгоритм и (как указано выше), насколько хорошо алгоритм масштабируется (имеется в виду, насколько хорошо он работает, когда n становится все больше и больше).
Алгоритмы вычисления n-го элемента последовательности Фибоначчи очень полезны для целей обозначений Big O. Рассмотрим рекурсивный метод решения n-го элемента последовательности Фибоначчи:
fib(n) {
if (n == 0)
return 0;
else if (n == 1)
return 1;
else
return fib(n-1) + fib(n-2);
}
Это простая реализация Фибоначчи с очень медленным временем выполнения для любого n, превышающего, скажем, 100. Мы классифицируем этот алгоритм как O (2 ^ n), который на графике будет расти с экспоненциальной скоростью. Экспонента хороша, когда она имеет дело с деньгами на вашем банковском счете, но ужасна, когда она имеет дело с алгоритмами.
Другая реализация Фибоначчи может значительно ускорить алгоритм.
fib(n) {
fibArr[n + 1];
fibArr[0] = 0;
fibArr[1] = 1;
for(int i = 2; i <= n; i++) {
fibArr[i] = fibArr[i-1] + fibArr[i-2];
}
return fibArr[n];
}
Эта вторая реализация Fibonnaci имеет время выполнения Big O, равное O (n). Это то, что называется линейным временем. Если вы нанесете реализации Фибоначчи друг на друга на графике, вы увидите огромную разницу во времени выполнения экспоненциальной реализации по сравнению с линейной реализацией.
Size - Linear - Exponential
1 1 2
10 10 1024
100 100 1.2676506e+30
1000 1000 1.071509e+301
Рассматривайте каждое из приведенных выше чисел как количество операций, которые необходимо выполнить. Если каждая операция занимает 1 мс (только оценка), вы можете догадаться, сколько времени займет алгоритм.
Существует еще многое для анализа Big O. Рассмотрим эти различные типы классификаций для Big O.
Constant time - O(1)
Logarithmic - O(logn)
Linear - O(n)
Quadratic - O(n^2)
Exponential - O(2 ^n)
Factorial - O(n!)
При выборе алгоритма важно понимать приблизительное время работы и пространство, необходимое для выполнения алгоритма.