Entendendo Algoritmos: Introdução a Algoritmos
Tags: algorithms, beginners, learning, dart
Published: 2023-10-05 20:57:11

> Ao longo da minha leitura do [Entendendo Algoritmos](https://www.amazon.com.br/Entendendo-Algoritmos-Ilustrado-Programadores-Curiosos/dp/8575225634), eu tenho revisitado muitos conceitos e técnicas que eu já havia me esquecido que existiam e algumas que eu nunca consegui entender (até agora haha). Dentro desse post (e em mais alguns outros q vão vir ao longo da minha leitura) eu vou trazer esses conceitos sob uma análise de estudos pessoais.

## O que é um algoritmo?
O mais simples possível é que:

> "Um algoritmo é um conjunto de instruções que realizam uma tarefa."

Os algortmos são utilizados para facilitar o processo de resolver um problema. 

Dado que, em um contexto de programação, um problema pode se repetir várias vezes em diferentes partes do seu sistema (ou da sua jornada técnica), ter uma solução (ou um meio para chegar na sua solução) já pré-definido aceleraria e facilitaria mais o processo, correto? 

Bem, é ai que os algoritmos entram. Contudo, eles não se limitam à isso.

> "Cada trecho de código poderia ser chamado de um algoritmo."

## Porquê algoritmos são importantes?

Antes de partirmos para a prática, vamos entender porque é importante entendermos como os algoritmos funcionam.

Vamos imaginar um **problema** onde eu precise verificar se (a + b) é par.

Com certeza, deve ter várias maneiras de implementar uma solução para esse problema. Mas como eu sei se uma solução é melhor que outra?

Ainda que ambas retornem o resultado correto, uma pode ser mais rápida, a outra pode gastar menos memória. 

A partir do estudo de algoritmos, podemos aprender diversas técnicas de análise que nos permitam comparar soluções e definir qual delas faz mais sentido para resolver o problema.

> Ex: Ao precisar verificar se (a +b) é par. Se eu adicionar que preciso do resultado em até 2ms. De todos as soluções existentes, quais delas ainda solucionaria o meu problema?

Por isso é importante nos aprofundarmos além do que o algoritmo faz, e levar em conta também, como ele funciona.

## Solucionando problemas com Algoritmos

Agora sim, vamos para prática! O primeiro algoritmo que vamos dar uma analisada é o de Pesquisa Binária. Ele facilita o processo de busca em listas ordenadas.

### Pesquisa Binária

Vamos introduzir com um exemplo que o livro trás:

> Você está procurando um nome (Mabel) em uma agenda com 100 contatos. Você poderia começar da letra A e ir descendo até chegar na letra M. Mas, é mais provável que você comece ali pela metade da lista, porquê é mais perto de onde a letra M fica.

Bem.. vamos destrinchar:

**Problema:** Achar um nome na minha agenda de contatos.

**Solução:** Começar da metade da lista para achar o resultado mais rápido.

Isso tem nome e é **Pesquisa Binária**.

> "Pesquisa Binária é um algoritmo de busca que recebe uma lista ordenada de elementos e retorna a localização do item que você está buscando, caso ele esteja na lista."

Então... 

> Ex: Se entre 1 e 10, eu quero saber onde está o número 5, ele vai me retornar a posição dele da lista. E se eu quiser saber onde está o número 21, ele não vai me retornar nada.


#### Porquê Pesquisa Binária e não Pesquisa Simples?

Lembra do exemplo das diversas soluções para verificar se (a + b) é par? Então, mesmo conceito. Ao comparar ambas, a Pesquisa Binária vai resolver meu problema da agenda de contatos muito mais rápido.

Mas... como eu sei que isso é verdade?

Na Pesquisa Simples, o que pode acontecer é:

> Ex 1: Eu querer o nome Aaron e o algoritmo ir la num pulo e me devolver que é o primeiro contato da lista. 

> Ex 2: Eu querer o nome Zakarias, o último contato.

E é ai (Ex 2) que as coisas complicam...

Na Pesquisa Simples, meu algoritmo vai ir la, de um em um, até o fim da lista para poder me falar, que Zakarias ta lá na última posição, levando mais tempo. 

Já na Pesquisa Binária, começando pelo meio, **se o nosso chute  não for a resposta, é só verificar se ta mais para cima ou para baixo, eliminar a outra metade e partir do meio novamente**.

> Ex: Eu ainda quero o contato de Zakarias (100). Se começarmos do contato 50, vemos que o 100 ta mais pra cima. Então agora, eu busco entre 50 e 100, e minha nova metade é 75. E assim sucessivamente até que o resultado seja exibido.

Então, enquanto na Pesquisa Simples, foi preciso 99 etapas. Na Pesquisa Binária, foi preciso somente 7. Uma baita diferença né?!

> Obs: O número de etapas de uma Pesquisa Simples é igual ao tamanho da lista (n). Enquanto o número de etapas de uma Pesquisa Binária é log<sub>2</sub>(n).

#### Como implementar um algoritmo de Pesquisa Binária?

O exemplo abaixo foi originalmente implementado no livro. A única coisa alterada é a sintaxe, pois abaixo está em #Dart.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tbh6xrui69bopu4prqic.png)