edubun
Português

O que é um algoritmo

O método para achar o máximo divisor comum do Livro VII dos Elementos de Euclides, escrito há cerca de 2300 anos, ainda roda nos computadores hoje.

Um método que sempre funciona

Imagine que você precisa do maior número que divide tanto 1071 quanto 462. Você poderia testar todos os números de 462 até 1 e parar no primeiro que dividisse os dois. Funciona, mas pode levar centenas de tentativas. Há um jeito mais curto. Divida 1071 por 462 e guarde o resto, 147. Agora divida 462 por 147 e guarde o resto, 21. Divida 147 por 21: o resto é 0, então a resposta é 21. Três divisões em vez de várias centenas.

Esse jeito mais curto é um algoritmo: uma lista finita de passos precisos que recebe uma entrada e produz a saída certa. Este é o algoritmo de Euclides para o máximo divisor comum, e ele aparece no Livro VII dos Elementos, escrito por volta de 300 a.C. Euclides o descreveu com subtrações repetidas de comprimentos em vez de divisões, mas a ideia é a mesma, e a versão com restos é a que os programas usam hoje.

function gcd(a, b) {
  while (b !== 0) {
    const r = a % b;   // resto
    a = b;
    b = r;
  }
  return a;
}
console.log(gcd(1071, 462)); // mostra 21

O que faz de uma lista de passos um algoritmo

Livros didáticos como o de Cormen, Leiserson, Rivest e Stein descrevem um algoritmo como um procedimento bem definido que transforma uma entrada numa saída. Há três coisas guardadas nessa descrição, e cada uma importa quando você escreve código.

  • Preciso. Cada passo quer dizer uma coisa só. "Divida a por b e guarde o resto" é preciso; "faça os números ficarem menores de algum jeito" não é.
  • Finito. Ele precisa parar. No algoritmo de Euclides, o resto é sempre menor que o número pelo qual você dividiu, então ele diminui a cada volta e tem de chegar a 0.
  • Correto. Para toda entrada permitida, a saída é a resposta certa, não só nos exemplos que você testou.

Uma receita de cozinha costuma ser dada como exemplo do dia a dia, e é um exemplo justo: os ingredientes são a entrada, o prato é a saída e os passos estão em ordem. A diferença é o quanto quem lê completa sozinho. Um cozinheiro decide o que é "uma pitada". Um computador não decide nada, e é por isso que os algoritmos para computadores são escritos com cada passo explicado.

Mesmo problema, algoritmos diferentes

Um problema costuma ter muitos algoritmos corretos, e eles podem diferir enormemente na quantidade de trabalho que fazem. Para o máximo divisor comum de 1071 e 462, testar todos os números de 462 para baixo exige 442 tentativas até chegar a 21, enquanto o método de Euclides precisa de 3 divisões. Os dois estão corretos. Só um é rápido. Boa parte deste curso trata dessa segunda pergunta: depois que um método está correto, quantos passos ele leva, e como esse número cresce quando a entrada aumenta?

Para responder, os cientistas da computação contam passos básicos (uma comparação, uma troca, uma divisão) em vez de segundos. Os segundos dependem da máquina. Uma contagem de passos depende só do algoritmo e da entrada, então permite comparar dois métodos com justiça. O laboratório abaixo conta as comparações para você enquanto ordena uma fileira de barras. Experimente a mesma ordem inicial com dois métodos diferentes e observe os contadores.

Carregando

Arraste para girar. Role ou faça pinça para dar zoom.

Selection sort e insertion sort com os mesmos oito valores. Os contadores mostram quantas comparações e trocas cada um precisa.

Entradas, saídas e os passos entre elas

Antes de escrever um algoritmo, anote exatamente o que entra e o que precisa sair. Para o máximo divisor comum: a entrada são dois números inteiros positivos, e a saída é um número inteiro que divide os dois, sem que nenhum número maior faça o mesmo. Essa descrição diz como testar o resultado, e muitas vezes dá pistas dos passos. Ela também revela os casos extremos: e se um dos números for 0? (O laço acima devolve o outro número, que é a resposta certa.) E se os dois números forem iguais? Pensar nos casos extremos antes de rodar o código pega muitos erros.

