Algoritmos, se você é desenvolvedor(a) já deve ter ouvido falar sobre, na faculdade ou em algum curso, geralmente se aprende junto com estrutura de dados, bom, em resumo algoritmo é uma sequência ou lista de instruções que você precisa seguir para resolver determinado problema ou executar uma determinada tarefa.

Sempre vejo o exemplo da receita de bolo para explicar algoritmos, bem não vou entrar nesse ponto até porque não conheço nenhuma receita de bolo, enfim, imagine que você está encarregado de entregar o resultado de uma turma de alunos, a tarefa é simples, calcular a média se for maior que 7 aprovado, se não reprovado.

O algoritmo, seria simples, você somaria as notas, e dividira pelo número de notas, isso repetidamente até acabar os alunos, simples não? Ex: Aluno fulano, tirou 7 e 5 nas notas, somaria 7+5=12, e dividiria a soma pelo número de notas 2, 12/2=6, a média é 6, pela regra é menor que 7, então fulano vai ter que repetir de ano, infelizmente!

Bem, agora vamos falar sobre o lado divertido e matemático dos algoritmos, a complexidade, imagine você conseguir analisar a complexidade do algoritmo para determinar seu comportamento quando a entrada for extremamente grande, sem a necessidade de um teste de estresse por exemplo, hoje sabemos que um software é composto por algumas milhares de linhas, mesmo os mais simples, tem bibliotecas com outras milhares de linhas, então é de extrema importância saber o comportamento de seu código.

Complexidade, não é um termo amigável, eu sei, e sempre que você ouve essa palavra começa a associar ela a funções e gráficos, e está correto. Bem, aqui não pretendo me aprofundar, só lhe convencer a se preocupar.

Quando falamos sobre complexidade de algoritmos, levamos em conta duas preocupações que devemos ter sempre que desenvolvemos algo, a primeira é o tempo. Já se perguntou dado uma entrada N, quanto tempo o seu código leva para executar? O segundo é o espaço. Já se perguntou por que alguns softwares consomem mais memória que outros (imagine aqui um software que faz exatamente a mesma coisa, e na mesma linguagem e computador)? Tempo e memória são caros, e se contarmos que tempo é dinheiro, seu código pode estar desperdiçando dinheiro ao quadrado.

Antes de encerrar, preciso esclarecer que linguagem e processador normalmente terá uma influência no desempenho e no tempo, o hardware em si vai influenciar, mas a ideia é ter uma forma abstrata de se prever o comportamento em contexto no pior caso por exemplo, em resumo, você vai descobrir o esforço que um computador terá que fazer para executar o seu código.

Espero que tenha despertado seu interesse sobre a complexidade de algoritmos, no próximo artigo irei falar sobre a notação Big O.

Obrigado, e até próxima!