Aqui, por análise assintótica, presumo que entendemos o comportamento do algoritmo à medida que o tamanho da entrada vai para o infinito.
A razão pela qual usamos a análise assintótica é porque
é útil na previsão do comportamento dos algoritmos na prática . As previsões nos permitem tomar decisões, por exemplo, quando temos algoritmos diferentes para um problema, qual deles devemos usar? (Ser útil não significa que está sempre correto.)
A mesma pergunta pode ser feita sobre qualquer modelo simplificado do mundo real. Por que usamos modelos matemáticos simplificados do mundo real?
Pense em física. A física newtoniana clássica não é tão boa quanto a física relativista na previsão do mundo real. Mas é um modelo suficientemente bom para a construção de carros, arranha-céus, submarinos, aviões, pontes, etc. Há casos em que não é bom o suficiente, por exemplo, se queremos construir um satélite ou enviar uma sonda espacial para Plutão ou prever o movimento de objetos celestes maciços como estrelas e planetas ou objetos de velocidade muito alta como elétrons.
É importante saber quais são os limites de um modelo.
Normalmente, é uma aproximação suficientemente boa do mundo real.
Na prática, vemos frequentemente que um algoritmo com melhor análise assintótica funciona melhor na prática. Raramente é o caso de um algoritmo ter melhor comportamento assintótico. Portanto, se as entradas podem ser grandes o suficiente, normalmente podemos confiar na análise assintótica como primeira previsão do comportamento dos algoritmos. Não é assim se sabemos que as entradas serão pequenas. Dependendo do desempenho que desejamos, podemos precisar fazer uma análise mais cuidadosa, por exemplo, se tivermos informações sobre a distribuição das entradas fornecidas pelo algoritmo, podemos fazer uma análise mais cuidadosa para alcançar os objetivos que temos (por exemplo, rápido na 99) % de insumos). O ponto é que, como primeiro passo, a análise assintótica é um bom ponto de partida. Na prática, também devemos fazer testes de desempenho, mas tenha em mente que também tem seus próprios problemas.
AAAtem melhor complexidade assintótica. O que nenhum deles é melhor que o outro em todas as entradas? Então fica mais complicado e depende do que nos interessa. Preocupamo-nos com entradas grandes ou pequenas? Se nos preocupamos com entradas grandes, não é comum que um algoritmo tenha melhor complexidade assintótica, mas se comporte pior nas entradas grandes que importamos. Se nos preocupamos mais com pequenos insumos, a análise assintótica pode não ser tão útil. Devemos comparar o tempo de execução dos algoritmos nas entradas que importamos. Na prática, para tarefas complicadas com requisitos complicados, a análise assintótica pode não ser tão útil. Para problemas básicos simples que os livros didáticos de algoritmo cobrem, é bastante útil.
Em resumo, a complexidade assintótica é relativamente fácil de calcular a aproximação da complexidade real dos algoritmos para tarefas básicas simples (problemas em um livro de algoritmos). À medida que construímos programas mais complicados, os requisitos de desempenho mudam e se tornam mais complicados, e a análise assintótica pode não ser tão útil.
É bom comparar a análise assintótica com outras abordagens para prever o desempenho dos algoritmos e compará-los. Uma abordagem comum são os testes de desempenho contra entradas aleatórias ou de referência. É comum quando o cálculo da complexidade assintótica é difícil ou inviável, por exemplo, quando estamos usando heurísticas, como, por exemplo, a solução SAT. Outro caso é quando os requisitos são mais complicados, por exemplo, quando o desempenho de um programa depende de fatores externos e nosso objetivo pode ser algo que termine sob alguns limites de tempo fixos (por exemplo, pense em atualizar a interface mostrada ao usuário) em 99% dos entradas.
Mas lembre-se de que a análise de desempenho também apresenta seus problemas. Ele não fornece aos donatários matemáticos o desempenho com menos desempenho; na verdade, executamos o teste de desempenho em todas as entradas que serão fornecidas ao algoritmo (geralmente inviável em termos computacionais) (e geralmente não é possível decidir que algumas entradas nunca serão fornecidas). Se testar em contra uma amostra aleatória ou uma referência estamos implicitamente assumindo alguma regularidade
sobre o desempenho dos algoritmos, ou seja, o algoritmo irá realizar semelhante em outras entradas que não faziam parte do teste de desempenho.
O segundo problema dos testes de desempenho é que eles dependem do ambiente de teste. Ou seja, o desempenho de um programa não é determinado apenas pelas entradas, mas por fatores externos (por exemplo, tipo de máquina, sistema operacional, eficiência do algoritmo codificado, utilização da CPU, tempos de acesso à memória etc.), alguns dos quais podem variar entre diferentes execuções de o teste na mesma máquina. Novamente, aqui estamos assumindo que os ambientes específicos em que o teste de desempenho é realizado são semelhantes ao ambiente real, a menos que façamos os testes de desempenho em todos os ambientes nos quais podemos executar o programa (e como podemos prever em quais máquinas alguém pode executar uma classificação algoritmo ativado em 10 anos?).
Θ(nlgn)Θ(n2)Θ(lgn)O(n)