Big O Notation é um conceito matemático usado para descrever o desempenho ou a complexidade de um algoritmo em termos de tempo e espaço à medida que o tamanho da entrada aumenta. Isso nos ajuda a entender como o tempo de execução de um algoritmo aumenta com entradas maiores, permitindo uma comparação mais padronizada de diferentes algoritmos.
Ao comparar algoritmos, confiar apenas no tempo de execução pode ser enganoso. Por exemplo, um algoritmo pode processar um enorme conjunto de dados em uma hora, enquanto outro leva quatro horas. No entanto, o tempo de execução pode variar de acordo com a máquina e outros processos em execução. Em vez disso, usamos a notação Big O para focar no número de operações realizadas, o que fornece uma medida de eficiência mais consistente.
Vamos explorar duas maneiras de calcular a soma de todos os números de 1 a n:
function addUpTo(n) { let total = 0; for (let i = 1; iOpção 2: usando uma fórmula
function addUpTo(n) { return n * (n 1) / 2; }Analisando a Complexidade
Na Opção 1, se n for 100, o loop será executado 100 vezes. Em contraste, a Opção 2 sempre executa um número fixo de operações (multiplicação, adição e divisão). Por isso:
Embora a Opção 2 envolva três operações (multiplicação, adição, divisão), nos concentramos na tendência geral na análise Big O. Assim, em vez de expressá-lo como O(3n), simplificamos para O(n). Da mesma forma, O(n 10) simplifica para O(n) e O(n^2 5n 8) simplifica para O(n^2). Na notação Big O, consideramos o pior cenário, onde o termo de ordem mais alta tem o maior impacto no desempenho.
Existem outras formas de notação além das complexidades comuns listadas acima, como a complexidade de tempo logarítmica expressa como O(log n).
Big O Notation nos permite formalizar o crescimento do tempo de execução de um algoritmo com base no tamanho da entrada. Em vez de focar em contagens de operações específicas, categorizamos algoritmos em classes mais amplas, incluindo:
Considere a seguinte função, que imprime todos os pares de números de 0 a n:
function printAllPairs(n) { for (var i = 0; iNesse caso, a função possui dois loops aninhados, portanto, quando nnn aumenta, o número de operações aumenta quadraticamente. Para n= 2, existem 4 operações, e para n=3, existem 9 operações, levando a O(n^2).
Outro exemplo: contagem crescente e decrescente
function countUpAndDown(n) { console.log("Going up!"); for (var i = 0; i = 0; j--) { console.log(j); } console.log("Back down. Bye!"); }À primeira vista, pode-se pensar que é O(n^2) porque contém dois loops. No entanto, ambos os loops são executados de forma independente e escalam linearmente com n. Assim, a complexidade geral do tempo é O(n).
Simplificando a análise
A análise de cada aspecto da complexidade do código pode ser complexa, mas algumas regras gerais podem simplificar as coisas:
Embora tenhamos nos concentrado na complexidade do tempo, também é possível calcular a complexidade do espaço (memória) usando Big O. Algumas pessoas incluem o tamanho da entrada em seus cálculos, mas geralmente é mais útil focar apenas no espaço exigido pelo algoritmo em si.
Um exemplo
function sum(arr) { let total = 0; for (let i = ; iNesta função, a complexidade do espaço é O(1) porque usamos uma quantidade constante de espaço (duas variáveis), independentemente do tamanho da entrada.
Para uma função que cria um novo array:
function double(arr) { let newArr = []; for (let i = 0; iAqui, a complexidade do espaço é O(n) porque alocamos espaço para um novo array que cresce com o tamanho do array de entrada.
Conclusão
Big O Notation fornece uma estrutura para analisar a eficiência de algoritmos de uma forma que é independente do hardware e de detalhes específicos de implementação. Compreender esses conceitos é crucial para o desenvolvimento de código eficiente, especialmente à medida que o tamanho dos dados aumenta. Ao se concentrar em como o desempenho é dimensionado, os desenvolvedores podem fazer escolhas informadas sobre quais algoritmos usar em seus aplicativos.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3