O que são algoritmos? Parte 1
52
0

O que são algoritmos? Parte 1

Ele apresentou a primeira solução sistemática das equações lineares e quadráticas. É considerado o fundador da Álgebra, um crédito que compartilha com Diofante. No século XII, traduções para o latim de sua obra sobre numerais indianos apresen...

Vanny
11 min
52
0
Tela do VISUALG, linguagem próxima ao portugol
Tela do VISUALG, linguagem próxima ao portugol

O nome algoritmo vem do nome Al-Khwarizmi que foi um matemático, astrônomo, geógrafo e autor persa. Conhecem-se poucos detalhes de sua vida, basicamente de que ele era um erudito na Casa da Sabedoria de Bagdade.

Estátua de al-Khwãrizmi na universidade Amir Kabir em Tehran.
Estátua de al-Khwãrizmi na universidade Amir Kabir em Tehran.

Ele apresentou a primeira solução sistemática das equações lineares e quadráticas. É considerado o fundador da Álgebra, um crédito que compartilha com Diofante. No século XII, traduções para o latim de sua obra sobre numerais indianos apresentou a notação posicional decimal para o Mundo Ocidental. Revisou a geografia de Ptolomeu e escreveu sobre astronomia e astrologia.

Suas contribuições tiveram um grande impacto sobre a linguagem. "Álgebra" é derivado de al-jabr, uma das duas operações que ele usou para resolver equações quadráticas. O radical de algarismo e algoritmo vem de algoritmi, a forma latina de seu nome. Além do português algarismo, seu nome também deu origem ao espanhol guarismo.

E é dai que tiramos o nome Algoritmo, até soa parecido né? Agora tente falar o nome dele três vezes sem parar.

Al-Khwarizmi, Al-Khwarizmi, Al-Khwarizmi...

Talvez ele apareça do nada com o seu mapa astral pronto.
Talvez ele apareça do nada com o seu mapa astral pronto.

Um dos primeiros algoritmos criados foi o algoritmo de Euclides é um método simples e eficiente de encontrar o MDC, para quem lembra ou prestou atenção nas aulas de matemática vai lembrar disso. MDC significa máximo divisor comum entre dois números inteiros diferentes de zero. É um dos algoritmos mais antigos, conhecido desde por volta de 300 antes de Cristo. Neste algoritmo não exige qualquer fatoração.

O MDC de dois números inteiros é o maior número inteiro que divide ambos sem deixar resto. O algoritmo de Euclides é baseado no princípio de que o MDC não muda se o menor número for subtraído ao maior. Por exemplo, 21 é o MDC de 252 e 105 (252 = 21 × 12; 105 = 21 × 5); já que 252 − 105 = 147, o MDC de 147 e 105 é também 21. Como o maior dos dois números é reduzido, a repetição deste processo irá gerar sucessivamente números menores, até convergir em zero.

Mas o que é um algoritmo? É só matemática isso? Mas Vanny, você disse que não precisa de ser crânio em matemática para se trabalhar com Tecnologia da Informação!

Okaaaay! Vamos com calma!

A definição de um algoritmo é: Sequência de instruções ordenada com o objetivo de resolver um problema.

Pense nisso como um manual de instruções para montar um móvel. Você tem todos os passos e até mesmo o requerimento de quais ferramentas usar para chegar na solução do seu “problema”, que é a montagem final do seu móvel.

Pense nisso como um manual de instruções para montar um móvel. Você tem todos os passos e até mesmo o requerimento de quais ferramentas usar para chegar na solução do eu problema, que é a montagem final do seu móvel.

Já sou profissional em montar móveis da Ikea...
Já sou profissional em montar móveis da Ikea...

Você precisará ordenar e encaixar as peças e utilizar ferramentas que vão te ajudar a colocar as coisas nos lugares certos e as vezes você precisa seguir uma ordem, se não tudo dará errado. Ou não... Talvez dê certo. E vou explicar o porque com a analogia abaixo.

Até mesmo podemos comparar um algoritmo com uma receita de bolo, onde se é passada as informações e você tem que seguir as instruções, por exemplo, um bolo não é bolo se você esquecer de colocar fermento. É um dos principais ingredientes. Os demais, podem até ser substituídos, como por exemplo o ovo, o leite e qualquer outro ingrediente, mas se caso você esquecer o fermento, isso não será um bolo, talvez um brownie.

Email image

O mesmo acontece quando se tem dois desenvolvedores diferentes e um problema em comum, se colocarmos o mesmo problema para que ambos o resolvam, nenhum deles vai fazer um código exatamente do mesmo jeito que o outro. Cada um tem um jeito diferente de se resolver um problema, de se raciocinar e isso não quer dizer que ambos estejam errados, apenas soluções diferentes para um problema comum.

