Respostas:
Se você apenas desenhar alguns gráficos, estará em boa forma. O Wolfram Alpha é um ótimo recurso para esses tipos de investigações:
Gerado por este link . Observe que, no gráfico, log (x) é o logaritmo natural, razão pela qual a equação de um gráfico parece um pouco engraçada.
é o inverso de 2 n . Assim como 2 n cresce mais rápido do que qualquer polinômio n k independentemente do tamanho de um finito , o log n se tornará mais lento que qualquer função polinomial n k, independentemente de quão pequeno seja um k diferente de zero e positivo .
vs n k , para k < 1 é idêntico a: vs n / n 1 - k
como para n grande , n / log para k < 1 e grande n .
Para muitos algoritmos, às vezes acontece que as constantes são diferentes, fazendo com que uma ou outra seja mais rápida ou mais lenta para tamanhos de dados menores e não sejam tão bem ordenadas pela complexidade algorítmica.
Dito isto, se considerarmos apenas os tamanhos de dados super grandes , ou seja. qual deles eventualmente vence, então O(n^f)
é mais rápido do que O(n/log n)
para 0 < f < 1
.
Uma grande parte da complexidade algorítmica é determinar qual algoritmo é eventualmente mais rápido, sabendo que O(n^f)
é mais rápido do que O(n/log n)
para 0 < f < 1
, geralmente é suficiente.
Uma regra geral é que multiplicar (ou dividir) por log n
eventualmente será insignificante em comparação com multiplicar (ou dividir) por n^f
qualquer f > 0
.
Para mostrar isso mais claramente, vamos considerar o que acontece à medida que n aumenta.
n n / log n n^(1/2)
2 n/ 1 ?
4 n/ 2 n/ 2
8 n/ 3 ?
16 n/ 4 n/ 4
64 n/ 6 n/ 8
256 n/ 8 n/16
1024 n/10 n/32
Observe o que diminui mais rapidamente? É a n^f
coluna.
Mesmo se f
estivesse mais perto de 1, a n^f
coluna começará apenas mais lentamente, mas à medida que n dobra, a taxa de variação do denominador acelera, enquanto o denominador da n/log n
coluna parece mudar a uma taxa constante.
Vamos traçar um caso particular em um gráfico
Fonte: Wolfram Alpha
Eu selecionei O(n^k)
tal que k
é bastante próximo de 1 (em 0.9
). Também selecionei as constantes para que inicialmente O(n^k)
sejam mais lentas. No entanto, observe que, eventualmente, "vence" no final e leva menos tempo que O(n/log n)
.
Ao comparar os tempos de execução, é sempre útil compará-los usando grandes valores de n. Para mim, isso ajuda a criar intuição sobre qual função é mais lenta
No seu caso, pense em n = 10 ^ 10 e a = 0,5
O(n/logn) = O(10^10/10) = O(10^9)
O(n^1/2) = O(10^10^.5) = O(10^5)
Portanto, O (n ^ a) é mais rápido que O (n / logn), quando 0 <a <1 eu usei apenas um valor, no entanto, você pode usar vários valores para criar intuição sobre a função
O(10^9)
, mas o ponto principal sobre a tentativa de alguns números para criar intuição está certo.
Deixei denotar "f cresce assintoticamente mais lento que g", então você pode usar a seguinte regra fácil para polilogarítmica? funções:
The order relation between the tuples is lexicographic. I.e. and
Applied to your example:
You could say: powers of n dominate powers of log, which dominate powers of log log.
Source: Concrete Mathematics, p. 441