Так, для відповідно малих 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 (googol) операцій, а алгоритм O (N) займає рівно g (N) = 2 N + 5 операцій. Алгоритм O (N) буде давати більшу продуктивність, поки ви N буде приблизно рівним googol (насправді, коли N> (10 ^ 100 - 5) / 2), тож якщо ви лише очікували, що N буде в межах від 1000 до мільярда, ви зазнав би великого штрафу за допомогою алгоритму O (1).
Або для реалістичного порівняння скажіть, що ви множите n-значні числа разом. Алгоритм Карацуби - це щонайбільше 3 n ^ (lg 3) операцій (тобто приблизно O (n ^ 1,585)), тоді як алгоритм Шенгаге – Страссена - O (N log N log log N), що є швидшим порядком , але для цитування Вікіпедія:
На практиці алгоритм Шенгаге-Страссена починає перевершувати більш старі методи, такі як множення Карацуби та Тома – Кука для чисел, що перевищують 2 ^ 2 ^ 15 до 2 ^ 2 ^ 17 (від 10 000 до 40 000 десяткових цифр). [4] [5] [6 ]
Отже, якщо ви множите 500-цифрові числа разом, не має сенсу використовувати алгоритм, який "швидший" великими аргументами O.
EDIT: Ви можете визначити f (N) порівняно g (N), взявши межа N-> нескінченність f (N) / g (N). Якщо межа дорівнює 0, то f (N) <g (N), якщо межа є нескінченністю, то f (N)> g (N), а якщо межа є якоюсь іншою постійною, то f (N) ~ g (N) з точки зору великого O позначення.