Buscar

Algoritmo Wikipédia, a enciclopédia livre

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Política de privacidade Sobre a Wikipédia Avisos gerais Versão móvel Programadores Estatísticas Declaração sobre ''cookies''
Esta página foi editada pela última vez às 16h15min de 10 de setembro de 2021.
Este texto é disponibilizado nos termos da licença Atribuição-CompartilhaIgual 3.0 Não Adaptada (CC BY-SA 3.0) da Creative Commons; pode estar sujeito a condições
adicionais. Para mais detalhes, consulte as condições de utilização.
Algoritmo
Origem: Wikipédia, a enciclopédia livre.
Artigo Discussão Ler Editar Ver histórico
[ocultar]
Wiki Loves Monuments: Participe do maior concurso fotográfico do mundo enviando suas
imagens e ajude na preservação da nossa cultura!
Mais informação
 120 idiomas
Uma animação do algoritmo de
ordenação quicksort de uma matriz de
valores ao acaso. As barras vermelhas
marcam o elemento pivô. No início da
animação, estando o elemento para o lado
direito, é escolhido como o pivô
Fluxograma, um exemplo de algoritmo imperativo. O estado
em vermelho indica a entrada do algoritmo enquanto os estados
em verde indicam as possíveis saídas.
Imagem da torre de Hanói (com
três discos), mostrando como estariam
as peças no início e no fim da solução
Resolução da
torre de Hanói
(com três discos)
O wikilivro Introdução à
programação tem uma página
intitulada Algoritmos
A Wikiversidade possui cursos
relacionados a Algoritmo
[Esconder]� · � · �
A Wikipédia possui o:
Portal da Matemática
Em matemática e ciência da computação, um algoritmo é uma sequência finita de ações executáveis que
visam obter uma solução para um determinado tipo de problema.[1][2] Segundo Dasgupta, Papadimitriou e
Vazirani; "Algoritmos são procedimentos precisos, não ambíguos, padronizados, eficientes e corretos.".[3]
As suas características são: finitas, o algoritmo deve eventualmente resolver o problema; bem definidas:
os passos devem ser definidos de modo a serem entendidos; efetivas, deve sempre resolver o que tem
para solucionar, antecipando falhas.[4] 
O conceito de algoritmo existe há séculos e o uso do conceito pode ser atribuído a matemáticos russos,
por exemplo a Peneira de Eratóstenes e o algoritmo de Euclides.
O conceito de algoritmo é frequentemente ilustrado pelo exemplo de uma receita culinária, embora muitos
algoritmos sejam mais complexos. Eles podem repetir passos (fazer iterações) ou necessitar de decisões
(tais como comparações ou lógica) até que a tarefa seja completada. Um algoritmo corretamente
executado não irá resolver um problema se estiver implementado incorretamente ou se não for apropriado
ao problema.Jean Luc Chabert
Um algoritmo não representa, necessariamente, um programa de computador,[5] e sim os passos
necessários para realizar uma tarefa. Sua implementação pode ser feita por um computador, por outro tipo de autômato ou mesmo por um ser humano.
Diferentes algoritmos podem realizar a mesma tarefa usando um conjunto diferenciado de instruções em mais ou menos tempo, espaço ou esforço do
que outros. Tal diferença pode ser reflexo da complexidade computacional aplicada, que depende de estruturas de dados adequadas ao algoritmo. Por
exemplo, um algoritmo para se vestir pode especificar que você vista primeiro as meias e os sapatos antes de vestir a calça enquanto outro algoritmo
especifica que você deve primeiro vestir a calça e depois as meias e os sapatos. Fica claro que o primeiro algoritmo é mais difícil de executar que o
segundo apesar de ambos levarem ao mesmo resultado.Algorithmics
O conceito de um algoritmo foi formalizado em 1936 pela Máquina de Turing de Alan Turing e pelo cálculo lambda de Alonzo Church, que formaram as
primeiras fundações da Ciência da computação.
Índice [esconder]
1 Etimologia
2 Formalismo
2.1 Término do algoritmo
3 Exemplos
3.1 Torre de Hanói
3.1.1 Solução em forma narrativa
3.1.2 Solução em forma gráfica
4 Análise de algoritmos
5 Classificação
5.1 Classificação por implementação
5.2 Classificação por paradigma
5.3 Classificação por campo de estudo
5.4 Classificação por complexidade
6 Implementação
7 Programa de Computador
8 Tradutor e Interpretador
8.1 Tradutores
8.2 Processo de Compilação
8.2.1 Passos da compilação
8.3 Processo de Montagem
8.3.1 Por que usar uma Linguagem de Montagem?
8.3.2 Tarefas do montador
8.3.3 Montadores de dois passos
8.4 Ligação e Carregamento
8.4.1 Ligação
8.4.2 Carregamento
8.5 Interpretadores
9 Ver também
10 Referências
11 Bibliografia
12 Ligações externas
Etimologia
Os historiadores da palavra algoritmo encontraram a origem no sobrenome, Al-Khwarizmi, do matemático persa do século IX Mohamed ben Musa,[6]
cujas obras foram traduzidas no ocidente cristão no século XII, tendo uma delas recebido o nome Algorithmi de numero indorum, sobre os algoritmos
usando o sistema de numeração decimal (indiano). Outros autores, entretanto, defendem a origem da palavra em Al-goreten (raiz - conceito que se
pode aplicar aos cálculos).[7] "Álgebra" e "algorismo" também formam formas corrompidas da palavra, pois as pessoas esqueciam as derivações
originais. O dicionário "Vollständiges Mathematisches Lexicon" (Leipzig, 1747) refere a palavra "Algorithmus"; nesta designação estão combinadas as
noções de quatro cálculos aritméticos, nomeadamente a adição, multiplicação, subtração e divisão. A frase "algorithmus infinitesimalis" foi na altura
utilizada para significar; "maneiras de calcular com quantidades infinitésimas" (pequenas), uma invenção de Leibnitz. Também é conhecido no meio
financeiro, como "algos".[8]
Formalismo
Um programa de computador é essencialmente um algoritmo que diz ao computador os
passos específicos e em que ordem eles devem ser executados, como por exemplo, os
passos a serem tomados para calcular as notas que serão impressas nos boletins dos
alunos de uma escola. Logo, o algoritmo pode ser considerado uma sequência de
operações que podem ser simuladas por uma máquina de Turing completa.
Quando os procedimentos de um algoritmo envolvem o processamento de dados, a
informação é lida de uma fonte de entrada, processada e retornada sob novo valor após
processamento, o que geralmente é realizado com o auxílio de uma ou mais estrutura
de dados.[9]
Para qualquer processo computacional, o algoritmo precisa estar rigorosamente
definido, especificando a maneira que ele se comportará em todas as circunstâncias. A
corretividade do algoritmo pode ser provada matematicamente, bem como a quantidade
assintótica de tempo e espaço (complexidade) necessários para a sua execução. Estes
aspectos dos algoritmos são alvo da análise de algoritmos.
A maneira mais simples de se pensar um algoritmo é por uma lista de procedimentos
bem definida, na qual as instruções são executadas passo a passo a partir do começo
da lista, uma ideia que pode ser facilmente visualizada através de um fluxograma. Tal
formalização adota as premissas da programação imperativa, que é uma forma
mecânica para visualizar e desenvolver um algoritmo. Concepções alternativas para
algoritmos variam em programação funcional e programação lógica.
Término do algoritmo
Alguns autores restringem a definição de algoritmo para procedimentos que eventualmente terminam. Marvin Minsky constatou que se o tamanho de
um procedimento não é conhecido de antemão, tentar descobri-lo é um problema indecidível, já que o procedimento pode ser executado infinitamente,
de forma que nunca se terá a resposta. Alan Turing provou em 1936 que não existe máquina de Turing para realizar tal análise para todos os casos,
logo não há algoritmo para realizar tal tarefa para todos os casos. Tal condição é conhecida atualmente como problema da parada.
Para algoritmos intermináveis o sucesso não pode ser determinado pela interpretação da resposta e sim por condições impostas pelo próprio
desenvolvedor do algoritmo durante sua execução.
Exemplos
Alguns exemplos genéricos de algoritmos são: uma coreografia, um manual de instruções, uma receita
culinária, Técnicas para resolver problemas matemáticos, uma pesquisa na internet, dentre outros.
Torre de Hanói
Um clássico problemaque trabalha o desenvolvimento da lógica e do raciocínio matemático é a torre de Hanói,
inventado pelo matemático francês Édouard Lucas em 1883.[10] O quebra-cabeça é composto por três hastes e
vários discos de tamanhos diferentes, que podem deslizar para qualquer haste. O quebra-cabeça começa com
os discos em uma pilha organizada em ordem crescente de tamanho em uma haste, a menor no topo, fazendo
assim uma forma cônica.
Neste exemplo, toma-se o seguinte problema: tem-se três hastes. Umas das hastes serve de suporte para três
discos. Deseja-se mover todos os discos para outra haste, porém deve-se movimentar um disco de cada vez e
um disco maior nunca pode ser colocado sobre um disco de menor tamanho.
Solução em forma narrativa
Nomeiam-se as hastes como A, B e C e os discos como Vermelho, Verde e Azul. Considera-se que inicialmente os discos estão
na haste A. Segue uma sequência de passos para a resolução do quebra-cabeça:
1. move-se o disco Vermelho para a haste C;
2. move-se o disco Verde para a haste B;
3. move-se o disco Vermelho para a haste B;
4. move-se o disco Azul para a haste C;
5. move-se o disco Vermelho para a haste A;
6. move-se o disco Verde para a haste C;
7. move-se o disco Vermelho para a haste C.
Solução em forma gráfica
Podemos também representar a solução em forma gráfica, desenhando as hastes e a posição dos discos a cada movimento (ou
passo). Com 3 discos, o quebra-cabeça pode ser resolvido em 7 movimentos. O número mínimo de movimentos necessários para
resolver um quebra-cabeça da Torre de Hanói é , onde n é o número de discos.
Essa sequência, ou descrição, finita de passos ou tarefas é a quem chamamos de algoritmos.
Análise de algoritmos
Ver artigo principal: Análise de algoritmos
A análise de algoritmos é um ramo da ciência da computação que estuda as técnicas de projeto de algoritmos e os algoritmos de forma abstrata, sem
estarem implementados em uma linguagem de programação em particular ou implementadas de algum outro modo. Ela preocupa-se com os recursos
necessários para a execução do algoritmo tais como o tempo de execução e o espaço de armazenamento de dados. Deve-se perceber que para um
dado algoritmo pode-se ter diferentes quantidades de recursos alocados de acordo com os parâmetros passados na entrada. Por exemplo, se
definirmos que o fatorial de um número natural é igual ao fatorial de seu antecessor multiplicado pelo próprio número, fica claro que a execução de
fatorial(10) consome mais tempo que a execução de fatorial(5) .
Um meio de exibir um algoritmo a fim de analisá-lo é através da implementação por pseudocódigo em português estruturado, também conhecido no
Brasil como Portugol. Este código pode ser digitado dentro de algum editor de textos como o Bloco de Notas, anotado num caderno ou ainda poder
digitado diretamente dentro de um programa interpretador de algoritmos, como é caso do Visualg, que é um editor, interpretador e executor dos
algoritmos.
Classificação
Classificação por implementação
Pode-se classificar algoritmos pela maneira pelo qual foram implementados:
Recursivo ou iterativo - um algoritmo recursivo possui a característica de invocar a si mesmo repetidamente até que certa condição seja satisfeita
e ele é terminado, que é um método comum em programação funcional. Algoritmos iterativos usam estruturas de repetição tais como laços, ou
ainda estruturas de dados adicionais tais como pilhas, para resolver problemas. Cada algoritmo recursivo possui um algoritmo iterativo equivalente
e vice-versa, mas que pode ter mais ou menos complexidade em sua construção;
Lógico - um algoritmo pode ser visto como uma dedução lógica controlada. O componente lógico expressa os axiomas usados na computação e o
componente de controle determina a maneira como a dedução é aplicada aos axiomas. Tal conceito é base para a programação lógica;
Serial ou paralelo - algoritmos são geralmente assumidos por serem executados instrução a instrução individualmente, como uma lista de
execução, o que constitui um algoritmo serial. Tal conceito é base para a programação imperativa. Por outro lado existem algoritmos executados
paralelamente, que levam em conta as arquiteturas de computadores com mais de um processador para executar mais de uma instrução ao
mesmo tempo. Tais algoritmos dividem os problemas em subproblemas e o delegam a quantos processadores estiverem disponíveis, agrupando no
final o resultado dos subproblemas em um resultado final ao algoritmo. Tal conceito é base para a programação paralela. De forma geral, algoritmos
iterativos são paralelizáveis; por outro lado existem algoritmos que não são paralelizáveis, chamados então problemas inerentemente seriais;
Determinístico ou não-determinístico - algoritmos determinísticos resolvem o problema com uma decisão exata a cada passo enquanto
algoritmos não-determinísticos resolvem o problema ao deduzir os melhores passos através de estimativas sob forma de heurísticas;
Exato ou aproximado - enquanto alguns algoritmos encontram uma resposta exata, algoritmos de aproximação procuram uma resposta próxima a
verdadeira solução, seja através de estratégia determinística ou aleatória. Possuem aplicações práticas sobretudo para problemas muito
complexos, do qual uma resposta correta é inviável devido à sua complexidade computacional.
Classificação por paradigma
Pode-se classificar algoritmos pela metodologia ou paradigma de seu desenvolvimento, tais como:
Divisão e conquista - algoritmos de divisão e conquista reduzem repetidamente o problema em sub-problemas, geralmente de forma recursiva, até
que o sub-problema é pequeno o suficiente para ser resolvido. Um exemplo prático é o algoritmo de ordenação merge sort. Uma variante dessa
metodologia é o decremento e conquista, que resolve um sub-problema e utiliza a solução para resolver um problema maior. Um exemplo prático é
o algoritmo para pesquisa binária;
Programação dinâmica - pode-se utilizar a programação dinâmica para evitar o re-cálculo de soluções já resolvidas anteriormente;
Algoritmo ganancioso - um algoritmo ganancioso é similar à programação dinâmica, mas difere na medida em que as soluções dos sub-
problemas não precisam ser conhecidas a cada passo, uma escolha gananciosa pode ser feita a cada momento com o que até então parece ser
mais adequado;
Programação linear - A resolução de um problema através de programação linear envolve a maximização / minimização das entradas de um
conjunto de desigualdades lineares;
Redução - a redução resolve o problema ao transformá-lo em outro problema. É chamado também transformação e conquista;
Busca e enumeração - vários problemas podem ser modelados através de grafos. Um algoritmo de exploração de grafo pode ser usado para
caminhar pela estrutura e retornam informações úteis para a resolução do problema. Esta categoria inclui algoritmos de busca e backtracking;
Paradigma heurístico e probabilístico - algoritmos probabilísticos realizam escolhas aleatoriamente. Algoritmos genéticos tentam encontrar a
solução através de ciclos de mutações evolucionárias entre gerações de passos, tendendo para a solução exata do problema. Algoritmos
heurísticos encontram uma solução aproximada para o problema.
Classificação por campo de estudo
Cada campo da ciência possui seus próprios problemas e respectivos algoritmos adequados para resolvê-los. Exemplos clássicos são algoritmos de
busca, de ordenação, de análise numérica, de teoria de grafos, de manipulação de cadeias de texto, de geometria computacional, de análise
combinatória, de aprendizagem de máquina, de criptografia, de compressão de dados e de interpretação de texto.
Classificação por complexidade
Ver artigo principal: Complexidade computacional
Alguns algoritmos são executados em tempo linear, de acordo com a entrada, enquanto outros são executados em tempo exponencial ou até mesmo
nunca terminam de serem executados. Alguns ditos problemas tem múltiplos algoritmos enquanto outros não possuem algoritmos para
resolução.Jesús Bisbal Riera
Implementação
Algoritmos podemser implementados em circuitos elétricos ou até mesmo em dispositivos mecânicos (autômatos).Mania dos inventores do século XIX,
os autômatos eram máquinas totalmente mecânicas, construídas com a capacidade de serem programadas para realizar um conjunto de atividades
autônomas. Em 2011, o filme A Invenção de Hugo Cabret (tradução brasileira) do cineasta Martin Scorsese traz a história do ilusionista Georges Méliès
precursor do cinema e um colecionador de autômatos, sendo uma de suas máquinas o fio condutor desta história. O autômato específico era capaz de
desenhar a cena emblemática do seu filme "Viagem à Lua".
Entretanto, a maioria dos algoritmos são desenvolvidos para programas de computador, para isto, existe uma grande variedade de linguagens de
programação, cada uma com características específicas que podem facilitar a implementação de determinados algoritmos ou atender a propósitos mais
gerais.
Programa de Computador
Ada Lovelace escreveu o primeiro algoritmo para ser processado por uma máquina, a máquina analítica de Charles Babbage. Um programa de
computador é essencialmente um algoritmo que diz ao computador os passos específicos e em que ordem eles devem ser executados.Usando o
Pseudocódigo (uma linguagem simples, nativa a quem o escreve, de forma a ser entendida por qualquer pessoa) que é uma forma genérica de
escrever o algoritmo, sem necessidade de conhecer a sintaxe de nenhuma linguagem de programação. Um exemplo de pseudocódigo é o Portugol,
que utiliza o compilador VisuALG.[11] O VisuAlg é um programa que edita, interpreta e executa algoritmos com uma linguagem próxima do português
estruturado como um programa normal de computador. É um programa de livre uso e distribuição, empregado no ensino de programação em várias
escolas e universidades no Brasil e no exterior. Quando os procedimentos de um algoritmo envolvem o processamento de dados, a informação é lida
de uma fonte de entrada, processada e retornada sob novo valor após processamento, o que geralmente é realizado com o auxílio de um conjunto de
instruções e estrutura de dados.Um exemplo, para ser feito nas escolas é fazer os passos a serem tomados para calcular as notas que serão
impressas nos boletins dos alunos de uma escola, informando se o aluno foi aprovado ou reprovado.
Exemplo:
algoritmo "exemplo de cálculo de média de notas"
// Seção de Declarações
var
NOTA1, NOTA2, NOTA3, NOTA4, MEDIA
inicio
// Seção de Comandos
ESCREVA ("DIGITE A PRIMEIRA NOTA: ")
LEIA (NOTA1)
ESCREVA ("DIGITE A SEGUNDA NOTA: ")
LEIA (NOTA2)
ESCREVA ("DIGITE A TERCEIRA NOTA: ")
LEIA (NOTA3)
ESCREVA ("DIGITE A QUARTA NOTA: ")
LEIA (NOTA4)
MEDIA = (NOTA1 + NOTA2 + NOTA3 + NOTA4) / 4
SE MEDIA <= 6,9 ENTAO
 ESCREVA ("A MEDIA DO ALUNO FOI: ", MEDIA)
 ESCREVA (" - ALUNO REPROVADO ")