Se substituir algo aqui, colocar algo desnecessário ali, faz parte. No fim das contas, o bolo sai. Talvez não com o mesmo sabor, textura ou aparência esperado. O mesmo se aplica a um código, talvez um seja mais rápido e eficiente que o outro.

Imagem do show Nailed It! da Netflix
Imagem do show Nailed It! da Netflix

ALGORITMO x PROGRAMA

Muitas pessoas confundem algoritmo com programa de computador, o que não tem nada a ver uma coisa com a outra. Nós usamos o computador para poder executar o algoritmo. E isso é devido ao fato do computador ser mais rápido e preciso na hora de processar isso do que um ser humano. Mas antes de passar para um programa que vá compilar, primeiramente, o algoritmo deve ser transcrito para uma linguagem de programação qualquer antes do computador executar. Ou seja, a linguagem de programação não é o algoritmo em si, você traduz seu algoritmo para os comandos da determinada linguagem. O algoritmo é a lógica por trás do seu código e o programa de computador ou computador executa esses “comandos”. Já que recebeu instruções em uma linguagem em que o computador entenda. Nem todos desenvolvedores criam algoritmo para depois criar seu código na linguagem utilizada, mas é uma boa prática, principalmente para quem está no começo da carreira.

Tenho uma outra analogia:

Saudades Ra Tim Bum!
Saudades Ra Tim Bum!

O português, o alemão e o tradutor.

Vocês estão em uma reunião, você não fala alemão e o alemão não fala português. Mas existe uma terceira pessoa que fala ambas as línguas. É como se eu fosse o algoritmo, o alemão seria o computador e o tradutor seria o compilador. Eu posso estar falando a mesma coisa que o alemão, porém, não conseguimos nos entender por conta da barreira de idioma e é ai que o tradutor entra em jogo, traduzindo do português para o alemão e assim fazendo com que nós dois entremos em um acordo e todo mundo se entende.

Voltando ao mundo dos algoritmos... esse código escrito numa linguagem de programação deve ser transformado num programa executável num computador, portanto esse programa deverá ser compilado (chamado de processo de validação da sintaxe utilizada) e linkeditado (chamado de processo de montagem do programa executável).

O processo de criação de um programa deveria seguir essa lista (mas nem sempre isso ocorre ou ocorre dessa forma e nessa ordem), vocês vão aprender sobre esse ciclo nas aulas de engenharia de software, então prestem atenção nessas aulas (se caso o seu curso oferece essa matéria).

  1. Análise do problema
  2. Projeto do programa
  3. Implementação
  4. Testes
  5. Verificação

A intenção de criar um programa geralmente é para resolver um problema. E o primeiro passo para se resolver isso é compreendê-lo completamente.

O nosso instinto é de tentar resolver a coisa toda de uma vez só o que gera frustrações e desistência, principalmente nas primeiras aulas de algoritmos ou de qualquer outra linguagem de programação.

Nesse processo de compreensão é importante fazer rascunhos, escrever e fazer brainstorms. Sério, vá em um papelaria e comprei um caderninho para você, bote um apelido nele, chame de lindo e cuide bem dele. Eu sei que você tem bloco de notas no computador, mas acredite, esse método oldschool é muito mais eficaz.

E quando você estiver rascunhando, pare, pense e faça perguntas para si mesmo como: “O que eu sei até agora?""O que falta descobrir ou calcular? E qual será o objetivo disso?” "O que eu tenho disponível de dados? São suficientes?” Dentre outras perguntas... E óbvio, anote tudo, inclusive suas respostas. Faça gráficos e tudo o que você sentir que deve ser feito, tudo para facilitar seu trabalho na resolução do problema. E assim você dá um ponta pé inicial nessa compreensão para chegar numa estratégia.

Email image

O algoritmo nada mais é que uma forma de representar a lógica que queremos passar, como tudo nessa vida, devemos parar e pensar por etapas, então rascunhos são importantes, como quando começamos a aprender matemática e usávamos aqueles pauzinhos para poder ajudar a fazer aquela conta matemática fazer algum sentido em nossas cabeças. Então antes de construir o algoritmo, precisamos definir uma estratégia.

Estratégia > Algoritmo > Programa

E para montarmos uma estratégia temos que ser inteligentes e pensar em modos de facilitar nossas vidas, como vamos ver mais para frente nas aulas de banco de dados, algumas queries que usamos não são tão eficientes quando rodamos pela primeira vez, principalmente se não colocados as clausuras de “filtramento” corretamente, isso fará o uso desnecessário da memória, quando pegamos um atalho, tudo fica mais rápido e fácil. 
Então quando vamos criar uma estratégia, pense se você já resolveu algum problema similar. Se sim, qual? E tente customizar essa solução para se adequar a este novo problema. Você pode aproveitar como referência, provavelmente você precisará introduzir novos elementos ou modificar os existentes. É por isso que eu sempre digo que em toda a minha carreira eu nunca usei muita matemática, pois geralmente a fórmula que eu preciso já existe em algum lugar na internet e se você pode facilitar o seu trabalho, porque não?  

