Sì, per N opportunamente piccolo Ci sarà sempre una N, sopra la quale avrai sempre l'ordine O (1) < O (lg N) < O (N) < O (N log N) < O (N ^ c) < O (c ^ N) (dove O (1) < O (lg N) significa che in un algoritmo O (1) richiederà meno operazioni quando N è adeguatamente grande e c è una certa costante fissa che è maggiore di 1) .
Dire che un particolare algoritmo di O (1) richiede esattamente f (N) = 10 ^ 100 (un googol) e un algoritmo di O (N) richiede esattamente g (N) = 2 N + 5 operazioni. L'algoritmo O (N) offre prestazioni migliori fino a quando N è approssimativamente un googol (in realtà quando N > (10 ^ 100 - 5) / 2), quindi se ti aspetti che N sia nell'intervallo da 1000 a un miliardo potresti subire una penalità maggiore usando l'algoritmo O (1).
O per un confronto realistico, supponi di moltiplicare i numeri di n cifre. L'algoritmo Karatsuba è al massimo 3 n ^ (lg 3) operazioni (che è approssimativamente O (n ^ 1.585)) mentre l'algoritmo Schönhage-Strassen è O (N log N log log N) che è un ordine più veloce , ma per citare wikipedia:
In practice the Schönhage–Strassen algorithm starts to outperform
older methods such as Karatsuba and Toom–Cook multiplication for
numbers beyond 2^2^15 to 2^2^17 (10,000 to 40,000 decimal
digits).[4][5][6]
Quindi, se si moltiplicano i numeri di 500 cifre, non ha senso utilizzare l'algoritmo "più veloce" con grandi argomenti O.
EDIT: puoi trovare la determinazione f (N) rispetto a g (N), prendendo il limite N- > infinito di f (N) / g (N). Se il limite è 0 allora f (N) < g (N), se il limite è infinito allora f (N) > g (N), e se il limite è qualche altra costante allora f (N) ~ g (N) in termini di notazione O grande.