O (1): простой код без петель. Просто течет. Поисковые запросы в справочной таблице тоже O (1).
O (log (n)): эффективно оптимизированные алгоритмы. Пример: алгоритмы двоичного дерева и бинарный поиск. Обычно не болит. Вам повезло, если у вас есть такой алгоритм под рукой.
O (n): один цикл данных. Больно за очень большой п.
O (n * log (n)): алгоритм, который выполняет стратегию «разделяй и властвуй». Больно за большой н. Типичный пример: сортировка слиянием
O (n * n): некоторый вложенный цикл. Больно даже при маленьком п. Общее с наивными матричными вычислениями. Вы хотите избежать такого алгоритма, если можете.
O (n ^ x для x> 2): злая конструкция с несколькими вложенными циклами. Больно для очень маленьких п.
O (x ^ n, n! И хуже): причудливые (и часто рекурсивные) алгоритмы, которые вы не хотите использовать в производственном коде, за исключением очень контролируемых случаев, для очень маленьких n и, если действительно нет лучшей альтернативы , Время вычислений может взорваться при n = n + 1.
Перемещение вашего алгоритма из класса более высокой сложности может заставить ваш алгоритм работать. Подумайте о преобразовании Фурье, которое имеет алгоритм O (n * n), который был непригоден для аппаратных средств 1960-х, за исключением редких случаев. Затем Кули и Тьюки сделали некоторые умные сокращения сложности, повторно используя уже рассчитанные значения. Это привело к широкому внедрению БПФ в обработке сигналов. И в конце концов, именно поэтому Стив Джобс разбогател на iPod.
Простой пример: программисты наивного C пишут такой цикл:
for (int cnt=0; cnt < strlen(s) ; cnt++) {
/* some code */
}
Это алгоритм O (n * n) из-за реализации strlen (). Вложенность циклов приводит к умножению сложностей внутри Big-O. O (n) внутри O (n) дает O (n * n). O (n ^ 3) внутри O (n) дает O (n ^ 4). В этом примере предварительный расчет длины строки немедленно превратит цикл в O (n). Джоэл также написал об этом.
Но класс сложности - это еще не все. Вы должны следить за размером п. Переработка алгоритма O (n * log (n)) в O (n) не поможет, если количество (теперь линейных) инструкций значительно возрастет из-за переделки. И если n все равно мало, оптимизация тоже не даст большого эффекта.