Eu entendo que é mais rápido que e mais lento que . O que é difícil para mim entender é como realmente comparar e com onde .
Por exemplo, como decidimos vs Θ ( n 2 / 3 ) ou Θ ( n 1 / 3 )
Gostaria de ter algumas orientações para prosseguir nesses casos. Obrigado.
é o inverso de 2 n . Assim como 2 n cresce mais rápido do que qualquer polinômio n klogn 2n 2n nk 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 .k logn nk k
vs n k , para k < 1n/logn nk k<1 é idêntico a:
vs n / n 1 - kn/logn n/n1−k
como para n grande , n / logn1−k>logn n para k < 1 e grande n .n/logn>nk k<1 n
fonte
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 queO(n/log n)
para0 < 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 queO(n/log n)
para0 < f < 1
, geralmente é suficiente.Uma regra geral é que multiplicar (ou dividir) por
log n
eventualmente será insignificante em comparação com multiplicar (ou dividir) porn^f
qualquerf > 0
.Para mostrar isso mais claramente, vamos considerar o que acontece à medida que n aumenta.
Observe o que diminui mais rapidamente? É a
n^f
coluna.Mesmo se
f
estivesse mais perto de 1, an^f
coluna começará apenas mais lentamente, mas à medida que n dobra, a taxa de variação do denominador acelera, enquanto o denominador dan/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 quek
é bastante próximo de 1 (em0.9
). Também selecionei as constantes para que inicialmenteO(n^k)
sejam mais lentas. No entanto, observe que, eventualmente, "vence" no final e leva menos tempo queO(n/log n)
.fonte
n^k
eventualmente, é mais rápido, mesmo que as constantes sejam selecionadas de modo que sejam inicialmente mais lentas.fonte
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
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
fonte
O(10^9)
, mas o ponto principal sobre a tentativa de alguns números para criar intuição está certo.Deixeif≺ g 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.(2,10)<(3,5) and (2,10)>(2,5)
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
fonte