ContextoA palavra algoritmo vem do nome de uma pessoa. Muhammad ibn Musa al-Khwarizmi trabalhou em Bagdá no século IX e escreveu um livro sobre como calcular com os algarismos hindus de 0 a 9. A tradução latina começa com as palavras "Dixit algorizmi", que querem dizer "al-Khwarizmi disse", e costuma ser chamada de "Algoritmi de numero Indorum". As formas latinas do nome dele, algorizmi e algoritmi, viraram a palavra para um método de cálculo passo a passo. O livro dele sobre como resolver equações nos deu outra palavra: álgebra. Muito depois, em 1843, Ada Lovelace publicou notas sobre a Máquina Analítica de Charles Babbage, que nunca foi construída; a última delas, a Nota G, explica passo a passo como a máquina poderia calcular os números de Bernoulli.
  • Por volta de 300 a.C.: Elementos de Euclides, Livro VII: o método do máximo divisor comum.
  • Século 9: Al-Khwarizmi, em Bagdá, escreve sobre os algarismos hindus; o nome latino dele dá origem à palavra algoritmo.
  • 1843: Nota G de Ada Lovelace: os passos para a Máquina Analítica calcular os números de Bernoulli.
  • 1945: John von Neumann propõe o merge sort.
  • 1959: Tony Hoare cria o quicksort em Moscou (publicado em 1961).
algoritmoUma lista finita de passos precisos que transforma uma entrada na saída certa
entradaOs dados de que um algoritmo parte
saídaO resultado que o algoritmo precisa produzir
corretoDá a saída certa para toda entrada permitida
finitoSempre para depois de um certo número de passos
máximo divisor comumO maior número inteiro que divide dois números exatamente
caso extremoUma entrada incomum, como 0, uma lista vazia ou valores iguais
contagem de passosQuantas operações básicas um algoritmo executa
  1. Usando o algoritmo de Euclides, qual é o máximo divisor comum de 48 e 18?
  2. Quantas divisões o algoritmo de Euclides precisa para 1071 e 462?
  3. Qual destas não é uma propriedade que todo algoritmo precisa ter?
    • Para depois de um número finito de passos
    • Cada passo é preciso
    • Usa um computador
    • Dá a saída certa para toda entrada permitida
  4. Por que o algoritmo de Euclides sempre para?
    • O resto é sempre menor que o divisor, então ele diminui até 0
    • Ele para depois de 10 voltas
    • Os computadores param os laços automaticamente
    • Os números crescem até ficarem iguais
  5. A palavra algoritmo vem do nome de
    • Euclides
    • Al-Khwarizmi
    • Ada Lovelace
    • Alan Turing
  6. Por que os cientistas da computação contam passos em vez de medir o tempo em segundos?
    • Os segundos dependem da máquina; a contagem de passos depende só do algoritmo e da entrada
    • Os relógios não são precisos
    • Os passos são sempre mais rápidos
    • Não dá para medir segundos no código
  7. Um método dá a resposta certa nos cinco exemplos que você testou. Ele está correto?
    • Sim, cinco exemplos provam
    • Não necessariamente: ele precisa acertar para toda entrada permitida
    • Só se for rápido
    • Só se usar um laço
  8. O que gcd(35, 0) devolve com o laço desta unidade?
  9. Em que ano Ada Lovelace publicou as suas notas, inclusive a Nota G?
    • 1801
    • 1843
    • 1945
    • 1961
  10. Ponha os passos do algoritmo de Euclides em ordem.
Pontos-chave
  • Um algoritmo é uma lista finita de passos precisos da entrada até a saída correta.
  • O algoritmo de Euclides acha um máximo divisor comum com restos repetidos.
  • Um problema pode ter muitos algoritmos corretos com contagens de passos muito diferentes.
  • Anote a entrada, a saída e os casos extremos antes dos passos.
  • A palavra vem do nome latino de al-Khwarizmi.
Fontes deste curso (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Data de verificação: 2026-10-17