FIMSE
SE MEDIA >= 7 ENTAO
 ESCREVA ("A MEDIA DO ALUNO FOI: ", MEDIA)
 ESCREVA (" - ALUNO APROVADO ")
FIMSE
fimalgoritmo
Tradutor e Interpretador
Ao receber uma bicicleta no natal Carlinhos precisa ler o manual de instruções e seguir passo a passo as tarefas descritas no documento para poder se
divertir com seu presente. Podemos dizer que Carlinhos é um interpretador dos comandos fornecidos pelo manual de instruções. Entretanto seu pai
encontrou uma promoção na internet e comprou um produto fabricado na França e o menino ao se deparar com o manual percebeu que o mesmo não
poderia ser “interpretado” já que não sabia ler em francês. Para resolver o problema seu pai contratou um tradutor de francês para português, assim,
este novo manual pôde ser “interpretado” por Carlinhos e enfim sua bicicleta seria montada.
No computador, o problema de Carlinhos se repete diariamente, havendo a necessidade de softwares básicos para traduzir e interpretar os diversos
programas dos usuários escritos em diversas linguagens existentes. Os softwares que convertem um programa de usuário escrito em uma linguagem
para outra linguagem são chamados de tradutores. A linguagem na qual o programa original está expresso é chamada de linguagem fonte e a
linguagem para a qual ela será convertida é conhecida como linguagem alvo. Tanto a linguagem fonte quanto a linguagem alvo definem níveis de
abstração específicos.
Se existir um processador que possa executar diretamente programas escritos na linguagem fonte, não há necessidade de se traduzir o programa fonte
para uma linguagem alvo.
O método de tradução é empregado quando há um processador (seja ele implementado em hardware ou por interpretação) disponível para executar
programas expressos na linguagem alvo mas não na linguagem fonte. Se a tradução tiver sido feita corretamente, a execução do programa traduzido
vai obter exatamente os mesmos resultados que a execução do programa fonte obteria se houvesse um processador que o executasse diretamente.
É importante observar a diferença entre tradução e interpretação. Na tradução, o programa original, expresso na linguagem fonte, não é executado
diretamente. Em vez da execução direta, esse programa precisa ser convertido para um programa equivalente, conhecido como programa objeto ou
programa binário executável, que será executado após o término do processo de tradução.
Logo, a tradução envolve dois passos distintos:
Geração de um programa equivalente na linguagem alvo;
Execução do programa obtido.
No processo de interpretação existe apenas um único passo: a execução do programa original na linguagem fonte.
Tradutores
Os tradutores podem ser divididos em dois grupos, dependendo da relação existente entre a linguagem fonte e a linguagem alvo. Quando a linguagem
fonte for essencialmente uma representação simbólica para uma linguagem de máquina numérica, o tradutor é chamado de montador e a linguagem
fonte é chamada de linguagem de montagem. Quando a linguagem fonte for uma linguagem de alto nível, como é o caso do Pascal ou do C, e a
linguagem alvo for uma linguagem de máquina numérica ou uma representação simbólica desta linguagem (linguagem de montagem), o tradutor é
chamado de compilador.
Processo de Compilação
Diferente do processo de montagem de um programa em linguagem de montagem para um programa em linguagem de máquina, que é bastante
simples, pois existe um mapeamento direto de um para um entre os comandos em linguagem de montagem e os equivalentes em código binário, o
processo de compilação de linguagens é muito mais complexo.
Passos da compilação
Considere o comando simples abaixo:
A = B + 4;
O compilador tem que resolver um número grande de tarefas na conversão deste comando em um ou mais comandos em linguagem de montagem:
1.Reduzir o texto do programa para símbolos básicos da linguagem, como identificadores tais como A e B, demarcações como o valor constante 4 e
delimitadores do programa tais como = e +. Esta parte da compilação é chamada de análise léxica.
2. Decodificar os símbolos para reconhecer a estrutura do programa. No comando usado acima, por exemplo, um programa chamado parser deve
reconhecer o comando como sendo uma atribuição de valores da forma:
<Identificador> “=” <Expressão>
onde <Expressão> é decodificado na forma:
<Identificador> “+” <Constante>
Essa tarefa é chamada de análise sintática.
3. Análise de nomes: associar os nomes A e B com variáveis do programa, e associá-los também a posições de memória específicas onde essas
variáveis serão armazenadas durante a execução.
4. Análise de tipos: determinar os tipos de todos os dados. No caso anterior, as variáveis A e B e a constante 4 seriam reconhecidas como sendo do
tipo int em algumas linguagens. As análises de nome e tipo são também conhecidas como análise semântica: determina o significado dos componentes
do programa.
5. Mapeamento de ações e geração de código: associar comandos do programa com uma sequência em linguagem de montagem apropriada. No caso
anterior, a sequência em linguagem de montagem poderia ser:
Comando de atribuição.
ld[B], %r0, %r1 // Carregue variável B em um registrador.
add %r1, 4, %r2 // Calcule o valor da expressão.
st %r2, %r0, [A] //Faça a atribuição na variável A.
6.Existem passos adicionais que o compilador deve tomar, tais como, alocar variáveis a registradores, usar registradores e, quando o programador
desejar, otimizar o programa. O otimizador de código (independente de máquina) é um módulo opcional (presente na grande maioria dos compiladores)
que objetiva melhorar o código intermediário de modo que o programa objeto produzido ao fim da compilação seja menor (ocupe menos espaço de
memória) e/ou mais rápido (tenha tempo de execução menor). A saída do otimizador de código é um novo código intermediário.
Processo de Montagem
O processo de traduzir um programa em linguagem de montagem para programa em linguagem de máquina é chamado de processo de montagem.
Este processo é muito simples, uma vez que existe um mapeamento um para um de comandos em linguagem de montagem para seus
correspondentes em linguagem de máquina. Isto é o contrário da compilação, onde um comando em linguagem de alto nível pode ser traduzido em
vários comandos em linguagem de máquina.
Por que usar uma Linguagem de Montagem?
Programar em uma linguagem de montagem não é fácil. Além da dificuldade, o desenvolvimento de um programa na linguagem de montagem
consome mais tempo do que seu desenvolvimento em uma linguagem de alto nível. A depuração e manutenção dos programas em linguagem de
montagem são mais complicados.
Nessas condições, por que alguém escolheria programar em uma linguagem de montagem?
Existem duas razões que justificam esta opção: performance e acesso aos recursos da máquina. Um expert na linguagem de montagem pode produzir
um código menor e muito mais eficiente do que o gerado por um programador usando linguagem de alto nível.
Em segundo lugar, certos procedimentos precisam ter acesso total ao hardware. Por exemplo, se a máquina alvo tiver um bit para expressar o overflow
de operações aritméticas, um programa em linguagem de montagem pode testar diretamente este bit, coisa que um programa em Java não pode fazer.
Além disso, um programa em linguagem de montagem pode executar qualquer uma das instruções do conjunto de instruções da máquina alvo.
Tarefas do montador
Embora a montagem seja um processo simples, é tedioso e passível de erros quando feito manualmente. Montadores comerciais têm ao menos as
seguintes características:
Permitem ao programador especificar posição de valores de dados e programas durante a execução;
Permitem que o programador de início realize valores de dados na memória antes da execução do programa;
Implementam mnemônicos em linguagem de montagem para todas as instruções da máquina e modos de endereçamento, e traduzem comandos
em linguagem de montagem válidos, nos seus equivalentes em linguagem de máquina;
Permitem o uso de rótulos simbólicos para representar endereços e constantes;
Incluem um mecanismo que permite que variáveis sejam definidas em um programa em linguagem de montagem e usadas em outros programas
separadamente;
Possibilitam a expansão de macros, ou seja, rotinas (semelhantes às funções em linguagem de alto nível) que podem ser definidas uma vez e
então instanciadas quantas vezes necessário.
Montadores de dois passos
A maioria dos montadores leem textos do programa em linguagem de montagem duas vezes, e são chamados de “montadores de dois passos”. O
primeiro passo serve para determinar o endereço de todos os itens de dados e instruções de máquina, e selecionar quais instruções devem ser
geradas para cada instrução em linguagem de montagem (mais ainda não gerá-las).
Os endereços dos itens de dados e instruções são determinados por meio do uso de um contador de programa para a montagem, chamado contador
de localização. O contador de localização gerencia o endereço da instrução executada e dos itens de dados durante a montagem, que geralmente é
inicializada com 0 (zero). No início do primeiro passo, é incrementado de acordo com o tamanho de cada instrução.
Durante este passo, o montador também efetua quaisquer operações aritméticas em tempo de montagem, e insere as definições de todos os rótulos de
funções e variáveis e as constantes, em uma tabela chamada Tabela de Símbolos.
A razão principal para exigir uma segunda passagem é permitir que símbolos sejam usados no programa antes de serem definidos. Após a primeira
passagem, o montador terá identificado todos os símbolos e os colocado na Tabela de Símbolos, já durante a segunda passagem, gerará código de
máquina, inserindo os identificadores dos símbolos que agora são conhecidos.
Ligação e Carregamento
A maioria dos programas é composto de mais de um procedimento. Os compiladores e os montadores geralmente traduzem um procedimento de cada
vez, colocando a saída da tradução em disco. Antes que o programa possa rodar, todos os seus procedimentos precisam ser localizados e ligados uns
aos outros de maneira a formarem um único código.
Ligação
A função do ligador é coletar procedimentos traduzidos separadamente e ligá-los uns aos outros para que eles possam executar como uma unidade
chamada programa binário executável.
Se o compilador ou o montador lesse um conjunto de procedimentos fonte e produzisse diretamente um programa em linguagem de máquina pronto
para ser executado, bastaria que um único comando fonte fosse alterado para que todos os procedimentos fonte tivessem que ser novamente
traduzidos.
Usando a técnica do módulo objeto separado, o único procedimento a ser novamente traduzido seria aquele modificado. Havendo a necessidade de
realizar apenas a etapa de ligação dos módulos separados novamente, sendo esta tarefa mais rápida que a tradução.
Carregamento
O carregador é um programa que coloca um módulo de carregamento na memória principal. Conceitualmente, a tarefa do carregador não é difícil. Ele
deve carregar os vários segmentos de memória com seus valores corretos e inicializar certos registradores, tais como o apontador para pilha do
sistema, responsável pelo escopo das rotinas que estarão em execução e o contador de instruções contido no processador, com seus valores iniciais,
indicando assim onde o programa deve ser iniciado.
Em Sistemas Operacionais modernos, vários programas estão residentes na memória a todo instante, e não há como o montador ou o ligador saber
em quais endereços os módulos de um programa irão residir. O carregador deve relocar estes módulos durante o carregamento adicionando um
deslocamento a todos os endereços, permitindo desta forma acessar cada módulo individualmente na memória.
Esse tipo de carregamento é chamado de carregamento com relocação. O carregador simplesmente modifica endereços relocáveis dentro de um único
módulo de carregamento para que vários programas passem a residir na memória simultaneamente.
Interpretadores
O software interpretador é um programa de computador que executa instruções escritas em uma linguagem de programação. Por exemplo, as
linguagens Basic, Prolog, Python e Java, são frequentemente interpretados. Um interpretador geralmente usa uma das seguintes estratégias para a
execução do programa: executar o código fonte diretamente ou traduzir o código fonte em alguma eficiente representação intermediária e depois
executar este código.
Para isso, certos tipos de tradutores transformam uma linguagem fonte em uma linguagem simplificada, chamada de código intermediário, que pode
ser diretamente “executado” por um programa chamado interpretador. Nós podemos imaginar o código intermediário como uma linguagem de máquina
de um computador abstrato projetado para executar o código fonte.
Interpretadores são, em geral, menores que compiladores e facilitam a implementação de construções complexas em linguagens de programação.
Entretanto, o tempo de execução de um programa interpretado é geralmente maior que o tempo de execução deste mesmo programa compilado, pois
o interpretador deve analisar cada declaração no programa a cada vez que é executado e depois executar a ação desejada, enquanto que o código
compilado apenas executa a ação dentro de um contexto fixo, anteriormente determinadopela compilação. Este tempo no processo de análise é
conhecido como "overhead interpretativa".
Ver também
Referências
Bibliografia
D�������, S�����; P������������, C�������; V�������, U����. Algoritmos. Porto Alegre: AMGH, 2010.
Algoritmos e Programação - Teoria e Prática: para universitários e profissionais de informática : Novatec Editora. ISBN 85-7522-073-X
Donald E. Knuth (1973) The Art of Computer Programming, Volume 1: Fundamental Algorithms (2ª edição). Addison-Wesley, ISBN 0-201-03809-9
(em inglês)
↑ CHARLES E. LEISERSON, Thomas H. Cormen, RONALD L. RIVEST, CLIFFORD STEIN , Algoritmos: teoria e prática , CAMPUS - RJ, 2002 ISBN
8-535-20926-3
Donald E. Knuth, Selected Papers on Analysis of Algorithms ISBN 1-57586-212-3 Livro (em inglês)
↑ Jean Luc Chabert, A History of Algorithms: From the Pebble to the Microchip. Springer Verlag, 1999. ISBN 978-3-540-63369-3. (em inglês)
↑ Algorithmics: The Spirit of Computing. Addison-Wesley. 2004. ISBN 978-0-321-11784-7. (em inglês)
T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduction to Algorithms , 3rd edition, MIT Press, 2009 ISBN 978-026-203-384-8 (em inglês)
Donald E. Knuth, The Art of Computer Programming
↑ Jon Kleinberg, Éva Tardos, Algorithm Design, Addison-Wesley, 2005 ISBN 0-321-29535-8 (em inglês) Livro
Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani, Algorithms
Richard E. Neapolitan, Kumarss Naimipour , Foundations of Algorithms Using Java Pseudocode , Jones & Bartlett Learning, 2004 ISBN 0-763-
72129-8 (em inglês)
↑ Laira Vieira Toscani, Paulo A. S. Veloso, Complexidade de Algoritmos: Série Livros Didáticos Informática UFRGS - Vol. 13 , Bookman ISBN 8-540-
70139-1
RICARDO LINDEN , Algoritmos Genéticos (2a edição) , Brasport ISBN 8-574-52373-9
↑ Jesús Bisbal Riera, Manual de Algorítmica: Recursividad, complejidad y diseño de algoritmos, Editorial UOC, 2009 ISBN 8-497-88027-7 (em
castelhano)
Gilberto Farias de Sousa Filho, Eduardo de Santana Medeiros Alexandre, Introdução a Computação - 2ª edição. João Pessoa: Editora da UFPB,
2014. ISBN:978-85-237-0892-4
Z������, N����. Projeto de algoritmos: com implementações em Java e C++. São Paulo: Cengage Learning, 2011.
Ligações externas
«O que é algoritmo?»
Dictionary of Algorithms and Data Structures
Aprenda a Programar : Série de artigos didáticos ensinando Português Estruturado
Aplicativo .jar para testes de Algoritmo (www.ucb.br)
Exercícios resolvidos de algoritmos para estudo
Site para aprendizado e treinamento de algoritmos e estrutura de dados
Data Structures and Algorithms Godfried Toussaint na Universidade McGill, Montréal
«animação de alguns algoritmos (baseado no livro Algorithms in C++ de Robert Sedgewick)» (em inglês)
The Algorithm Design Manual, 2nd Edition
Projeto de Algoritmos em C
Análise de Algoritmos
Minicurso de Análise de Algoritmos
Dicionário
A. Broder, J. Stolfi, Pessimal algorithms and simplexity analysis
Tópicos sobre computação
História da computação Algoritmos · Teoria da computação · Autômatos · Computação quântica · Multimídia · Nanotecnologia · Bioinformática
Hardware
Microcontrolador · Microprocessador · Disco Rígido · Memória · Modem · Placa-mãe · Placa de rede · Placa de Som · Placa de Vídeo ·
Placa sintonizadora de TV · Mouse · Teclado · Impressora · Digitalizador
Software Programação de computadores · Utilitários · Sistemas Operacionais · Operação bit a bit
Internet World Wide Web · E-mail · FTP · IRC · P2P
Cientistas
Alan Kay · Alan Turing · Ada Lovelace · Charles Babbage · Donald E. Knuth · Douglas Engelbart · Edsger W. Dijkstra · Eric S. Raymond ·
John von Neumann · Larry Wall · Marvin Minsky · Noam Chomski · Richard M. Stallman
Terminologia Termos de computação · Etimologias de termos usados em computação
Compressão de dados
Teoria
Com perda · Sem perda
Tipo de dados de origem
áudio · banda · imagens · vídeo
Métodos
Lista de algoritmos - Algoritmos de Compressão
 Portal da matemática Portal das tecnologias de informação
