Em geral, usamos a notação big-O somente quando n pode subir para valores obscenamente grandes, porque a notação big-O descreve como o tempo de execução aumenta à medida que a entrada aumenta. Por exemplo, ao classificar uma lista, a maioria dos melhores algoritmos é classificada O(n log n)
- o que significa, e somente significa, que quando a lista é longa o suficiente, o tempo que leva para classificá-la é proporcional an log n
. Quando a lista não é longa o suficiente, outros fatores (por exemplo, a qualquer momento que seu algoritmo leve para alocar espaço extra) tornam-se significativos e podem potencialmente levar o tempo de execução.
Com seqüências de JavaScript, n
pode realmente ficar arbitrariamente grande *, por isso dizemos que a comparação leva O(n)
tempo. Porém, com números JavaScript (que são números de ponto flutuante de precisão dupla IEEE 754 ), n
tem um limite máximo de 64-1 para um bit de sinal, 11 para um expoente e 53 para dígitos significativos **. Por isso, sabemos exatamente quanto tempo levará para que uma comparação de números ocorra, e os melhores sistemas que temos para comparar números desse tamanho exato funcionam mais ou menos da mesma forma, independentemente de quantos desses 64 dígitos cada número realmente Portanto, a comparação desses números no JavaScript é considerada O(1)
.
* Tecnicamente, há um limite superior porque a RAM pode acabar. No entanto, o idioma não especifica um tamanho máximo para seqüências de caracteres, e oO(n)
parte da comparação de cadeias domina o tempo de execução muito antes disso.
** A propósito, isso significa que os números no JavaScript não podem aumentar infinitamente. Depois de um certo ponto, eles começam a jogar fora dígitos menores (por exemplo, números acima de 2 ^ 53 só podem ser pares e números acima de 2 ^ 54 só podem ser divisíveis por 4) e, quando o número fica grande o suficiente, ele arredonda para cima ao infinito. Por outro lado, se você dividir um número repetidamente para torná-lo infinitesimalmente pequeno, ele acabará arredondando para zero.
2
por exemplo, não é3
. É isso aí. Da mesma forma123
não é124
. Uma string é uma coleção de caracteres"abc"
diferente,"abd"
mas você deve verificar cada caractere.