Compreendendo Algoritmos: Do Input ao Output com Exemplos Práticos

Compreendendo Algoritmos: Do Input ao Output com Exemplos Práticos
Photo by Markus Spiske / Unsplash

Algoritmos são conjuntos de instruções passo a passo usados para realizar uma tarefa ou resolver um problema. Eles são fundamentais em programação e podem ser aplicados de várias maneiras, dependendo do problema e dos dados disponíveis. Vamos explorar dois tipos de algoritmos usando o exemplo de um livro de contatos para buscar um número de telefone.

1. Algoritmo de Busca Linear:
Imagine um livro de contatos onde você procura um número de telefone, página por página.

Input: Livro de contatos, nome da pessoa cujo número de telefone você deseja encontrar.

Algoritmo:

  1. Comece na primeira página do livro.
  2. Leia o nome na página.
  3. Se o nome for o que você está procurando, pegue o número de telefone e termine.
  4. Se não for, vá para a próxima página e repita o passo 2.
  5. Se chegar ao final do livro sem encontrar o nome, o número não está no livro.

Output: Número de telefone da pessoa ou uma indicação de que o número não está no livro.

2. Algoritmo de Busca por Saltos:
Agora, imagine que você decide pular páginas para acelerar a busca, pulando de duas em duas páginas.

Algoritmo:

  1. Comece na primeira página do livro.
  2. Leia o nome na página.
  3. Se o nome for o que você está procurando, pegue o número de telefone e termine.
  4. Se não for, pule uma página e vá para a próxima (ou seja, vá para a terceira página, depois a quinta, e assim por diante).
  5. Se chegar ao final do livro sem encontrar o nome, volte uma página e comece a busca linear a partir daí.

Output: Número de telefone da pessoa ou uma indicação de que o número não está no livro.

3. Algoritmo de Busca Binária (para Dados Organizados):
Se o livro de contatos estiver organizado alfabeticamente, você pode usar a busca binária.

Algoritmo:

  1. Abra o livro no meio.
  2. Veja o nome na página aberta.
  3. Se o nome for anterior alfabeticamente ao que você procura, abra a metade posterior do livro e repita a partir do passo 1.
  4. Se for posterior, abra a metade anterior do livro e repita a partir do passo 1.
  5. Se você encontrar o nome, pegue o número de telefone.
  6. Se as páginas acabarem sem encontrar o nome, o número não está no livro.

Output: Número de telefone da pessoa ou uma indicação de que o número não está no livro.

4. Algoritmo para Dados Não Organizados:
Para um livro de contatos não organizado, a busca binária não é eficaz. Nesse caso, a busca linear ou por saltos seria mais apropriada.


A escolha do algoritmo depende da natureza dos dados e do problema a ser resolvido. Enquanto a busca linear e por saltos são mais adequadas para dados não organizados ou quando a ordem dos dados é desconhecida, a busca binária é eficiente para dados organizados. Compreender e aplicar o algoritmo correto pode significativamente acelerar a solução de problemas e a realização de tarefas.

Complexidade de algoritmo


A complexidade de um algoritmo é uma medida fundamental para entender quão eficiente ele é em termos de tempo e espaço. A notação Big O é uma forma de descrever essa complexidade, focando no pior cenário possível à medida que o tamanho do problema aumenta. Vamos explorar como diferentes algoritmos se comportam em relação ao tamanho do problema e visualizar isso com gráficos.

Notação Big O:

  • A notação Big O descreve a complexidade de um algoritmo em termos do pior cenário possível.
  • Ela é expressa em termos de como o tempo de execução ou o espaço necessário cresce com o tamanho do input (n).

Exemplos Comuns de Complexidade de Algoritmo:

  1. O(n): Tempo de execução cresce linearmente com o tamanho do input.
  2. O(n/2): Semelhante a O(n), mas com uma constante que reduz o tempo pela metade. Na prática, ainda é considerado O(n).
  3. O(log n): Tempo de execução cresce logaritmicamente, eficiente para grandes conjuntos de dados.
  4. O(n^2): Tempo de execução cresce quadraticamente, comum em algoritmos de ordenação como bubble sort.

Visualizando com Gráficos

Como o tempo de execução desses algoritmos varia com o tamanho do problema (n):

| Tamanho do Problema (n) | O(n) | O(n/2) | O(log n) | O(n^2) |
|-------------------------|------|--------|----------|--------|
| 1                       | 1    | 0.5    | 0        | 1      |
| 2                       | 2    | 1      | 1        | 4      |
| 4                       | 4    | 2      | 2        | 16     |
| 8                       | 8    | 4      | 3        | 64     |
| 16                      | 16   | 8      | 4        | 256    |
| 32                      | 32   | 16     | 5        | 1024   |
| 64                      | 64   | 32     | 6        | 4096   |

Analisando a Complexidade:

  • O(n): Aumenta diretamente com n. Exemplo: busca linear.
  • O(n/2): Embora teoricamente mais rápido que O(n), na prática, é considerado O(n) devido à constante.
  • O(log n): Muito eficiente para grandes n. Exemplo: busca binária.
  • O(n^2): Cresce rapidamente com n, tornando-se ineficiente para grandes conjuntos de dados.

Conclusão:
Entender a complexidade de um algoritmo é crucial para otimizar programas e escolher a abordagem correta para um problema. A notação Big O nos ajuda a prever como o tempo de execução ou o uso de espaço escala com o tamanho do input, permitindo uma análise mais informada e decisões de design mais eficientes.

Read more