Да, для достаточно малого N. Всегда будет N, выше которого у вас всегда будет порядок O (1) <O (lg N) <O (N) <O (N log N) <O (N ^ c ) <O (c ^ N) (где O (1) <O (lg N) означает, что при алгоритме O (1) потребуется меньше операций, когда N достаточно велико и c является некоторой фиксированной константой, которая больше 1 ).
Скажем, конкретный алгоритм O (1) требует ровно f (N) = 10 ^ 100 (гугол) операций, а алгоритм O (N) - ровно g (N) = 2 N + 5 операций. Алгоритм O (N) будет давать большую производительность до тех пор, пока N не станет примерно гуголом (фактически, когда N> (10 ^ 100 - 5) / 2), поэтому, если вы ожидаете, что N будет находиться в диапазоне от 1000 до миллиарда, вы будет страдать от серьезного штрафа с использованием алгоритма O (1).
Или для реалистичного сравнения, скажем, вы умножаете n-значные числа вместе. Алгоритм Карацуба составляет не более 3 п ^ (LG 3) операция (то есть примерно O (N ^ 1,585)) , тогда как алгоритм Шёнхаг-Штрассен является O (N журнал N журнал журнал N) , который представляет собой быстрый порядок , но цитировать википедия:
На практике алгоритм Шёнхаге – Штрассена начинает опережать более старые методы, такие как умножение Карацубы и Тоом – Кука, для чисел от 2 ^ 2 ^ 15 до 2 ^ 2 ^ 17 (от 10 000 до 40 000 десятичных цифр). [4] [5] [6 ]
Так что, если вы умножаете 500-значные числа вместе, не имеет смысла использовать алгоритм, который «быстрее» при больших аргументах O.
РЕДАКТИРОВАТЬ: Вы можете найти определение f (N) по сравнению g (N), взяв предел N-> бесконечность f (N) / g (N). Если предел равен 0, то f (N) <g (N), если предел равен бесконечности, то f (N)> g (N), а если предел - это некоторая другая постоянная, то f (N) ~ g (N) с точки зрения большой нотации.