A solução está ai e isso não te faz menos inteligente. Te faz poupar tempo e se caso a solução não exista em lugar nenhum... Trate de documentar e compartilhar com a comunidade, pois, COM TODA A CERTEZA você vai usar da ajuda virtual em algum ponto de sua vida. Então vamos compartilhar o pão com os irmãos!

Agora, se esse é um problema muito complexo e complicado, que você não consegue achar alguma solução, referência ou problemas parecidos já trabalhado antes, a melhor maneira é quebrar o problema em partes.

Voltando ao exemplo da montagem do móvel, temos que montar uma cômoda, como eu montei semanas atrás em minha casa. Você não consegue montar sozinho o negócio todo de uma vez só, é preciso fazer por partes. Primeiro se monta a estrutura de baixo, depois se encaixam as laterais e assim a parte superior. E por final, você pode montar cada gaveta. No fim do processo, você tem a cômoda completa e encaixada, já que você fracionou o problema em partes.

Você quebrou o problema em partes menores e de solução mais simples.E mais uma vez, não tem uma ordem especifica e talvez sua solução não é a mais rápida e eficiente, porém, resolve o problema.

Uma frase que Jorge Surian disse e que eu nunca vou esquecer 

“Descer uma escada de costas é bem mais complicado do que da maneira natural e chegamos sempre ao mesmo lugar.”

Como eu disse, rascunhar é essencial inclusive para saber se a sua lógica realmente faz algum sentido e isso se chama “Teste de Mesa” ou “Simulação”.

  • Escreva em um papel um algoritmo informal com instruções que em sua cabeça fazem sentido ou que talvez pareça resolver seu problema.
  • Em seguida verifique se cada passo desse algoritmo está correto o simulando.
  • Identifique os erros e os trate um por vez, sem nunca perder de vista o objetivo real do programa. 

Esse processo ordenado logicamente faz você aprender a desenvolver soluções.

Quando se elabora um esboço da solução do problema, para em seguida ir-se refinando essa solução, até chegar-se a uma sequência básica de operações que resolva o problema, usou-se uma das principais técnicas relacionadas a construção de algoritmos, intitulada Top-Down.

Essa técnica leva a geração de um pseudocódigo, que chamam de Português Estruturado que na opinião da maioria dos autores de livros de análise, programação ou algoritmos é muito mais eficaz que fluxogramas (estes são muito úteis em administração, o que não é nosso caso).

Já o projeto do programa nada mais é que o algoritmo gerado, que visará otimizar tempo-espaço visando obter um programa que apresente um tempo de execução mínimo e com o melhor aproveitamento de espaço de memória, aquilo que eu citei anteriormente sobre executar queries complexas que tomam memória.

Ja a fase de implementação é sua transcrição desse algoritmo para uma linguagem de programação. A implementação pode ser trivial, com a mera substituição de instruções algorítmicas em instruções em uma linguagem ou muito trabalhosa, dependendo da linguagem escolhida.

A fase de testes é bem importante, muitos desenvolvedores não fazendo isso, por isso muitas empresas tem equipes de teste. Se o analista tivesse percebido essas deficiência, provavelmente o programa não apresentaria esses problemas.

Existem várias técnicas para testes conhecidos como caixa branca, caixa preta, entre vários outros. Então vamos ver algumas dessas formas mais para frente, pois quem está na faculdade precisará e muito aprender a testar seus próprios códigos, pois se vocês pegarem professores como os meus, vocês definitivamente estão lascados para provarem que o seu código funciona.

A etapa de verificação do programa visa demonstrar que o algoritmo realmente resolve o problema proposto, qualquer que seja sua instância ou situação imposta. Ou seja, que o programa resolve TODOS os casos possíveis. Pois não adianta apenas pensar em uma saída, quando se pode ter outras que vão chegar no mesmo problema inicial. Rascunhar sobre os possíveis erros e problemas também é essencial.

Tem uma frase também que diz:

“todo problema complexo, aparentemente tem uma solução simples, que usualmente está errada...”.

Por agora fiquem com os vídeos sobre algoritmos em meu canal e até a próxima parte deste post!

O QUE SÃO ALGORITMOS? PARTE 1

O QUE SAO ALGORITMOS? PARTE 2

O QUE SAO ALGORITMOS? PARTE 2