Big O Formalmente
O(f(n))={g(n)|∃c>0,∃n0>0,∀n>n0:0≤g(n)≤c∗f(n)}
Big O Informally
O(f(n)) é o conjunto de funções que crescem mais lentamente (ou igualmente rápido) do que f(n). Isso significa que qualquer função que você escolherO(f(n))vamos chamá-la g(n)e você escolhe um tamanho suficientemente grande n, f(n) será maior queg(n). Ou, em outras palavras,f(n) acabará por superar qualquer função em O(f(n)) quando n cresce maior. n é o tamanho da entrada do seu algoritmo.
Como um exemplo. Vamos escolherf(n)=n2.
Nós podemos dizer que f(n)∈O(n3). Observe que, com o tempo, permitimos abuso de notação para que quase todo mundo escrevaf(n)=O(n3) agora.
Normalmente, quando avaliamos algoritmos, observamos a ordem deles. Dessa forma, podemos prever como o tempo de execução do algoritmo aumentará quando o tamanho da entrada (n) aumenta.
No seu exemplo, os dois algoritmos são de ordem O(n2). Portanto, o tempo de execução aumentará da mesma maneira (quadraticamente) quenaumenta. Seu segundo algoritmo será quatro vezes mais lento que o primeiro, mas isso é algo em que geralmente não estamos interessados ** teoricamente *. Algoritmos com a mesma ordem podem ter fatores diferentes (cna definição formal) ou em diferentes termos de ordem inferior na função que avalia o número de etapas. Mas geralmente é por causa dos detalhes da implementação e não estamos interessados nisso.
Se você tiver um algoritmo executado em O(log(n)) tempo, podemos dizer com segurança que será mais rápido do que O(n) [1] porque log(n)=O(n). Não importa o quão ruim oO(log(n)) algoritmo é implementado, não importa quanto sobrecarga você coloque no algoritmo, ele sempre será [1] mais rápido que o O(n)algoritmo. Mesmo que o número de etapas nos algoritmos seja9999∗log(n)=O(log(n)) e 0.0001∗n=O(n), a O(log(n)) o algoritmo será eventualmente mais rápido [1].
Mas, talvez, na sua aplicação, n é sempre baixo e nunca será suficientemente grande para que o O(log(n))algoritmo será mais rápido na prática . Então, usando oO(n) algoritmo resultará em tempos de execução mais rápidos, apesar de n=O(log(n))
[1] se n é suficientemente grande.
n
pequenos en
geralmente são pequenos. Os algoritmos extravagantes têm grandes constantes. Até que você saiba quen
frequentemente será grande, não seja chique. " Isso ocorre devido à diferença entre complexidade teórica e eficiência prática, que é habilmente definida nas respostas abaixo.