Saiba como medir a complexidade do seu código apenas lendo ele!
Olá, me chamo Felipe Alves, e sou estudante de Análise e Desenvolvimento de Sistemas no IFRN, e hoje vim lhes apresentar uma forma muito eficiente, de medir a eficiência do seu código. Durante meus estudos de Algoritmos na faculdade, também no meio dos estudos para programação competitiva, aprendi sobre a Notação Big(Oh), que vou lhe explicar no decorrer do artigo.
Mas porque me preocupar com a eficiência do meu código se ele funciona?
Hoje em dia, a eficiência do código é levado muito em consideração para as empresas, tendo em vista que quanto mais eficiente, mais rápido e constante ele fica independente do tamanho da entrada dos dados. Analistas e Engenheiros de Software sempre buscam formas de melhorar a eficiência do código produzido pelo Desenvolvedor, procurando entre estruturas de dados ou algoritmos mais adequados para solucionar aquele problema com mais eficiência.
Que algoritmos e estruturas são essas que você se refere?
Existem vários tipos de algoritmo e de estruturas de dados, porém existem os mais comuns e utilizados no mundo da programação, recomendo estudá-las e aprenderem sobre, aqui estão eles:
- Algoritmos:
- Busca - Busca Linear; Busca binária.
- Ordenação - Bubble sort; Insertion sort; Selection sort; Quick sort.
- Estruturas de Dados:
- Lineares - Array/Vetor; Lista; Fila; Pilha.
- Não Lineares - Árvore; Grafo.
Notação Big(Oh)
A notação Big(Oh) é usado para medir a complexidade do código usando álgebra, para limitar a eficiência de uma função no seu PIOR CASO, ou seja, no caso onde a entrada faça o código executar mais operações, que normalmente é quanto maior o tamanho da entrada, assim podemos dizer que o código está limitado a no máximo aquele nível de complexidade.
Quais são os níveis de complexidade?
Existem muitos, podendo depender de mais de uma entrada, porém como na maioria das vezes depende somente de uma, aqui estão as mais comuns, com suas explicações logo abaixo:
Sendo o eixo X o tamanho da entrada e o eixo Y o tempo de execução, essa é a representação mais fiel das complexidades da notação Big(Oh).
- Função constante - O(1): Esta é a única complexidade que não depende da entrada para medir seu desempenho, sendo sua eficiência constante em todos os casos.
- Função logarítmica - O(log(N)): A função logarítmica é a mais buscada tendo em vista que a maioria dos algoritmos dependem de sua entrada e a O(log(n)) é a que melhor desempenha dependendo da entrada como se vê no gráfico, sua linha com uma curvatura para baixo.
- Função linear - O(N): A função linear segue um ritmo constante de subida em seu tempo de execução mediante ao tamanho da entrada, sendo de certa forma eficiente, mas em entradas muito grandes, seu desempenho tende a piorar.
- Função log-linear - O(N log(N)): A função log-linear tem uma eficiência parecida com a O(N), porém o que muda é a sua capacidade de crescimento no tempo de execução mediante ao tamanho da entrada, tendo uma curva de crescimento ligeiramente maior e ligeiramente menos constante que a linear.
- Função quadrática - O(N^2): A função quadrática já começa a demonstrar uma curvatura maior mediante ao seu tamanho da entrada, já que, pelo seu nome, cresce quadraticamente ao valor de N, tornando-a pouca eficiente em entradas ligeiramente maiores, essa função pode variar de valor, como se mostra a polinomial no gráfico, podendo ser O(N^3), O(N^4), O(N^...).
- Função exponencial - O(2^N): A função exponencial é a segunda pior entre as principais, tendo quase que uma subida em linha reta no seu tempo de execução de acordo com a sua entrada, sendo pouca recomendada para algoritmos que tendem a não receber entradas menores como seu pior caso.
- Função fatorial - O(N!): Tendo o título de pior nível de complexidade, a função fatorial é mal desempenhada até em algumas das menores entradas, sendo evitada pelos analistas, engenheiros e desenvolvedores, que procuram formas de melhorar a eficiência do algoritmo.
Considerações finais
Sei que hoje como estudante e no futuro como desenvolvedor ou analista, a Análise de Algoritmos vai me fazer ser mais bem visto pelo meu conhecimento em Estruturas de Dados, Algoritmos e na Notação Big(Oh), e agora desafio vocês a aprenderem sobre e ficarem como eu, tendendo a ficar vendo a complexidade de todos os meus códigos por instinto próprio, é muito divertido reduzir a complexidade de um código e deixá-lo mais eficiente!