Controle de autoridade
: Q8366 · AAT: 300065585 · BNCF: 21026 · BNE: XX527980 · BNF: 119358199 · BRE: 1810305 · EBID: ID · GEC: 0076707 ·
GND: 4001183-5 · JSTOR: algorithms · LCCN: sh85003487 · NDL: 00560337 · Treccani: algoritmo
Identificadores MeSH: D000465 · MeSH: G17.035
Categorias: Algoritmos Terminologia informática Computação Ciência da computação Programas de computador Tecnologia
Tecnologia da informação
Estrutura de dados
Autômato
Complexidade computacional
Teoria da computabilidade
Teoria da computação
Garbage in, garbage out
Máquina abstrata
Negociações de alta frequência
Algoritmo probabilístico
Algoritmo de Euclides
1. ↑ Ziviani, 2011, p. 1
2. ↑ The Editors Of Encyclopædia Britannica. Algorithm . Acesso em: 02 dez.
2018
3. ↑ Dasgupta, Papadimitriou e Vazirani, 2010, p. 2
4. ↑ Mueller e Massaron, John e Luca (2017). Algorithms For Dummies .
[S.l.]: J. Wiley & Sons. OCLC 1028615961
5. ↑ Nuno Miguel da Conceição Fernandes Verdasca (janeiro de 2013).
Identificação e Análise de Movimento Humano com Ultrassons (PDF)
(Dissertação de mestrado). Consultado em 12 de Março de 2015
6. ↑ Loureiro, Computação da UFOP. «Análise de complexidade» (PDF).
Consultado em 12 de janeiro de 2012
7. ↑ TAVARES, P. de Campos; Algoritmo, in "Enciclopédia Verbo Luso-
Brasileira da Cultura, Edição Século XXI", Volume II, Editorial Verbo, Braga,
Janeiro de 1998 ISBN 972-22-1864-6.
8. ↑ algoritmos e mercados Acedido em 20 de julho 2012
9. ↑ Cormen, Thomas. Algoritmos - Teoria e Prática, 3 ed. São Paulo: GEN
LTC, 2010.
10. ↑ Spitznagel, Edward L. (1971). Selected topics in mathematics . New
York: Holt, Rinehart and Winston. 137 páginas. ISBN 0030846935.
OCLC 130674
11. ↑ «VisuAlg»
Página principal
Conteúdo destacado
Eventos atuais
Esplanada
Página aleatória
Portais
Informar um erro
Colaboração
Boas-vindas
Ajuda
Página de testes
Portal comunitário
Mudanças recentes
Manutenção
Criar página
Páginas novas
Contato
Donativos
Ferramentas
Páginas afluentes
Alterações relacionadas
Carregar ficheiro
Páginas especiais
Hiperligação permanente
Informações da página
Citar esta página
Elemento Wikidata
Editar hiperligações
interlínguas
Imprimir/exportar
Criar um livro
Descarregar como PDF
Versão para impressão
Noutros projetos
Wikimedia Commons
Criar uma contaPesquisar na Wikipédia
https://meta.wikimedia.org/wiki/Privacy_policy/pt-br
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Sobre
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Aviso_geral
https://pt.m.wikipedia.org/w/index.php?title=Algoritmo&mobileaction=toggle_view_mobile
https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute
https://stats.wikimedia.org/#/pt.wikipedia.org
https://foundation.wikimedia.org/wiki/Cookie_statement
https://wikimediafoundation.org/
https://wikimediafoundation.org/
https://www.mediawiki.org/
https://www.mediawiki.org/
https://creativecommons.org/licenses/by-sa/3.0/deed.pt
https://foundation.wikimedia.org/wiki/Condi%C3%A7%C3%B5es_de_Uso
https://pt.wikipedia.org/wiki/Algoritmo
https://pt.wikipedia.org/wiki/Discuss%C3%A3o:Algoritmo
https://pt.wikipedia.org/wiki/Algoritmo
https://pt.wikipedia.org/w/index.php?title=Especial:Entrar&returnto=Algoritmo
https://pt.wikipedia.org/w/index.php?title=Algoritmo&action=history
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Wiki_Loves_Monuments_2021/Brasil
https://pt.wikipedia.org/wiki/Ficheiro:Sorting_quicksort_anim.gif
https://pt.wikipedia.org/wiki/Ficheiro:Sorting_quicksort_anim.gif
https://pt.wikipedia.org/wiki/Ficheiro:Sorting_quicksort_anim.gif
https://pt.wikipedia.org/wiki/Ficheiro:Fluxogranma02.gif
https://pt.wikipedia.org/wiki/Ficheiro:Fluxogranma02.gif
https://pt.wikipedia.org/wiki/Ficheiro:Fluxogranma02.gif
https://pt.wikipedia.org/wiki/Fluxograma
https://pt.wikipedia.org/wiki/Ficheiro:Torre_de_Han%C3%B3i.jpg
https://pt.wikipedia.org/wiki/Ficheiro:Torre_de_Han%C3%B3i.jpg
https://pt.wikipedia.org/wiki/Ficheiro:Torre_de_Han%C3%B3i.jpg
https://pt.wikipedia.org/wiki/Ficheiro:Resolu%C3%A7%C3%A3o_da_torre_de_Han%C3%B3i_de_tr%C3%AAs_discos.png
https://pt.wikipedia.org/wiki/Ficheiro:Resolu%C3%A7%C3%A3o_da_torre_de_Han%C3%B3i_de_tr%C3%AAs_discos.pnghttps://pt.wikipedia.org/wiki/Ficheiro:Resolu%C3%A7%C3%A3o_da_torre_de_Han%C3%B3i_de_tr%C3%AAs_discos.png
https://pt.wikipedia.org/wiki/Ficheiro:Wikibooks-logo.svg
https://pt.wikipedia.org/wiki/Ficheiro:Wikibooks-logo.svg
https://pt.wikipedia.org/wiki/Wikilivros
https://pt.wikibooks.org/wiki/Special:Search/Introdu%C3%A7%C3%A3o_%C3%A0_programa%C3%A7%C3%A3o
https://pt.wikibooks.org/wiki/Special:Search/Introdu%C3%A7%C3%A3o_%C3%A0_programa%C3%A7%C3%A3o/Algoritmos
https://pt.wikipedia.org/wiki/Ficheiro:Wikiversity-logo.svg
https://pt.wikipedia.org/wiki/Ficheiro:Wikiversity-logo.svg
https://pt.wikipedia.org/wiki/Wikiversidade
https://pt.wikiversity.org/wiki/Projeto_e_An%C3%A1lise_de_Algoritmos
https://pt.wikipedia.org/wiki/Predefini%C3%A7%C3%A3o:Computa%C3%A7%C3%A3o
https://pt.wikipedia.org/w/index.php?title=Predefini%C3%A7%C3%A3o_Discuss%C3%A3o:Computa%C3%A7%C3%A3o&action=edit&redlink=1
https://pt.wikipedia.org/w/index.php?title=Predefini%C3%A7%C3%A3o:Computa%C3%A7%C3%A3o&action=edit
https://pt.wikipedia.org/wiki/Ficheiro:Nuvola_apps_edu_mathematics-p.svg
https://pt.wikipedia.org/wiki/Ficheiro:Nuvola_apps_edu_mathematics-p.svg
https://pt.wikipedia.org/wiki/Portal:Matem%C3%A1tica
https://pt.wikipedia.org/wiki/Matem%C3%A1tica
https://pt.wikipedia.org/wiki/Ci%C3%AAncia_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Instru%C3%A7%C3%A3o_(inform%C3%A1tica)
https://pt.wikipedia.org/wiki/Erat%C3%B3stenes
https://pt.wikipedia.org/wiki/Euclides
https://pt.wikipedia.org/wiki/Itera%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/L%C3%B3gica
https://pt.wikipedia.org/wiki/Programa_de_computador
https://pt.wikipedia.org/wiki/Computador
https://pt.wikipedia.org/wiki/Aut%C3%B4mato
https://pt.wikipedia.org/wiki/Complexidade_computacional
https://pt.wikipedia.org/wiki/Estruturas_de_dados
https://pt.wikipedia.org/wiki/1936
https://pt.wikipedia.org/wiki/M%C3%A1quina_de_Turing
https://pt.wikipedia.org/wiki/Alan_Turing
https://pt.wikipedia.org/wiki/C%C3%A1lculo_lambda
https://pt.wikipedia.org/wiki/Alonzo_Church
https://pt.wikipedia.org/wiki/Ci%C3%AAncia_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Etimologia
https://pt.wikipedia.org/wiki/Al-Khwarizmi
https://pt.wikipedia.org/wiki/P%C3%A9rsia
https://pt.wikipedia.org/wiki/S%C3%A9culo_IX
https://pt.wikipedia.org/wiki/S%C3%A9culo_XII
https://pt.wikipedia.org/wiki/Sistema_decimal
https://pt.wikipedia.org/wiki/%C3%81lgebra
https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Multiplica%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Subtra%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Divis%C3%A3o
https://pt.wikipedia.org/wiki/Leibnitz
https://pt.wikipedia.org/wiki/Programa_de_computador
https://pt.wikipedia.org/wiki/Computador
https://pt.wikipedia.org/wiki/M%C3%A1quina_de_Turing
https://pt.wikipedia.org/wiki/Processamento_de_dados
https://pt.wikipedia.org/wiki/Estrutura_de_dados
https://pt.wikipedia.org/wiki/An%C3%A1lise_de_algoritmos
https://pt.wikipedia.org/wiki/Lista
https://pt.wikipedia.org/wiki/Fluxograma
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_l%C3%B3gica
https://pt.wikipedia.org/wiki/Marvin_Minsky
https://pt.wikipedia.org/wiki/1936
https://pt.wikipedia.org/wiki/Problema_da_parada
https://pt.wikipedia.org/wiki/Torre_de_Han%C3%B3i
https://pt.wikipedia.org/wiki/%C3%89douard_Lucas
https://pt.wikipedia.org/wiki/An%C3%A1lise_de_algoritmos
https://pt.wikipedia.org/wiki/Ci%C3%AAncia_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/T%C3%A9cnicas_de_Projeto_de_Algoritmos
https://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Pseudoc%C3%B3digo
https://pt.wikipedia.org/wiki/Portugol
https://pt.wikipedia.org/wiki/Bloco_de_Notas
https://pt.wikipedia.org/wiki/Visualg
https://pt.wikipedia.org/wiki/Recursividade_(ci%C3%AAncia_da_computa%C3%A7%C3%A3o)
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_funcional
https://pt.wikipedia.org/wiki/LIFO
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_l%C3%B3gica
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_imperativa
https://pt.wikipedia.org/wiki/Arquitetura_de_computadores
https://pt.wikipedia.org/wiki/Processador
https://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o_paralela
https://pt.wikipedia.org/wiki/Heur%C3%ADstica
https://pt.wikipedia.org/wiki/Complexidade_computacional
https://pt.wikipedia.org/wiki/Divis%C3%A3o_e_conquista
https://pt.wikipedia.org/wiki/Merge_sort
https://pt.wikipedia.org/wiki/Pesquisa_bin%C3%A1ria
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_din%C3%A2mica
https://pt.wikipedia.org/wiki/Algoritmo_ganancioso
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_linear
https://pt.wikipedia.org/wiki/Grafo
https://pt.wikipedia.org/wiki/Algoritmo_de_busca
https://pt.wikipedia.org/wiki/Backtracking
https://pt.wikipedia.org/wiki/Algoritmo_gen%C3%A9tico
https://pt.wikipedia.org/wiki/Algoritmo_de_busca
https://pt.wikipedia.org/wiki/Algoritmo_de_ordena%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/An%C3%A1lise_num%C3%A9rica
https://pt.wikipedia.org/wiki/Teoria_de_grafos
https://pt.wikipedia.org/wiki/String
https://pt.wikipedia.org/wiki/Geometria
https://pt.wikipedia.org/wiki/An%C3%A1lise_combinat%C3%B3ria
https://pt.wikipedia.org/wiki/Aprendizagem_de_m%C3%A1quina
https://pt.wikipedia.org/wiki/Criptografia
https://pt.wikipedia.org/wiki/Compress%C3%A3o_de_dados
https://pt.wikipedia.org/wiki/Parser
https://pt.wikipedia.org/wiki/Complexidade_computacional
https://pt.wikipedia.org/wiki/Ada_Lovelace
https://pt.wikipedia.org/wiki/Engenho_anal%C3%ADtico
https://pt.wikipedia.org/wiki/Charles_Babbage
https://pt.wikipedia.org/wiki/Linguagem_de_programa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Portugol
https://pt.wikipedia.org/wiki/Visualg
http://www.novateceditora.com.br/livros/algoritmos/
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/857522073X
http://www.novateceditora.com.br/livros/algoritmos/
https://pt.wikipedia.org/wiki/Donald_E._Knuth
https://pt.wikipedia.org/wiki/The_Art_of_Computer_Programming
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/0201038099
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/8535209263
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/1575862123
http://www-cs-faculty.stanford.edu/~uno/aa.html
http://www-cs-faculty.stanford.edu/~uno/aa.html
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/9783540633693
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/9780321117847
http://mitpress.mit.edu/books/introduction-algorithms
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/9780262033848
http://mitpress.mit.edu/books/introduction-algorithms
http://www-cs-staff.stanford.edu/~uno/taocp.html
http://www-cs-staff.stanford.edu/~uno/taocp.html
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/0321295358
https://web.archive.org/web/20110514100625/http://www.aw-bc.com/info/kleinberg/
https://web.archive.org/web/20110514100625/http://www.aw-bc.com/info/kleinberg/
http://highered.mheducation.com/sites/0073523402/index.html
http://highered.mheducation.com/sites/0073523402/index.html
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/0763721298
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/8540701391
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/8574523739
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/8497880277
https://faqinformatica.com/o-que-e-algoritmo/
https://faqinformatica.com/o-que-e-algoritmo/
http://www.nist.gov/dads/
http://www.nist.gov/dads/
http://algoritmizando.com/desenvolvimento/aprender-algoritmos/
http://algoritmizando.com/desenvolvimento/aprender-algoritmos/
https://web.archive.org/web/20160501191757/http://cae.ucb.br/conteudo/unbfga/downloads/Calango.jar
https://web.archive.org/web/20160501191757/http://cae.ucb.br/conteudo/unbfga/downloads/Calango.jar
http://algoritmizando.com/desenvolvimento/40-exercicios-de-algoritmos-resolvidos-para-estudo/
http://algoritmizando.com/desenvolvimento/40-exercicios-de-algoritmos-resolvidos-para-estudo/http://www.ucoder.com.br/
http://www.ucoder.com.br/
http://cgm.cs.mcgill.ca/~godfried/teaching/algorithms-web.html
http://cgm.cs.mcgill.ca/~godfried/teaching/algorithms-web.html
http://www.ansatt.hig.no/frodeh/algmet/animate.html
http://www.ansatt.hig.no/frodeh/algmet/animate.html
http://www.algorist.com/
http://www.algorist.com/
http://www.ime.usp.br/~pf/algoritmos/
http://www.ime.usp.br/~pf/algoritmos/
http://www.ime.usp.br/~pf/analise_de_algoritmos/slides-2008/AULAS4up.pdf
http://www.ime.usp.br/~pf/analise_de_algoritmos/slides-2008/AULAS4up.pdf
http://www.ime.usp.br/~pf/livrinho-AA/AA-BOOKLET.pdf
http://www.ime.usp.br/~pf/livrinho-AA/AA-BOOKLET.pdf
http://www.ime.usp.br/~pf/analise_de_algoritmos/aulas/dicionario.html
http://www.ime.usp.br/~pf/analise_de_algoritmos/aulas/dicionario.html
http://www.ime.usp.br/~pf/analise_de_algoritmos/stolfi/broder86pessimal.pdf
http://www.ime.usp.br/~pf/analise_de_algoritmos/stolfi/broder86pessimal.pdf
https://pt.wikipedia.org/wiki/Computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Hist%C3%B3ria_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Teoria_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Aut%C3%B4mato
https://pt.wikipedia.org/wiki/Computador_qu%C3%A2ntico
https://pt.wikipedia.org/wiki/Multim%C3%A9dia
https://pt.wikipedia.org/wiki/Nanotecnologia
https://pt.wikipedia.org/wiki/Bioinform%C3%A1tica
https://pt.wikipedia.org/wiki/Hardware
https://pt.wikipedia.org/wiki/Microcontrolador
https://pt.wikipedia.org/wiki/Microprocessador
https://pt.wikipedia.org/wiki/Disco_r%C3%ADgido
https://pt.wikipedia.org/wiki/Mem%C3%B3ria_(computador)
https://pt.wikipedia.org/wiki/Modem
https://pt.wikipedia.org/wiki/Placa-m%C3%A3e
https://pt.wikipedia.org/wiki/Placa_de_rede
https://pt.wikipedia.org/wiki/Placa_de_som
https://pt.wikipedia.org/wiki/Placa_de_v%C3%ADdeo
https://pt.wikipedia.org/wiki/Placa_sintonizadora_de_TV
https://pt.wikipedia.org/wiki/Rato_(inform%C3%A1tica)
https://pt.wikipedia.org/wiki/Teclado_(inform%C3%A1tica)
https://pt.wikipedia.org/wiki/Impressora
https://pt.wikipedia.org/wiki/Digitalizador
https://pt.wikipedia.org/wiki/Software
https://pt.wikipedia.org/wiki/Programa%C3%A7%C3%A3o_de_computadores
https://pt.wikipedia.org/wiki/Utilit%C3%A1rio
https://pt.wikipedia.org/wiki/Sistema_operativo
https://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_bit_a_bit
https://pt.wikipedia.org/wiki/Internet
https://pt.wikipedia.org/wiki/World_Wide_Web
https://pt.wikipedia.org/wiki/E-mail
https://pt.wikipedia.org/wiki/File_Transfer_Protocol
https://pt.wikipedia.org/wiki/Internet_Relay_Chat
https://pt.wikipedia.org/wiki/P2P
https://pt.wikipedia.org/wiki/Cientista
https://pt.wikipedia.org/wiki/Alan_Kay
https://pt.wikipedia.org/wiki/Alan_Turing
https://pt.wikipedia.org/wiki/Ada_Lovelace
https://pt.wikipedia.org/wiki/Charles_Babbage
https://pt.wikipedia.org/wiki/Donald_Knuth
https://pt.wikipedia.org/wiki/Douglas_Engelbart
https://pt.wikipedia.org/wiki/Edsger_Dijkstra
https://pt.wikipedia.org/wiki/Eric_Steven_Raymond
https://pt.wikipedia.org/wiki/John_von_Neumann
https://pt.wikipedia.org/wiki/Larry_Wall
https://pt.wikipedia.org/wiki/Marvin_Minsky
https://pt.wikipedia.org/wiki/Noam_Chomsky
https://pt.wikipedia.org/wiki/Richard_Matthew_Stallman
https://pt.wikipedia.org/wiki/Terminologia
https://pt.wikipedia.org/wiki/Lista_de_termos_de_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Lista_de_etimologias_de_termos_usados_em_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Compress%C3%A3o_de_dados
https://pt.wikipedia.org/wiki/Compress%C3%A3o_com_perda_de_dados
https://pt.wikipedia.org/wiki/Compress%C3%A3o_sem_perda_de_dados
https://pt.wikipedia.org/wiki/Compress%C3%A3o_de_%C3%A1udio
https://pt.wikipedia.org/wiki/Compress%C3%A3o_de_banda
https://pt.wikipedia.org/wiki/Compress%C3%A3o_de_imagens
https://pt.wikipedia.org/wiki/Compress%C3%A3o_de_v%C3%ADdeo
https://pt.wikipedia.org/wiki/Lista_de_algoritmos#Algoritmos_de_Compress%C3%A3o
https://pt.wikipedia.org/wiki/Ficheiro:Nuvola_apps_edu_mathematics-p.svg
https://pt.wikipedia.org/wiki/Portal:Matem%C3%A1tica
https://pt.wikipedia.org/wiki/Ficheiro:Crystal_Clear_app_ktalkd.png
https://pt.wikipedia.org/wiki/Portal:Tecnologias_de_informa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Ficheiro:Nuvola_apps_edu_mathematics-p.svg
https://pt.wikipedia.org/wiki/Ficheiro:Crystal_Clear_app_ktalkd.png
https://pt.wikipedia.org/wiki/Ajuda:Controle_de_autoridade
https://www.wikidata.org/wiki/Wikidata:Main_Page
https://www.wikidata.org/wiki/Q8366
https://pt.wikipedia.org/wiki/Art_%26_Architecture_Thesaurus
https://www.getty.edu/vow/AATFullDisplay?find=&logic=AND&note=&subjectid=300065585
https://pt.wikipedia.org/wiki/Biblioteca_Nacional_Central_de_Floren%C3%A7a
https://thes.bncf.firenze.sbn.it/termine.php?id=21026
https://pt.wikipedia.org/wiki/Biblioteca_Nacional_da_Espanha
https://datos.bne.es/resource/XX527980
https://pt.wikipedia.org/wiki/Biblioteca_Nacional_da_Fran%C3%A7a
https://catalogue.bnf.fr/ark:/12148/cb119358199
https://pt.wikipedia.org/wiki/Grande_Enciclop%C3%A9dia_Sovi%C3%A9tica
https://bigenc.ru/text/1810305
https://pt.wikipedia.org/wiki/Encyclop%C3%A6dia_Britannica
https://www.britannica.com/topic/algorithm
https://pt.wikipedia.org/wiki/Gran_Enciclop%C3%A8dia_Catalana
https://www.enciclopedia.cat/EC-GEC-0076707.xml
https://pt.wikipedia.org/wiki/Gemeinsame_Normdatei
https://d-nb.info/gnd/4001183-5
https://pt.wikipedia.org/wiki/JSTOR
https://pt.wikipedia.org/wiki/N%C3%BAmero_de_controle_da_Biblioteca_do_Congresso
https://id.loc.gov/authorities/sh85003487
https://pt.wikipedia.org/wiki/Biblioteca_Nacional_da_Dieta
https://id.ndl.go.jp/auth/ndlna/00560337
https://pt.wikipedia.org/wiki/Enciclop%C3%A9dia_Treccani
https://www.treccani.it/enciclopedia/algoritmo
https://www.wikidata.org/wiki/Wikidata:Main_Page
https://pt.wikipedia.org/wiki/Medical_Subject_Headings
https://meshb.nlm.nih.gov/record/ui?ui=D000465
https://pt.wikipedia.org/wiki/Medical_Subject_Headings
http://id.nlm.nih.gov/mesh/G17.035
https://pt.wikipedia.org/wiki/Especial:Categorias
https://pt.wikipedia.org/wiki/Categoria:Algoritmos
https://pt.wikipedia.org/wiki/Categoria:Terminologia_inform%C3%A1tica
https://pt.wikipedia.org/wiki/Categoria:Computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Categoria:Ci%C3%AAncia_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Categoria:Programas_de_computador
https://pt.wikipedia.org/wiki/Categoria:Tecnologia
https://pt.wikipedia.org/wiki/Categoria:Tecnologia_da_informa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Estrutura_de_dados
https://pt.wikipedia.org/wiki/Aut%C3%B4mato
https://pt.wikipedia.org/wiki/Complexidade_computacional
https://pt.wikipedia.org/wiki/Teoria_da_computabilidade
https://pt.wikipedia.org/wiki/Teoria_da_computa%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Garbage_in,_garbage_out
https://pt.wikipedia.org/wiki/M%C3%A1quina_abstrata
https://pt.wikipedia.org/wiki/Negocia%C3%A7%C3%B5es_de_alta_frequ%C3%AAncia
https://pt.wikipedia.org/wiki/Algoritmo_probabil%C3%ADstico
https://pt.wikipedia.org/wiki/Algoritmo_de_Euclides
https://pt.wikipedia.org/wiki/Encyclop%C3%A6dia_Britannica
https://www.britannica.com/science/algorithm
http://worldcat.org/oclc/1028615961
https://pt.wikipedia.org/wiki/OCLC
https://www.worldcat.org/oclc/1028615961
http://repositorio.ipl.pt/bitstream/10400.21/2540/1/Disserta%C3%A7%C3%A3o.pdf
http://www.decom.ufop.br/menotti/paa101/slides/aula-AnaliseAlgoritmos.pdf
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/9722218646
http://expresso.sapo.pt/algoritmos-assaltam-mercados-de-icommoditiesi-depois-das-bolsas=f714175
https://www.worldcat.org/oclc/130674
https://pt.wikipedia.org/wiki/International_Standard_Book_Number
https://pt.wikipedia.org/wiki/Especial:Fontes_de_livros/0030846935
https://pt.wikipedia.org/wiki/OCLC
https://www.worldcat.org/oclc/130674
http://www.apoioinformatica.inf.br/produtos/visualg
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:P%C3%A1gina_principal
https://pt.wikipedia.org/wiki/Portal:Conte%C3%BAdo_destacado
https://pt.wikipedia.org/wiki/Portal:Eventos_atuais
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Esplanadahttps://pt.wikipedia.org/wiki/Especial:Aleat%C3%B3ria
https://pt.wikipedia.org/wiki/Portal:%C3%8Dndice
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Boas-vindas
https://pt.wikipedia.org/wiki/Ajuda:P%C3%A1gina_principal
https://pt.wikipedia.org/wiki/Ajuda:P%C3%A1gina_de_testes
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Portal_comunit%C3%A1rio
https://pt.wikipedia.org/wiki/Especial:Mudan%C3%A7as_recentes
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Manuten%C3%A7%C3%A3o
https://pt.wikipedia.org/wiki/Ajuda:Guia_de_edi%C3%A7%C3%A3o/Como_come%C3%A7ar_uma_p%C3%A1gina
https://pt.wikipedia.org/wiki/Especial:P%C3%A1ginas_novas
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Contato
https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=20120521SB001&uselang=pt
https://pt.wikipedia.org/wiki/Especial:P%C3%A1ginas_afluentes/Algoritmo
https://pt.wikipedia.org/wiki/Especial:Altera%C3%A7%C3%B5es_relacionadas/Algoritmo
https://pt.wikipedia.org/wiki/Wikipedia:Carregar_ficheiro
https://pt.wikipedia.org/wiki/Especial:P%C3%A1ginas_especiais
https://pt.wikipedia.org/w/index.php?title=Algoritmo&oldid=62022681
https://pt.wikipedia.org/w/index.php?title=Algoritmo&action=info
https://pt.wikipedia.org/w/index.php?title=Especial:Citar&page=Algoritmo&id=62022681&wpFormIdentifier=titleform
https://www.wikidata.org/wiki/Special:EntityPage/Q8366
https://www.wikidata.org/wiki/Special:EntityPage/Q8366#sitelinks-wikipedia
https://www.wikidata.org/wiki/Special:EntityPage/Q8366#sitelinks-wikipedia
https://www.wikidata.org/wiki/Special:EntityPage/Q8366#sitelinks-wikipedia
https://pt.wikipedia.org/w/index.php?title=Especial:Livro&bookcmd=book_creator&referer=Algoritmo
https://pt.wikipedia.org/w/index.php?title=Especial:DownloadAsPdf&page=Algoritmo&action=show-download-screen
https://pt.wikipedia.org/w/index.php?title=Algoritmo&printable=yes
https://commons.wikimedia.org/wiki/Category:Algorithms
https://pt.wikipedia.org/wiki/Wikip%C3%A9dia:P%C3%A1gina_principal
https://pt.wikipedia.org/w/index.php?title=Especial:Criar_conta&returnto=Algoritmo

Outros materiais