Algoritmia e Computação

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 224

Algoritmia e computao

PDF gerado usando o pacote de ferramentas em cdigo aberto mwlib. Veja http://code.pediapress.com/ para mais informaes.
PDF generated at: Fri, 26 Apr 2013 05:35:23 UTC
Contedo
Pginas
Estruturas de dados 1
Estrutura de dados 1
Problema do caixeiro viajante 3
Busca em largura 3
rvore B+ 10
rvore (estrutura de dados) 15

Algoritmos 16
Anexo:Lista de algoritmos 16
rvore de busca binria 21
Algoritmo de busca 21
rvore binria 23
Algoritmo 31
Crivo de Eratstenes 35
Algoritmo de Dijkstra 37
Algoritmo guloso 41
Busca em profundidade 41
Pesquisa binria 43
rvore AVL 50
Problema do caminho mnimo 52
rvore B 53

Programao dinmica 63
Programao dinmica 63

Grafos 64
Grafo 64
Teoria dos grafos 65

Outros a catalogar a seu tempo 72


Lista ligada 72
Complexidade computacional 81
Pascal (linguagem de programao) 94
Algoritmo de ordenao 100
Algoritmo gentico 101
Decomposio de Dantzig-Wolfe 104
Diviso e conquista 105
Minimax 106
Mtodo do gradiente conjugado 107
Algoritmo simplex 108
Simulated annealing 109
Algoritmo busca-ciclos de Floyd 112
Algoritmo Chaff 113
Visualg 118
Algoritmo Doomsday 118
Algoritmo DPLL 121
Algoritmo Earley 123
Algoritmo Needleman-Wunsch 126
Algoritmo RANDU 128
Algoritmo Yarrow 129
Algoritmo astronmico 130
Algoritmo das economias 130
Algoritmo de Boor 131
Algoritmo de Strassen 131
Algoritmo de Wagner-Whitin 133
Algoritmo de chave simtrica 137
Algoritmo de multiplicao de Booth 139
Algoritmo de pesquisa 142
Algoritmo do Avestruz 142
Algoritmo do Banqueiro 142
Algoritmo do Castor 143
Algoritmo embrulho para presente 143
Algoritmo para extrao da raiz quadrada 144
Algoritmo probabilstico 150
Algortmica 154
Amostragem de Gibbs 154
Analisador sinttico LL 154
Analisador sinttico LR 156
Analisador sinttico descendente recursivo 159
Anlise de algoritmos 160
Algoritmos de Berkeley 161
CRC 161
Algoritmo CYK 163
Comb sort 164
Congruncia de Zeller 168
Algoritmo de Cristian 169
Crivo de Atkin 170
Deteco e correco de erros 170
Dgito verificador 170
Dgito verificador GS1 172
Algoritmo de discagem predictiva 173
Algoritmo de disperso 173
Distncia Levenshtein 174
Diviso polinomial 177
Eleio de lder 177
Encapsulao 178
Escalonamento garantido 178
Exame de Graham 179
FIFO (escalonamento) 181
Fluxograma 183
Fora bruta 184
Gerador de nmeros pseudoaleatrios 186
Heurstica (computao) 186
Intratabilidade 188
Jaro-Winkler 188
Juno hash 188
Algoritmo de Kruskal 189
Lamport ordering 190
Leaky Bucket 191
Mtodo de Monte Carlo 191
Mtodo de Newton 194
Mtodo das secantes 195
Mltiplas filas 196
Algoritmo next-fit 198
Otimizao da colnia de formigas 199
Particionamento binrio de espao 199
Algoritmo de Peterson 200
Poda alfa-beta 201
Problema da vazo mxima 202
Problema do par de pontos mais prximo 203
Prosthaphaeresis 204
Pseudocdigo 204
Rsync 205
SJF 206
Sistema de reduo 207
Solitaire cipher 209
Algoritmo de sudoku 209
Tcnicas de projeto de algoritmos 211
Teste de primalidade 211
Token Bucket 212
Worst-fit 212

Referncias
Fontes e Editores da Pgina 213
Fontes, Licenas e Editores da Imagem 217

Licenas das pginas


Licena 219
1

Estruturas de dados

Estrutura de dados
Na Cincia da computao, uma estrutura de dados um modo
particular de armazenamento e organizao de dados em um
computador de modo que possam ser usados eficientemente.[1][2]
Diferentes tipos de estrutura de dados so adequadas a diferentes tipos
de aplicao e algumas so altamente especializadas, destinando-se a
algumas tarefas especficas. Por exemplo, as B-trees so
particularmente indicadas para a implementao de bases de dados ,
enquanto que a implementao de compiladores geralmente requer o
uso de tabela de disperso para a busca de identificadores.

Estruturas de dados e algoritmos so temas fundamentais da cincia Uma rvore binria uma estrutura de dados.

da computao, sendo utilizados nas mais diversas reas do


conhecimento e com os mais diferentes propsitos de aplicao. Sabe-se que algoritmos manipulam dados. Quando
estes dados esto organizados (dispostos) de forma coerente, caracterizam uma forma, uma estrutura de dados. A
organizao e os mtodos para manipular essa estrutura que lhe conferem singularidade.
As estruturas de dados so chamadas tipos de dados compostos que dividem-se em homogneos (vetores e matrizes)
e heterogneos (registros). As estruturas homogneas so conjuntos de dados formados pelo mesmo tipo de dado
primitivo. As estruturas heterogneas so conjuntos de dados formados por tipos de dados primitivos diferentes
(campos do registro) em uma mesma estrutura. A escolha de uma estrutura de dados apropriada pode tornar um
problema complicado em um de soluo relativamente simples. O estudo das estruturas de dados est em constante
desenvolvimento (assim como o de algoritmos), mas, apesar disso, existem certas estruturas clssicas que se
comportam como padres.

Estruturas de dados clssicas

Vetores ou arrays
VetoresPB, ou vectoresPE ou arrays so estruturas de dados lineares e estticas, isto , so compostas por um
nmero fixo (finito) de elementos de um determinado tipo de dados. O tempo de acesso aos elementos de um vetor
muito rpido, sendo considerado constante: o acesso aos elementos feito pelo seu ndice no vetor. Porm, a
remoo de elementos pode ser custosa se no for desejvel que haja espaos "vazios" no meio do vetor, pois nesse
caso necessrio "arrastar" de uma posio todos os elementos depois do elemento removido.
Essa uma estrutura muito recomendada para casos em que os dados armazenados no mudaro, ou pouco mudaro,
atravs do tempo.
Estrutura de dados 2

Lista
Uma Lista uma estrutura de dados linear. Uma lista ligada, tambm chamada de encadeada, linear e dinmica,
composta por ns que apontam para o prximo elemento da lista, com exceo do ltimo, que no aponta para
ningum. Para compor uma lista encadeada, basta guardar seu primeiro elemento.

Fila
As filas so estruturas baseadas no princpio FIFO (first in, first out), em que os elementos que foram inseridos no
incio so os primeiros a serem removidos. Uma fila possui duas funes bsicas: ENQUEUE, que adiciona um
elemento ao final da fila, e DEQUEUE, que remove o elemento no incio da fila. A operao DEQUEUE s pode
ser aplicado se a fila no estiver vazia, causando um erro de underflow ou fila vazia se esta operao for realizada
nesta situao.

Pilha
A pilha uma estrutura de dados baseada no princpio LIFO (last in, first out), na qual os dados que foram inseridos
primeiros na pilha sero os ltimos a serem removidos. Existem duas funes que se aplicam a todas as pilhas:
PUSH, que insere um dado no topo da pilha, e POP, que remove o item no topo da pilha.

rvores
Uma rvore uma estrutura de dados em que cada elemento tem um ou mais elementos associados, podendo
definir-se uma rvore recursivamente como:
1. uma estrutura (uma rvore);
2. um n (designado por raiz), que contm a informao a armazenar e um conjunto finito de rvores (as
sub-rvores).
3. No Existe rvores vazias, no minmo haver um n raiz(que no possui pai)
Cada rvore tem apenas uma raiz. Alm disso, os elementos associados a cada n so habitualmente chamados de
filhos desses ns. Os ns sem filhos de uma rvore so chamados de folhas.

rvores binrias
Uma rvore binria uma rvore em que cada n tem no mximo dois filhos. So muito utilizadas como estruturas
de buscas, como rvores de busca binria e rvores AVL.

Tabela de hashing
[1] Paul E. Black (ed.), Data structure. Dictionary of Algorithms and Data Structures. U.S. National Institute of Standards and Technology,
2004. Verso online (http:/ / www. itl. nist. gov/ div897/ sqg/ dads/ HTML/ datastructur. html) .
[2] Data structure. Encyclopdia Britannica (2009) Online (http:/ / www. britannica. com/ EBchecked/ topic/ 152190/ data-structure)
Problema do caixeiro viajante 3

Problema do caixeiro viajante


1. REDIRECIONAMENTO Problema do caixeiro-viajante

Busca em largura
Na teoria dos grafos, busca em largura (ou busca em
amplitude, tambm conhecido em ingls por
Breadth-First Search (BFS)) um algoritmo de busca
em grafos utilizado para realizar uma busca ou
travessia num grafo e estrutura de dados do tipo rvore.
Intuitivamente, voc comea pelo vrtice raiz e explora
todos os vrtices vizinhos. Ento, para cada um desses
vrtices mais prximos, exploramos os seus vrtices
vizinhos inexplorados e assim por diante, at que ele
encontre o alvo da busca.

Ordem dos vrtices explorados na busca em largura

Definio
Formalmente, uma busca em largura um mtodo de busca
no-informada (ou desinformada) que expande e examina
sistematicamente todos os vrtices de um grafo direcionado ou
no-direcionado. Em outras palavras, podemos dizer que o algoritmo
realiza uma busca exaustiva num grafo passando por todas as arestas e
vrtices do grafo. Sendo assim, o algoritmo deve garantir que nenhum
vrtice ou aresta ser visitado mais de uma vez e, para isso, utiliza uma
estrutura de dados fila para garantir a ordem de chegada dos vrtices.
Percurso realizado pelo algoritmo
Dessa maneira, as visitas aos vrtices so realizadas atravs da ordem
de chegada na estrutura fila e um vrtice que j foi marcado no pode
retornar a esta estrutura.

Uma analogia muito conhecida (figura ao lado) para demonstrar o funcionamento do algoritmo pintando os
vrtices de branco, cinza e preto. Os vrtices na cor branca ainda no foram marcados e nem infileirados, os da cor
cinza so os vrtices que esto na estrutura fila e os pretos so aqueles que j tiveram todos os seus vrtices vizinhos
infileirados e marcados pelo algoritmo.
Tal mecanismo permite que se descubra todos os vrtices a uma distncia n do vrtice raiz antes de qualquer outro
vrtice de distancia n+a com a1, sendo n o nmero de arestas para atingir qualquer outro vrtice no grafo
considerado. Essa caracterstica do algoritmo permite construir uma rvore de distncias mnimas (menor nmero de
Busca em largura 4

arestas) entre o vrtice raiz e os demais, sendo que o vrtice responsvel por infileirar o seu vizinho na cor branca
que ser o vrtice pai deste na representao em rvore gerada.

Caractersticas

Complexidade de Tempo
Considerando um grafo representado em listas de adjacncia, o pior caso, aquele em que todos os vrtices e arestas
so explorados pelo algoritmo, a complexidade de tempo pode ser representada pela seguinte expresso
, onde significa o tempo total gasto nas operaes sobre todas as arestas do grafo onde cada
operao requer um tempo constante sobre uma aresta, e que significa o nmero de operaes sobre
todos os vrtices que possui uma complexidade constante para cada vrtice uma vez que todo vrtice
enfileirado e desinfileirado uma unica vez.

Complexidade de Espao
Quando o nmero de vrtices no grafo conhecido e supondo-se a representao deste em listas de adjacncia, a
complexidade de espao do algoritmo pode ser representada por onde representa o nmero total de
vrtices no grafo.

Pseudocdigo
A seguir apresentado um pseudocdigo do algoritmo busca em largura para uma estrutura de dados grafo com lista
de adjacncia. A letra F representa uma fila (FIFO) inicialmente vazia, G o grafo em questo e s, v, w representam
vrtices do grafo onde listaDeAdjacncia representa a lista de adjacncia de um vrtice.

BuscaEmLargura
escolha uma raiz s de G
marque s
insira s em F
enquanto F no est vazia faa
seja v o primeiro vrtice de F
para cada w listaDeAdjacncia de v faa
se w no est marcado ento
visite aresta entre v e w
marque w
insira w em F
senao se w F entao
visite aresta entre v e w
fim se
fim para
retira v de F
fim enquanto
Busca em largura 5

Exemplo 1
Seguindo os passos do pseudocdigo acima e iniciando no vrtice 6 da
figura ao lado, o algoritmo estar com a sequncia de vrtices
marcados e a fila assim:

Grafo exemplo 1

Vrtices Marcados= ; Fila(F)=.


Vrtices Marcados= 6; Fila(F)=6.
Vrtices Marcados= 6,4; Fila(F)=6,4.
Vrtices Marcados= 6,4; Fila(F)=4.
Vrtices Marcados= 6,4,5; Fila(F)=4,5.
Vrtices Marcados= 6,4,5,3; Fila(F)=4,5,3.
Vrtices Marcados= 6,4,5,3; Fila(F)=5,3.
Vrtices Marcados= 6,4,5,3,1; Fila(F)=5,3,1.
Vrtices Marcados= 6,4,5,3,1,2; Fila(F)=5,3,1,2.
Vrtices Marcados= 6,4,5,3,1,2; Fila(F)=3,1,2.
Vrtices Marcados= 6,4,5,3,1,2; Fila(F)=1,2.
Vrtices Marcados= 6,4,5,3,1,2; Fila(F)=2.
Vrtices Marcados= 6,4,5,3,1,2; Fila(F)=.

Exemplo 2
Aplicando o pseudocdigo nesse grafo de cidades alems e iniciando o algoritmo na cidade de Frankfurt, repare que
para montar a arvore da figura foi necessrio gravar na figura apenas as arestas que so processadas na primeira
condio "se" do pseudocdigo (se w no est marcado ento). Caso as arestas desse exemplo no fossem valoradas
(como no primeiro exemplo) ficaria fcil encontrar a distncia para o vrtice raiz com o algoritmo busca em largura,
mas, para o grafo deste exemplo (que so valoradas) pesquise por Algoritmo de Dijkstra para encontrar o menor
caminho de um vrtice a outro.
Busca em largura 6

Exemplo de um mapa da Alemanha com algumas conexes entre as


cidades.

rvore gerada em um algoritmo BFS comeando em Frankfurt.

C
int BuscaEmLargura(Grafo *G, Fila *F, int raiz)
{
int *verticesMarcados = (int*)malloc(G->NumVertices *
sizeof(int));//vetor de vertices marcados
int tamVerticesMarcados= 0;
int vertice1;
no_lista *p;
Busca em largura 7

verticesMarcados[0] = raiz;//marca raiz


tamVerticesMarcados++;

PoeVerticeNaFila(F , raiz); //poe raiz na fila

while(!FilaVazia(F))//enquanto a fila nao esta vazia


{
vertice1 = F->ini->vertice;//vertice que esta no inicio da fila

p = G->Ladj[vertice1-1].inicio;// Ladj = lista de adjacencia de


vertice1

while(p!=NULL)//enquanto a lista de adjacencia do vertice1 nao


acaba
{
if(!BuscaVertice(p->vertice, verticesMarcados,
tamVerticesMarcados))//busca p->vertice no vetor verticesMarcados
{
verticesMarcados[tamVerticesMarcados++] =
p->vertice;//marcou p->vertice
PoeVerticeNaFila(F , p->vertice);//poe p->vertice na fila

//arestas que compoem arvore geradora mnima, aresta


(vertice1, p->vertice)
}
else
if(WPertenceF(p->vertice, F))//se p->vertice pertence a F
{
//arestas (vertice1, p->vertice) que no compoem rvore
geradora mnima
}
p = p->prox;
}
RetiraVerticeFila(F);
}
return 0;
}

Exemplo de Implementao em Object Pascal


program Busca_em_largura;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
Busca em largura 8

vListaNos : array[1..8] of char;

function NoEsquerdo(pNoAtual: Integer): integer;


begin
result := (2 * pNoAtual);
end;
function NoDireito(pNoAtual: Integer): integer;
begin
result := (2 * pNoAtual) + 1;
end;
function busca_Largura (Inicio : integer; Alvo: Char): integer;
var
vAchou : Boolean;
vLoop : integer;
begin
vAchou := false;
vLoop := Inicio;
Result := -1;
if vListaNos[Inicio] = Alvo then begin
vAchou := true;
Result := Inicio;
end;
while (not vAchou) and (vLoop <= 8) do begin
if vListaNos[NoEsquerdo(vLoop)] = Alvo then begin
vAchou := true;
Result := NoEsquerdo(vLoop);
end else if vListaNos[NoDireito(vLoop)] = Alvo then begin
vAchou := true;
Result := NoDireito(vLoop);
end;
inc(vLoop);
end;
end;

begin
{ Busca em largura na rvore binria }
// Preenchimento da arvore, demostrao grfica e posicionamento na
mesma
vListaNos[1] := 'R'; { R 1 }
vListaNos[2] := 'G'; { / \ / \ }
vListaNos[3] := 'Q'; { G Q 2 3 }
vListaNos[4] := 'Y'; { /\ /\ /\ /\ }
vListaNos[5] := 'J'; { Y J B E 4 5 6 7 }
vListaNos[6] := 'B'; { / / }
vListaNos[7] := 'E'; { P 8 }
vListaNos[8] := 'P';
// Pesquisa por elementos na rvore
Busca em largura 9

Writeln('A letra "J" esta no no numero: '+ IntToStr(busca_Largura(2,


'J')));
Writeln('A letra "B" esta no no numero: '+ IntToStr(busca_Largura(1,
'B')));
Writeln('A letra "R" esta no no numero: '+ IntToStr(busca_Largura(1,
'R')));
Writeln('A letra "P" esta no no numero: '+ IntToStr(busca_Largura(4,
'P')));
Writeln('A letra "Y" esta no no numero: '+ IntToStr(busca_Largura(1,
'Y')));
Writeln('A letra "E" esta no no numero: '+ IntToStr(busca_Largura(1,
'E')));
Writeln('A letra "Q" esta no no numero: '+ IntToStr(busca_Largura(1,
'Q')));
Readln;
end.

Usos e extenses
Achar componentes conectados
Achar todos os ndulos contectado a apenas um componente
Achar o menor caminho entre um n raiz e os outros ns do grafo
Testar bipartio em grafos
O conjunto de ns alcanados pela busca em largura so os maiores componentes conectados que contm o n
inicial. Se no houver arestas nos ns adjacentes numa mesma camada de busca, ento o grafo deve conter um
nmero mpar de ciclos e no ser bipartido.
rvore B+ 10

rvore B+
Na cincia da computao uma rvore
B+ uma estrutura de dados do tipo
rvore derivada das rvores B, mas
com uma forma diferente de
armazenamento de suas chaves. Tal
organizao confere propriedades,
algoritmos de insero, busca e
remoo de chaves diferentes dos
utilizados em rvores B, mas com uma
gama de aplicaes muito semelhantes
Exemplo simples de rvore B+ referenciando chaves de 1 at 7 aos dados d1 at d7. Os
em banco de dados e sistemas de apontadores em vermelho permitem o acesso sequencial ordenado das chaves inseridas na
arquivos. rvore

Estruturas de dados como essa so


muito empregadas em banco de dados e sistemas de arquivos como o NTFS para o Microsoft Windows, o sistema de
ficheiros ReiserFS para Unix, o XFS para IRIX e Linux, e o JFS2 para AIX, OS/2 e Linux, usam este tipo de rvore.
Assim como as rvores B, as rvores B+ visam reduzir as operaes de leitura e escrita em memria secundria,
uma vez que, essas operaes so demoradas para um sistema computacional e devem ser minimizadas sempre que
possvel.

Viso Geral
A rvore B+ aparentemente foi
proposta por Knuth e grande parte da
literatura sobre essa estrutura
encontrada em forma de artigos ao
invs de livros.[] Com ela foi possvel
organizar um arquivo de maneira que o
processamento sequencial
(caracterstica at ento pouco Organizao de uma rvore B+ em index set e sequence set. Os ns folha so os amarelos
eficiente para rvores B) e aleatrio de e os azuis so os ns internos
chaves fossem eficientes

A idia inicial desta variao da rvore B manter todas as chaves de busca em seus ns folha de maneira que o
acesso sequencial ordenado das chaves de busca seja um processo mais eficiente do que em rvores B. Obviamente
tal acesso sequencial tambm possivel nestas, mas, para isso seria necessrio algum algoritmo semelhante ao
percurso em ordem realizado numa rvore binria.
Para manter o acesso sequencial, cada n folha contm apontadores para quais ns so seus predecessores ou
sucessores na sequncia de chaves e como nas rvores B, as chaves esto ordenadas tanto em suas pginas internas
quanto em pginas folha. Dessa forma, quando realizamos uma busca por uma chave k e para encontrarmos a chave
k+1, ou seja sua sucessora na ordem, basta verificar a chave ao lado de k caso k+1 esteja na mesma pgina de k ou
carregar a prxima pgina contida na lista de pginas para verificar qual chave sucede k. Tal procedimento em
rvores B seria mais custoso, pois, deveramos buscar por k+1 iniciando pela raiz da rvore caso k+1 no estivesse
na mesma pgina de k. Em comparao com as rvores B, este tipo de acesso sequencial s chaves um dos
principais benefcios proporcionados pelas rvores B+.
rvore B+ 11

Alm desta caracterstica, tambm devemos analisar suas semelhanas com as rvores B. A organizao das pginas
internas ou no ingls index set semelhante a de uma rvore B, este, por sua vez, armazena cpias de chaves para
refernciar as buscas, mas no contm as chaves em si. J no sequence set esto as pginas folha que contm as
chaves inseridas na rvore e funciona como uma lista encadeada permitindo o acesso sequencial ordenado s chaves
independente do index set.

Definio
Para definir uma rvore B+ devemos levar em considerao alguns aspectos relativos ao disco de memria
secundria utilizado e a quantidade de memria primria disponvel. Assim, para escolher o tamanho de uma pgina
de sequence set e, portanto, quantas chaves esta pode armazenar uma tarefa dependente do disco utilizado:
suponhamos que cada pgina folha armazene d chaves.
O index set, como dito anteriormente, apenas carrega cpias de chaves para refernciar a busca e sua construo
semelhante ao de uma rvore B. Suponhamos que estes ns internos possam apontar para n ns filhos, ou seja, uma
rvore B com no mximo n-1 chaves por pgina.
Com tais suposies, diferentemente das rvores B, os nmeros d e n-1 no so necessariamente iguais, mas, manter
o tamanho fsico em arquivo dessas pginas iguais facilita a implementao da estrutura e geralmente o melhor a se
fazer manter o tamanho fsico em arquivo de ambas as pginas iguais.[]

Pginas internas
As pginas internas apresentam apenas referncias para a localizao das chaves de busca contidas nas pginas folha.
Estas pginas incluem a pgina raiz da rvore e todos os nodos internos (exceto as pginas folha). Ou seja, as
pginas internas funcionam como um ndice que apenas apontam para a localizao exata de uma chave e sua
construo semelhante ao de uma rvore B com nmero mnimo de chaves igual a n/2-1 e mximo de n-1 por
pgina.

Pginas folha
Nas pginas folha esto abrigadas todas as chaves inseridas e durante o processo de insero e remoo de chaves
estas podem sofrer overflows ou underflows conforme estas violem o nmero mximo igual a d ou mnimo igual a
d/2 permitido de chaves.

Operaes bsicas
rvore B+ 12

Busca
A operao de busca sobre uma rvore
B+ pode ser realizada de duas
maneiras: iniciando a busca (linear ou
binria) pelo apontador para o
sequence set ou pelo apontador para a
raz da rvore. O mtodo mais eficiente
pelo apontador para a raz na qual
semelhante ao realizado numa rvore
B. Dessa forma quando buscamos uma
chave k, percorremos a rvore de cima
para baixo carregando as pginas Figura 1: Antes e depois da insero da chave 3 na rvore B+
internas e selecionando a pgina
apontada pelo ponteiro correspondente
ao intervalo no qual pertence k e caso
uma cpia de k esteja numa pgina
interna devemos carregar a pgina
direita de k. Encontrado uma pgina
folha o algoritmo deve buscar k nesta e
responder se ela se encontra ou no.

Insero
Durante a insero de chaves numa
rvore B+ as pginas folha podem
sofrer overflow caso j estejam cheias.
Assim, aps buscar a pgina folha que Figura 2: Antes e depois da insero da chave 25 na rvore B+. Aqui a chave
intermediria do processo de split a chave 22
uma chave deve ser inserida, devemos
analisar dois casos:

1. Pgina folha incompleta: Apenas inserimos a chave de maneira a manter a ordenao das chaves. Caso da figura
1.
2. Pgina folha completa: A pgina folha em questo deve sofrer uma operao de split. Tal operao cria uma
nova pgina em arquivo dividindo as chaves entre a nova pgina e a anterior. Assim devemos escolher uma chave
intermediria da sequncia formada por todas as chaves da pgina folha inclusive a chave a ser inserida e
distribuir essas chaves de maneira que a nova pgina contenha a chave intermediria e as chaves maiores do que
ela e a pgina anterior contenha as chaves menores do que a chave intermediria. Aps isso a chave intermediria
deve ser inserida no index set semelhante ao processo de insero em rvores B. Caso da figura 2.
rvore B+ 13

Remoo
A operao de remoo de chaves em
rvores B+ pode parecer algo
complicado, mas as mesmas tcnicas
empregadas em rvores B tambm
aplicam-se aqui. A redistribuio de
chaves e concatenao de pginas so
operaes mais simples de
compreender nessa estrutura contanto
que saibamos qual a chave
separadora de duas pginas adjacentes.
Assumindo que essa chave separadora
entre duas pginas adjacentes a
Figura 3: Antes e depois da remoo da chave 10
menor chave da pgina direita, o
index set deve conter uma cpia dessa
chave supondo que nenhuma operao
de remoo foi realizada sobre a
rvore.

Por exemplo, na figura 3 a chave


separadora do index set das pginas
folha que contm as chaves 20 e 30 o
valor 30 que est na raz do index set.
Para as pginas folha que contm as
chaves 50 e 60, a chave separadora no
index set o valor 60 e assim por
diante para as demais pginas folha.

Portanto, conhecido a chave que separa Figura 4: Antes e depois da remoo da chave 2.
duas pginas adjacentes, sabemos que
aps uma operao de remoo pode-se ocorrer underflow em suas pginas folha e se isso ocorrer devemos aplicar a
redistribuio de chaves entre o sequence set ou concatenar o contedo de pginas adjacentes.
Para cada mtodo deste temos uma alternativa para reconstruir o index set de maneira a mante-lo organizado
adequadamente, lembrando que quando uma chave removida e o underflow no constatado na pgina, no
precisamos fazer nada como na figura 3.
rvore B+ 14

A seguir so demonstrados dois


exemplos de redistribuio de chaves
nas figuras 4 e 5. Quando ocorrido o
underflow na pgina e a possibilidade
de redistribuir as chaves entre pginas
irms constatada, devemos alterar o
valor da chave separadora dessas
pginas adjacentes para o menor valor
da pgina direita resultante. Isso
somente possvel porque a pgina em
que foi removida a chave tem uma
pgina irm com um nmero maior de
Figura 5: Antes e depois da remoo da chave 30 chaves do que o mnimo permitido.

Na figura 6, apesar da remoo da


chave 20, no ocorre o underflow na
pgina e ainda assim o separador 20 no
index set um bom separador para
futuras buscas na rvore.
A figura 7 demonstra um caso em que
temos a necessidade de concatenar
duas pginas folha adjacentes. Aps a
remoo da chave 61 constatado o
underflow da pgina folha e a no
possibilidade de redistribuio de
chaves entre as pginas irms desta.
Figura 6: Antes e depois da remoo da chave 20 Sendo assim, a operao de
concatenao deve ser a opo para
manter as propriedades da rvore e, por
esse motivo, a chave separadora das
pginas que contm as chaves 50 e 60
deve ser removida do index set,
semelhante remoo em rvores B.

Bibliografia
Folk, Michael; Zoellick, Bill. File
Structures (em ingls). 2ed.
[S.l.]:Addison-Wesley, 1992.590
Figura 7: Antes e depois da remoo da chave 61. Nesta figura ocorre underflow na p. ISBN 0-201-55713-4
pgina folha do 61 e na pgina do index set que contm a chave separadora 60

Ligaes externas
Descrio do algoritmo de remoo de rvores B+ [1]
Demonstrao de um Java applet [2]
Implementao de Perl em rvores B+ [3]
Implementao de java/C#/python em rvores B+ [4]
rvore B+ 15

Referncias
[1] http:/ / ilpubs. stanford. edu:8090/ 85/
[2] http:/ / www. seanster. com/ BplusTree/ BplusTree. html
[3] http:/ / search. cpan. org/ ~hanenkamp/ Tree-BPTree-1. 07
[4] http:/ / bplusdotnet. sourceforge. net

rvore (estrutura de dados)


rvore, no contexto da programao e
cincia da computao, uma estrutura
de dados que herda as caractersticas das
topologias em rvore. Conceitualmente
diferente das listas encadeadas, em que os
dados se encontram numa sequncia, nas
rvores os dados esto dispostos de forma
hierrquica.

A rvore composta por 1(um) Elemento


principal chamado Raiz, que possui ligaes
para outros Elementos, que so
Representao simples de uma rvore binria equilibrada de altura trs (h=4).
denominados de Ramos ou filhos. Estes
ramos levam a outros elementos que
tambm possuem outros ramos. O elemento que no possui ramos conhecido como Folha e/ou N-terminal.

O nmero mximo de ramos em um elemento chamado Ordem da rvore. Uma rvore binria aquela de ordem
2, i.e., em que cada elemento possui no mximo 2 ramos.
Uma das operaes importantes consiste em percorrer cada elemento da rvore uma nica vez. Esse percurso,
tambm chamado de travessia da rvore, pode ser feito em pr-ordem (os filhos de um n so processados aps o
n) ou em ps-ordem (os filhos so processados antes do n). Em rvores binrias possvel ainda fazer uma
travessia em-Ordem, em que se processa o filho esquerda, o n, e finalmente o filho direita.
O algoritmo abaixo descreve uma travessia pr-ordem: PercursoPreordem(n): Processa n Para cada filho de n (se
houver) Executa recursivamente PercursoPreordem(filho)
Outra Operao, utilizada nas rvores de pesquisa a travessia da Raiz at uma das Folhas. Essa operao tem um
custo computacional proporcional ao nmero de nveis da rvore. O pior caso a travessia de todos os elementos at
a folha de nvel mais baixo. rvores balanceadas apresentam o melhor pior caso possvel, para um certo nmero de
Ns. O pior caso apresenta-se na rvore degenerada em que cada N possui exatamente Um filho, e a rvore tem o
mesmo nmero de nveis que de Ns, assemelhando-se a uma lista ligada.
16

Algoritmos

Anexo:Lista de algoritmos
Abaixo segue a lista de algoritmos, veja tambm a Lista de estruturas de dados e a Lista de termos relacionados aos
Algoritmos e Estruturas de Dados.

Algoritmos Combinatrios
Algoritmos Combinatrios Gerais
Algoritmo Busca-Cclica de Floyd: encontra ciclos em iteraes
Geradores de Nmeros Pseudo-aleatrios: produzem nmeros estatsticamente aleatrios
Blum Blum Shub: um gerador de nmeros pseudo-aleatrios com prova de segurana
Algoritmo Yarrow

Algoritmos de Grafos
Veja artigo principal Teoria de Grafos
Algoritmo de Bellman-Ford: calcula o caminho mais curto num grafo pesado (onde alguns dos pesos das
extremidades podem ser negativos)
Algoritmo de Dijkstra: calcula o caminho mais curto num grafo com peso absoluto das extremidades.
Algoritmo de Floyd-Warshall: resolve o problema do caminho mnimo entre todos os partes de vrtices em um
grafo com direo e peso.
Algoritmo de Kruskal: encontra a rvore de extenso mnima para um grafo.
Algoritmo de Prim: encontra a rvore de extenso mnima para um grafo.
Algoritmo de Boruvka: encontra a rvore de extenso mnima para um grafo.
Algoritmo de Ford-Fulkerson: calcula o vazo mxima num grafo.
Algoritmo de Edmonds-Karp: implementao de Ford-Fulkerson.
Nonblocking Minimal Spanning Switch digamos, para um telephone exchange.
Spring based algorithm: algoritmo para desenhar grafos.
Algoritmo das economias: algoritmo para encontrar a menor rota em um grafo.

Algoritmos de Busca
Busca linear: encontra um elemento numa lista no ordenada
Busca binria: encontra um elemento numa lista ordenada
Pesquisa binria numa sequncia cclica: encontra o menor elemento numa lista formada por elementos em
sequencia de forma cclica.
Pesquisa binria em sequncias de intervalo desconhecido: neste caso, no se sabe o tamanho da sequncia.
Encontra um intervalo onde est o elemento procurado, depois aplica busca binria.
Busca em rvore binria
Busca em largura: percorre uma rvore nvel por nvel
Busca em profundidade: percorre um rvore galho por galho
Busca pela melhor escolha: percorre uma rvore em uma ordem de provvel importncia, usando uma fila de
prioridades.
Anexo:Lista de algoritmos 17

Busca A*: um caso especial da busca pela melhor escolha


Busca Hash: encontra um elemento em uma lista indexada por uma tabela hash
Predictive search

Algoritmos de Pesquisa em Strings


Algoritmo de Knuth-Morris-Pratt
Algoritmo de Rabin-Karp
Algoritmo de Boyer-Moore
Algoritmo de Boyer-Moore-Horspool
Algoritmo de Baeza-Yates-Gonnet (Shift-And, Shift-Or ou Bitap)

Algoritmo de ordenao
Bogosort: engraado e lento.
Classificao Bolha: para cada par de ndices, mude os itens de posio se fora de ordem!!!
Bucket sort
Classificao Pente: Parecido com o mtodo Bolha.
Cocktail sort
Count sort: Ordena um arranjo posicionando o valor devido ao seu tamanho comparado aos outros.
Counting sort
Gnome sort
Heapsort: converta a lista num heap, continue removendo o maior elemento do heap e adicionando-o no fim da
lista.
Ordenao por insero: determina qual posio o item atual pertence na lista dos classificados e o insere ali.
Classificao Fuso: Classifique a primeira e a segunda metade da lista separadamente, e ento junte as listas
classificadas.
Pancake sorting
Pigeonhole sort
Quicksort: divida a lista em dois, com todos os itens da primeira lista sendo menores que os itens da segunda e
ento classifique as duas listas. Certamente o mtodo de escolha.
Radix sort: classifica strings letra por letra.
Ordenao por seleo: escolha o menor dos elementos restantes, adicione ao final/incio da lista classificada.
Shell sort: uma tentativa de otimizao do insertion sort.
Smoothsort: um variao do Heap sort
Stupid sort
Topological sort
Anexo:Lista de algoritmos 18

Algoritmos de Compresso
Codificao aritmtica: Codificao de Entropia (sempre alcana a entropia da fonte)
Mtodo de Burrows-Wheeler: preprocessamento til para compresso sem perda de dados
DEFLATE: compresso sem perda de dados
Codificao Delta: apoio para compresso de dados na qual dados sequenciais acorrem freqentemente.
Codificao de Huffman: Codificao de Entropia por Palavras-Cdigo
Incremental encoding: codificao delta aplicada a uma sequncia de strings
LZW: Codificaao baseada em dicionrio (Lempel, Ziv, Welch)
LZ77: Codificaao baseada em dicionrio com "janela deslizante" (sliding window em ingls). A base do
DEFLATE.
LZ78: Codificaao baseada em dicionrio da qual evoluiu o LZW.
Codificao Run-length: Codificao por Comprimento de Sequencia

Compresso de dados

Teoria

Com perda Sem perda

Tipo de dados de origem

udio banda imagens vdeo

Mtodos

Lista de algoritmos - Algoritmos de Compresso

Geometria Computacional
Algoritmo Embrulho de Presente: determinando o envoltrio convexo de um conjunto de pontos.
Exame de Graham determina o envoltrio convexo de um conjunto de pontos num plano.
Teste Ponto no Polgono: testa se um dado ponto est ou no dentro de um polgono.

Computao Grfica
Algoritmo de linha de Bresenham: plota pontos de uma matriz bidimensional para traar uma linha reta entre dois
pontos especficos.
Algoritmo do Pintor: detecta partes visveis de um cenrio tridimensional.
Traado de raios: interpretao de imagens reais.

Algoritmos Criptogrficos
Veja tambm Tpicos de Criptografia para um 'glossrio analtico'
Criptografia de chave simtrica (chave secreta):
Padro de Criptografia Avanada (AES), vencedor da competio NIST
Blowfish
Padro de Criptografia de Dados (DES), tambm chamado de DE, vencedor da competio NBS, substitudo
pelo AES para a maioria dos propsitos.
IDEA
RC4
Criptografia assimtrica (de chave pblica) ou Assinatura digital:
DSA
Anexo:Lista de algoritmos 19

ElGamal
RSA
NTRUEncrypt
Funes Criptogrficas de Condensao de Mensagem:
MD5
MD4
RIPEMD-160
SHA-1
HMAC: autenticao chaveada de mensagem codificada.
Outros
Diffie-Hellman: troca de chaves.

Algoritmos de Sistemas Distribudos


Lamport ordering: ordenao parcial de eventos baseado na relao dos acontecimentos passados
Algoritmo Instantneo: um instantneo o processo de captura do estado global de um sistema
Ordenao de Vetor: uma ordenao total de eventos.

Algoritmos Numricos
Veja tambm artigo principal Anlise Numrica and Lista de tpicos de anlise numrica
Algoritmo de De Boor: calcula fendas.
Algoritmo de De Casteljau: calcula as curvas de Bezier.
Mtodo da Falsa Posio: aproxima razes de uma funo.
Eliminao de Gauss-Jordan: resolve sistemas de equaes lineares.
Algoritmo de Gauss-Legendre: calcula os dgitos de pi
Mtodo de Newton: encontra os zeros de uma funo com clculo
Funes de Arredondamento: modos clssicos de arredondar nmeros.
Mtodo da Secante: aproxima razes de uma funo.
Shifting nth-root algorithm: extrao da raiz dgito a dgito.
Raiz Quadrada: aproxima a raiz quadrada de um nmero.

Processamento de sinais digitais


CORDIC: tcnica de clculo rpido de funo trigonomtrica.
Fast Fourier transform: determina as frequncias contidas num (segmento de um) sinal.
Algoritmo de Cooley-Tukey FFT
Rainflow-counting algorithm: Reduz uma histria de stress complexa em uma contagem de revezes de stress
elementares para uso em anlise de fadiga.
Osem: algoritmo para processamento de imagens mdicas.
Anexo:Lista de algoritmos 20

Algoritmos de nmeros tericos


Algoritmo de Euclides: calcula o MDC.
Fatorizao de Inteiros: quebra um inteiro em seus fatores primitivos.
Diviso por tentativas
Fatorizao da curva elptica de Lenstra
Pollard's rho algorithm
Pollard's p-1 algorithm
Congruence of squares
Quadratic sieve
Special number field sieve
General number field sieve
Algoritmo de Multiplicao: rpida multiplicao de dois nmeros.
Teste de Primitividades: determina se um dado nmero primitivo.
Teste de primitividade de Miller-Rabin
Sieve of Eratosthenes: produz uma lista dos primeiros primitivos
AKS primality test

lgebra numrica
Algoritmo de Buchberger: encontra a base de Grobner.
Algoritmo de Eigenvalue
Exponentiating by squaring: calcula rapidamente a potncia de matrizes e nmeros.
Processo de Gram-Schmidt: ortogonaliza um conjunto de vetores.
Knuth-Bendix completion algorithm: para reescrita de sistemas de regras.
Algoritmo de diviso multivariada: para polinmios em vrios indeterminados

Otimizao
Simplex algorithm: um algoritmo para resolver o problema de programao linear.
Simulated annealing
(maiores detalhes em Otimizao Combinatria)
==Reeditado at aqui== refazer o resto (a parte abaixo) de acordo com a pgina em ingls Nem tudo est verificado
se em concordncia.

Anlise Gramatical
Algoritmo CYK: decide se uma dada string pode ser gerada a partir de uma Gramtica Livre de Contexto
Algoritmo Earley: Tambm decide se uma dada string pode ser gerada a partir de uma Gramtica Livre de
Contexto

Algoritmos Qunticos
Veja artigo principal Computao Quntica
Algoritmo de Grover: Providencia velocidade quadrtica para muitos problemas de busca.
Algoritmo de Shor: Providencia velocidade exponencial para fatorizar um nmero.
Algoritmo de Deutsch-Jozsa: Critrio de balanceamento para funes booleanas.
Anexo:Lista de algoritmos 21

Algoritmos Evolutivos
Algoritmo Gentico: Algoritmo evolutivo usado por regras de associao em minerao de dados.

Outros
Subset-sum: Aceita a completa linguagem NP Subset-sum em polinominal.
CORDIC: Tcnica de computao funo-rpida.
Cyclic redundancy check: Clculo de verificao de palavra.
Halt: Ningum sabe se este programa 43-byte C sempre pra.
Knuth-Bendix completion algorithm: para reescrever regras de sistemas.
Parity: Simples/rpida tcnica de deteco de erros. um nmero par ou mpar?
CHS conversion: Converte entre endereamento de disco nos sistemas.
Algoritmo Xor Swap: Troca os valores de duas variveis sem o uso do buffer.

rvore de busca binria


1. REDIRECIONAMENTO rvore binria de busca

Algoritmo de busca
Em cincia da computao, um algoritmo de busca, em termos gerais um algoritmo que toma um problema como
entrada e retorna a soluo para o problema, geralmente aps resolver um nmero possvel de solues.
Uma soluo, no aspecto de funo intermediria, um mtodo o qual um algoritmo externo, ou mais abrangente,
utilizar para solucionar um determinado problema. Esta soluo representada por elementos de um espao de
busca,[1] definido por uma frmula matemtica ou um procedimento, tal como as razes de uma equao com
nmeros inteiros variveis , ou uma combinao dos dois, como os circuitos hamiltonianos de um grafo.
J pelo aspecto de uma estrutura de dados, sendo o modelo de explanao inicial do assunto, a busca um algoritmo
projetado para encontrar um item com propriedades especificadas em uma coleo de itens. Os itens podem ser
armazenadas individualmente, como registros em um banco de dados[].
A maioria dos algoritmos estudados por cientistas da computao que resolvem problemas so algoritmos de
busca.[2]

Histria
Os algoritmos de busca tm como base o mtodo de procura de qualquer elemento dentro de um conjunto de
elementos com determinadas propriedades. Que podiam ser livros nas bibliotecas, ou dados cifrados, usados
principalmente durante as duas grandes guerras. Seus formatos em linguagem computacional vieram a se
desenvolver juntamente com a construo dos primeiros computadores. Sendo que a maioria de suas publicaes
conhecidas comea a surgir a partir da dcada de 1970.[3] Atualmente os algoritmos de busca so a base de motores
de buscas da Internet
Algoritmo de busca 22

Classes de algoritmos de busca

Para espaos de busca virtuais


Algoritmos para a busca de espaos virtuais so usados em problema de satisfao de restrio, onde o objetivo
encontrar um conjunto de atribuies de valores para certas variveis que iro satisfazer especficas equaes e
inequaes matemticas. Eles tambm so utilizados quando o objetivo encontrar uma atribuio de varivel que
ir maximizar ou minimizar uma determinada funo dessas variveis. Algoritmos para estes problemas incluem a
base de busca por fora bruta (tambm chamado de "ingnua" ou busca "desinformada"), e uma variedade de
heursticas que tentam explorar o conhecimento parcial sobre a estrutura do espao, como relaxamento linear,
gerao de restrio, e propagao de restries.
Algumas subclasses importantes so os mtodos de busca local , que vem os elementos do espao de busca como os
vrtices de um grafo, com arestas definidas por um conjunto de heursticas aplicveis ao caso, e fazem a varredura
do espao, movendo-se de item para item ao longo das bordas, por exemplo de acordo com o declive mximo ou
com o critrio da melhor escolha, ou em uma busca estocstica. Esta categoria inclui uma grande variedade de
mtodos metaheursticos gerais, como arrefecimento simulado, pesquisa tabu, times asscronos, e programao
gentica, que combinam heursticas arbitrrias de maneiras especficas.
Esta classe tambm inclui vrios algoritmos de rvore de busca, que vem os elementos como vrtices de uma
rvore (teoria dos grafos)rvore, e atravessam-na em alguma ordem especial. Exemplos disso incluem os mtodos
exaustivos, como em busca em profundidade e em busca em largura, bem como vrios mtodos de busca por poda de
rvore baseados em heurstica como retrocesso e ramo e encadernado . Ao contrrio das metaheursticas gerais, que
trabalham melhor apenas no sentido probabilstico, muitos destes mtodos de rvore de busca tm a garantia de
encontrar a soluo exata ou ideal, se for dado tempo suficiente.
Outra importante sub-classe consiste de algoritmos para explorar a rvore de jogo de jogos para mltiplos
participantes (multiplayer), como xadrez ou gamo, cujos ns consistem em todas as situaes de jogo possveis que
poderiam resultar da situao atual. O objetivo desses problemas encontrar o movimento que oferece a melhor
chance de uma vitria, tendo em conta todos os movimentos possveis do(s) adversrio(s). Problemas similares
ocorrem quando as pessoas, ou mquinas, tm de tomar decises sucessivas cujos resultados no esto totalmente
sob seu controle, como em um rob, ou na orientao de marketing, financeira ou de planejamento estratgico
militar. Este tipo de problema - pesquisa combinatria - tem sido extensivamente estudado no contexto da
inteligncia artificial. Exemplos de algoritmos para esta classe so o algoritmo minimax, poda alfa-beta e o
algoritmo A*.

Para sub-estruturas de uma dada estrutura


O nome de pesquisa combinatria geralmente usado para os algoritmos que procuram uma sub-estrutura especfica
de uma dada estrutura discreta, tais como um grafo, uma cadeia de caracteres, um grupo (matemtica) finito, e assim
por diante. O termo otimizao combinatria normalmente utilizado quando o objetivo encontrar uma
sub-estrutura com um valor mximo (ou mnimo) de algum parmetro. (Uma vez que a sub-estrutura normalmente
representada no computador por um conjunto de variveis de inteiros com restries, estes problemas podem ser
vistos como casos especiais de satisfao restrita ou otimizao discreta, mas eles geralmente so formulados e
resolvidos em um ambiente mais abstrato onde o representao interna no explicitamente mencionada.)
Uma subclasse importante e extensivamente estudados so os algoritmos de grafos, em particular algoritmos de
travessia de grafo, para encontrar determinada sub-estruturas em um dado grafo - como subgrafos, caminhos,
circuitos, e assim por diante. Exemplos incluem o algoritmo de Dijkstra, algoritmo de Kruskal, o algoritmo do
vizinho mais prximo, e algoritmo de Prim.
Outra subclasse importante desta categoria so os algoritmos de busca de cadeia de caracteres, que busca de padres
dentro de expresses. Dois exemplos famosos so os algoritmos Boyer-Moore e Knuth-Morris-Pratt, e vrios
Algoritmo de busca 23

algoritmos baseados nas estrutura de dados rvore de sufixo.

Busca pelo mximo de uma funo


Em 1953, Kiefer concebeu a busca de Fibonacci, que pode ser utilizada para encontrar o mximo de uma funo
unimodal e tem muitas outras aplicaes em cincias da computao.

Para computadores qunticos


H tambm mtodos de busca projetados para computadores qunticos, como o algoritmo de Grover, que so
teoricamente mais rpidos do que a busca linear ou fora bruta mesmo sem a ajuda de estruturas de dados ou
heursticas.

Ligaes externas
Uninformed Search Project [4] at the Wikiversity.
Unsorted Data Searching Using Modulated Database [5].

Referncias
[1] http:/ / aquilesburlamaqui. wdfiles. com/ local--files/ 2008-1-uern-novacruz-ca/ Aula10. ppt
[2] http:/ / aquilesburlamaqui. wdfiles. com/ local--files/ 2008-1-uern-novacruz-ca/ Aula10. ppt
[3] http:/ / www. cs. utexas. edu/ ~EWD/ transcriptions/ EWD09xx/ EWD930. html
[4] http:/ / en. wikiversity. org/ wiki/ Uninformed_Search_Project
[5] http:/ / sites. google. com/ site/ hantarto/ quantum-computing/ unsorted

rvore binria
Uma rvore binria uma estrutura de dados caracterizada por:
Ou no tem elemento algum (rvore vazia).
Ou tem um elemento distinto, denominado raiz, com dois
ponteiros para duas estruturas diferentes, denominadas
sub-rvore esquerda e sub-rvore direita.
Perceba que a definio recursiva e, devido a isso, muitas
operaes sobre rvores binrias utilizam recurso. o tipo de
rvore mais utilizado na computao. A principal utilizao de
rvores binrias so as rvores de busca binria.

Definies para rvores binrias Uma simples rvore binria de tamanho 9 e altura 3,
com um n raiz de valor 2. A rvore acima no est
Os ns de uma rvore binria possuem graus zero, um ou dois. Um balanceada e nem ordenada.

n de grau zero denominado folha.

Em uma rvore binria, por definio, cada n poder ter at duas folhas, sendo que ela se compara com a abb
(rvore binria de busca), apesar de no ter a propriedade da mesma ("na abb, existe uma regra na insero").
A profundidade de um n a distncia deste n at a raiz. Um conjunto de ns com a mesma profundidade
denominado nvel da rvore. A maior profundidade de um n, a altura da rvore.
Uma rvore "estritamente binria" uma rvore na qual todo n tem zero ou duas folhas. [1]
rvore binria 24

Existem autores, porm, que adotam essa definio para o termo quase completa, e utilizam o termo completa
apenas para rvores em que todos os nveis tm o mximo nmero de elementos.

Definies em teoria dos grafos


Em teoria dos grafos, uma rvore binria definida como um grafo acclico, conexo, dirigido e que cada n no tem
grau maior que 2. Assim sendo, s existe um caminho entre dois ns distintos.
E cada ramo da rvore um vrtice dirigido, sem peso, que parte do pai e vai o filho.

Insero
O algoritmo da insero em rvores binrias so facilmente implementadas atravs de funo recursiva.
Algoritmo da insero em C:

void inserir(struct No **pRaiz, int numero){


if(*pRaiz == NULL){
* pRaiz = (struct No *) malloc(sizeof(struct No));
(*pRaiz)pEsquerda = NULL;
(*pRaiz)pDireita = NULL;
(*pRaiz)numero = numero;
}else{
if(numero <(*pRaiz)numero)
inserir(&(*pRaiz)pEsquerda, numero));
else
inserir(&(*pRaiz)pDireita, numero));
}
}

Algoritmo da insero em Java:

public No Inserir(No novo, No anterior){


if (anterior != null){
if (novo.ObtemValor() < anterior.ObtemValor())
//Como o novo n tem valor menor do que o do n anterior,
desce para a esquerda do n anterior.
anterior.filho_Esq = this.Inserir(novo,
anterior.filho_Esq);
else {
if(novo.ObtemValor() > anterior.ObtemValor())
//Como o novo n tem valor maior do que o do n
anterior, desce para a direita do n anterior.
anterior.filho_Dir = this.Inserir(filho,
anterior.filho_Dir);
else
//Caso seja um n j existente, sai do mtodo.
return null;
}
} else {
//Insere o novo n como folha.
rvore binria 25

anterior = novo;
}
return anterior;
}

Algoritmo da insero em C#:

public class Node


{
public Node(int value)
{
Value = value;
}

public decimal Value { get; set; }


public Node Esq { get; set; }
public Node Dir { get; set; }
}

class Tree : BinarySearch


{
private Node root;

public Tree(int value)


{
root = new Node(value);
}

public void Add(int value)


{
Add(null, value);
}

protected virtual void Add(Node node, int value)


{
if (node == null)
node = root;

if (value < node.Value)


{
if (node.Esq == null)
node.Esq = new Node(value);
else
Add(node.Esq, value);
}
else
{
if (node.Dir == null)
rvore binria 26

node.Dir = new Node(value);


else
Add(node.Dir, value);
}
}
}

Percursos em rvore
Existem trs tipos de percursos: Percurso em ordem simtrica(em-ordem), pr-ordem e ps-ordem.

Ordem Simtrica
O algoritmo recursivo desse percurso em C :

void emOrdem(struct No *pNo) {


if(pNo != NULL) {
emOrdem(pNopEsquerda);
visita(pNo);
emOrdem(pNopDireita);
}
}

O algoritmo recursivo desse percurso em Java :

public void emOrdem(ArvoreNo no) {


if(no != null) {
emOrdem(no.getNoE());
System.out.print(no.getInfo()+" ");
emOrdem(no.getNoD());
}
}

Para a rvore acima, o percurso seria: 2, 7, 5, 6, 11, 2, 5, 4 e 9. Veja a linha de execuo:


emOrdem(2esq)
emOrdem(7esq)
emOrdem(2esq)
visita(2)
emOrdem(2dir)
visita(7)
emOrdem(7dir)
emOrdem(6esq)
emOrdem(5esq)
visita(5)
emOrdem(5dir)
visita(6)
emOrdem(6dir)
emOrdem(11esq)
visita(11)
rvore binria 27

emOrdem(11dir)
visita(2)
emOrdem(2dir)
emOrdem(5esq)
visita(5)
emOrdem(5dir)
emOrdem(9esq)
emOrdem(4esq)
visita(4)
emOrdem(4dir)
visita(9)
emOrdem(9dir)

Pr-Ordem
O algoritmo recursivo desse percurso em C :

void preOrdem(Struct No *pNo){


if(pNo != NULL){
visita(pNo);
preOrdem(pNopEsquerda);
preOrdem(pNopDireita);
}
}

O algoritmo recursivo desse percurso em Java :

public void preOrdem(ArvoreNo no) {


if(no != null){
System.out.print(no.getInfo()+" ");
preOrdem(no.getNoE());
preOrdem(no.getNoD());
}
}

Para a rvore acima, o percurso seria: 2, 7, 2, 6, 5, 11, 5, 9 e 4. Veja a linha de execuo:


visita(2)
preOrdem(2esq)
visita(7)
preOrdem(7esq)
visita(2)
preOrdem(2esq)
preOrdem(2dir)
preOrdem(7dir)
visita(6)
preOrdem(6esq)
visita(5)
preOrdem(5esq)
rvore binria 28

preOrdem(5dir)
preOrdem(6dir)
visita(11)
preOrdem(11esq)
preOrdem(11dir)
preOrdem(2dir)
visita(5)
preOrdem(5esq)
preOrdem(5dir)
visita(9)
preOrdem(9esq)
visita(4)
preOrdem(4esq)
preOrdem(4dir)
preOrdem(9dir)

Ps-Ordem
O algoritmo recursivo desse percurso em C :

void posOrdem(Struct No *pNo){


if(pNo != NULL){
posOrdem(pNopEsquerda);
posOrdem(pNopDireita);
visita(pNo);
}
}

O algoritmo recursivo desse percurso em Java :

public void posOrdem(ArvoreNo no) {


if(no != null){
posOrdem(no.getNoE());
posOrdem(no.getNoD());
System.out.print(no.getInfo()+" ");
}
}

Para a rvore acima, o percurso seria: 2, 5, 11, 6, 7, 4, 9, 5 e 2. Veja a linha de execuo:


posOrdem(2esq)
posOrdem(7esq)
posOrdem(2esq)
posOrdem(2dir)
visita(2)
posOrdem(7dir)
posOrdem(6esq)
posOrdem(5esq)
posOrdem(5dir)
rvore binria 29

visita(5)
posOrdem(6dir)
posOrdem(11esq)
posOrdem(11dir)
visita(11)
visita(6)
visita(7)
posOrdem(2dir)
posOrdem(5esq)
posOrdem(5dir)
posOrdem(9esq)
posOrdem(4esq)
posOrdem(4dir)
visita(4)
posOrdem(9dir)
visita(9)
visita(5)
visita(2)
Em Java

public int Contagem(No n){


if(n==null)
return 0;
else
return
1+Contagem(n.getFilhoEsquerda())+Contagem(n.getFilhoDireita);
}

Soma Elementos
public int SomaElementos(No raiz){
if (raiz != null){

soma=this.SomaElementos(raiz.p_Esq)+this.SomaElementos(raiz.p_Dir)+raiz.ObtemValor();
return soma;
}else
return 0;
}

Maior Elemento
public int MaiorElemento(No raiz){
if (raiz != null){
if (maior < raiz.ObtemValor())
maior = raiz.ObtemValor();
this.MaiorElemento(raiz.p_Esq);
this.MaiorElemento(raiz.p_Dir);
return maior;
rvore binria 30

}else
return 0;
}

Menor Elemento
public int MenorElemento(No raiz){
if (raiz != null){
if (menor > raiz.ObtemValor())
menor = raiz.ObtemValor();
this.MenorElemento(raiz.p_Esq);
this.MenorElemento(raiz.p_Dir);
return menor;
}else
return 0;
}

Transformao de uma rvore n-ria


Uma rvore n-ria qualquer (rvore cujos ns possuem graus menores ou iguais a n) podem ser representados por
uma rvore binria. Um exemplo dessa transformao pode ser vista em [2]

Mtodos para representao de rvores binrias


Uma das maneiras mais simples de representar rvores binrias em linguagens de programao por meio de
arranjos unidimensionais (vetores). Caso a raiz esteja na posio zero, dado um n de ndice i qualquer, os seus
filhos tero ndices e e o seu pai ter ndice piso((i - 1)/2). Caso a raiz esteja na posio um, os
filhos tero ndices e e o pai ter ndice piso(i/2). Essa implementao utilizada para representar
rvores completas ou quase completas. Heaps, que so rvores binrias quase completas so implementadas na
forma de um vetor de uma maneira bastante eficiente.
Apesar da simplicidade, essa representao requer uma grande quantidade de memria contgua para o
armazenamento de rvores grandes, o crescimento desta dficil de implementar e manter e pode haver grande
quantidade de desperdcio de memria.

Uma pequena rvore binria com raiz na posio


0, representada como um vetor.

Em uma linguagem que possua suporte a estruturas e referncias (por exemplo pascal e C), as rvores podem ser
implementadas a partir de ns, com um, ou mais, campos para a(s) informao(es) principal(is) e dois campos
apontadores especiais, denominados esquerda e direita, que fazem referncia s sub-rvores esquerda e direita,
respectivamente. Algumas vezes, h um apontador para o pai. Em um n do tipo folha, os campos apontadores
possuem valores especiais (nil em Pascal e "NULL" em C).
rvore binria 31

Referncias
[1] http:/ / wiki. answers. com/ Q/ What_is_the_difference_between_a_binary_tree_and_a_complete_binary_tree
[2] http:/ / en. wikipedia. org/ wiki/ Image:Nary_to_binary_tree_conversion. png

Algoritmo
Um algoritmo uma sequncia finita de instrues
bem definidas e no ambguas, cada uma das quais
pode ser executada mecanicamente num perodo de
tempo finito e com uma quantidade de esforo finita.[][]
O conceito de algoritmo frequentemente ilustrado
pelo exemplo de uma receita culinria, embora muitos
algoritmos sejam mais complexos. Eles podem repetir
passos (fazer iteraes) ou necessitar de decises (tais
como comparaes ou lgica) at que a tarefa seja
completada. Um algoritmo corretamente executado no
ir resolver um problema se estiver implementado
incorretamente ou se no for apropriado ao problema.
Uma animao do algoritmo de ordenao quicksort de uma matriz
Um algoritmo no representa, necessariamente, um de valores ao acaso. As barras vermelhas marcam o elemento piv.
[] No incio da animao, estando o elemento para o lado direito,
programa de computador , e sim os passos necessrios
escolhido como o piv.
para realizar uma tarefa. Sua implementao pode ser
feita por um computador, por outro tipo de autmato ou
mesmo por um ser humano. Diferentes algoritmos podem realizar a mesma tarefa usando um conjunto diferenciado
de instrues em mais ou menos tempo, espao ou esforo do que outros. Tal diferena 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 cala
enquanto outro algoritmo especifica que voc deve primeiro vestir a cala e depois as meias e os sapatos. Fica claro
que o primeiro algoritmo mais difcil de executar que o segundo apesar de ambos levarem ao mesmo resultado.

O conceito de um algoritmo foi formalizado em 1936 pela Mquina de Turing de Alan Turing e pelo clculo lambda
de Alonzo Church, que formaram as primeiras fundaes da Cincia da computao.

Etimologia
Os historiadores da palavra algoritmo encontraram a origem no sobrenome, Al-Khwarizmi, do matemtico persa do
sculo IX Mohamed ben Musa[], cujas obras foram traduzidas no ocidente cristo no sculo XII, tendo uma delas
recebido o nome Algorithmi de numero indorum, sobre os algoritmos usando o sistema de numerao decimal
(indiano). Outros autores, entretanto, defendem a origem da palavra em Al-goreten (raiz - conceito que se pode
aplicar aos clculos).[1] lgebra e algorismo tambm formam formas corrompidas da palavra, pois as pessoas
esqueciam as derivaes originais. O dicionrio Vollstndiges Mathematisches Lexicon (Leipzig, 1747) refere a
palavra "Algorithmus"; nesta designao est combinado as noes de quatro clculos aritmticos, nomeadamente a
adio, multiplicao, subtrao e diviso. A frase "algorithmus infinitesimalis" foi na altura utilizado para
significar; "maneiras de calcular com quantidades infinitsimas" (pequenas), uma inveno de Leibnitz. Tambm
conhecido no meio financeiro, como "algos".[2]
Algoritmo 32

Formalismo
Um programa de computador
essencialmente um algoritmo que diz
ao computador os passos especficos e
em que ordem eles devem ser
executados, como por exemplo, os
passos a serem tomados para calcular
as notas que sero impressas nos
boletins dos alunos de uma escola.
Logo, o algoritmo pode ser
considerado uma sequncia de
operaes que podem ser simuladas
por uma mquina de Turing completa.

Quando os procedimentos de um
algoritmo envolvem o processamento
de dados, a informao lida de uma
fonte de entrada, processada e
retornada sob novo valor aps
processamento, o que geralmente
realizado com o auxlio de uma ou
mais estrutura de dados.

Para qualquer processo computacional,


o algoritmo precisa estar
Fluxograma, um exemplo de algoritmo imperativo. O estado em vermelho indica a
rigorosamente definido, especificando entrada do algoritmo enquanto os estados em verde indicam as possveis sadas.
a maneira que ele se comportar em
todas as circunstncias. A corretividade do algoritmo pode ser provada matematicamente, bem como a quantidade
assinttica de tempo e espao (complexidade) necessrios para a sua execuo. Estes aspectos dos algoritmos so
alvo da anlise de algoritmos.

A maneira mais simples de se pensar um algoritmo por uma lista de procedimentos bem definida, na qual as
instrues so executadas passo a passo a partir do comeo da lista, uma idia que pode ser facilmente visualizada
atravs de um fluxograma. Tal formalizao adota as premissas da programao imperativa, que uma forma
mecnica para visualizar e desenvolver um algoritmo. Concepes alternativas para algoritmos variam em
programao funcional e programao lgica.

Trmino do algoritmo
Alguns autores restringem a definio de algoritmo para procedimentos que eventualmente terminam. Marvin
Minsky constatou que se o tamanho de um procedimento no conhecido de antemo, tentar descobri-lo um
problema indecidvel, j que o procedimento pode ser executado infinitamente, de forma que nunca se ter a
resposta. Alan Turing provou em 1936 que no existe mquina de Turing para realizar tal anlise para todos os
casos, logo no h algoritmo para realizar tal tarefa para todos os casos. Tal condio conhecida atualmente como
problema da parada.
Para algoritmos interminveis o sucesso no pode ser determinado pela interpretao da resposta e sim por condies
impostas pelo prprio desenvolvedor do algoritmo durante sua execuo.
Algoritmo 33

Implementao
A maioria dos algoritmos desenvolvida para ser implementada em um programa de computador. Apesar disso eles
tambm podem ser implementados por outros modos tais como uma rede neural biolgica (tal como no crebro
quando efetuamos operaes aritmticas) em circuitos eltricos ou at mesmo em dispositivos mecnicos.
Para programas de computador existe uma grande variedade de linguagens de programao, cada uma com
caractersticas especficas que podem facilitar a implementao de determinados algoritmos ou atender a propsitos
mais gerais.

Anlise de algoritmos
A anlise de algoritmos um ramo da cincia da computao que estuda as tcnicas de projeto de algoritmos e os
algoritmos de forma abstrata, sem estarem implementados em uma linguagem de programao em particular ou
implementadas de algum outro modo. Ela preocupa-se com os recursos necessrios para a execuo do algoritmo tais
como o tempo de execuo e o espao de armazenamento de dados. Deve-se perceber que para um dado algoritmo
pode-se ter diferentes quantidades de recursos alocados de acordo com os parmetros passados na entrada. Por
exemplo, se definirmos que o fatorial de um nmero natural igual ao fatorial de seu antecessor multiplicado pelo
prprio nmero, fica claro que a execuo de fatorial(10) consome mais tempo que a execuo de
fatorial(5).
Um meio de exibir um algoritmo a fim de analis-lo atravs da implementao por pseudocdigo em portugus
estruturado. O exemplo a seguir um algoritmo em portugus estruturado que retorna (valor de sada) a soma de
dois valores (tambm conhecidos como parmetros ou argumentos, valores de entrada) que so introduzidos na
chamada da funo:
Algoritmo "SomaDeDoisValores"; varivel: SOMA,A,B: inteiro; inicio
Escreva("Digite um numero"); Leia(A); escreva("digite outro numero"); leia(B);
SOMA A + B; escreva(SOMA); fim.

Classificao

Classificao por implementao


Pode-se classificar algoritmos pela maneira pelo qual foram implementados.
Recursivo ou iterativo - um algoritmo recursivo possui a caracterstica de invocar a si mesmo repetidamente at
que certa condio seja satisfeita e ele terminado, que um mtodo comum em programao funcional.
Algoritmos iterativos usam estruturas de repetio tais como laos, 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 construo.
Lgico - um algoritmo pode ser visto como uma deduo lgica controlada. O componente lgico expressa os
axiomas usados na computao e o componente de controle determina a maneira como a deduo aplicada aos
axiomas. Tal conceito base para a programao lgica.
Serial ou paralelo - algoritmos so geralmente assumidos por serem executados instruo a instruo
individualmente, como uma lista de execuo, o que constitui um algoritmo serial. Tal conceito base para a
programao 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 instruo ao mesmo
tempo. Tais algoritmos dividem os problemas em subproblemas e o delegam a quantos processadores estiverem
disponveis, agrupando no final o resultado dos subproblemas em um resultado final ao algoritmo. Tal conceito
base para a programao paralela. De forma geral, algoritmos iterativos so paralelizveis; por outro lado existem
algoritmos que no so paralelizveis, chamados ento problemas inerentemente seriais.
Algoritmo 34

Determinstico ou no-determinstico - algoritmos determinsticos resolvem o problema com uma deciso exata
a cada passo enquanto algoritmos no-determinsticos resolvem o problema ao deduzir os melhores passos atravs
de estimativas sob forma de heursticas.
Exato ou aproximado - enquanto alguns algoritmos encontram uma resposta exata, algoritmos de aproximao
procuram uma resposta prxima a verdadeira soluo, seja atravs de estratgia determinstica ou aleatria.
Possuem aplicaes prticas sobretudo para problemas muito complexos, do qual uma resposta correta invivel
devido sua complexidade computacional.

Classificao por paradigma


Pode-se classificar algoritmos pela metodologia ou paradigma de seu desenvolvimento, tais como:
Diviso e conquista - algoritmos de diviso 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
prtico o algoritmo de ordenao merge sort. Uma variante dessa metodologia o decremento e conquista, que
resolve um sub-problema e utiliza a soluo para resolver um problema maior. Um exemplo prtico o algoritmo
para pesquisa binria.
Programao dinmica - pode-se utilizar a programao dinmica para evitar o re-clculo de soluo j
resolvidas anteriormente.
Algoritmo ganancioso - um algoritmo ganancioso similar programao dinmica, mas difere na medida em
que as solues dos sub-problemas no precisam ser conhecidas a cada passo, uma escolha gananciosa pode ser
feita a cada momento com o que at ento parece ser mais adequado.
Programao linear
Reduo - a reduo resolve o problema ao transform-lo em outro problema. chamado tambm transformao
e conquista.
Busca e enumerao - vrios problemas podem ser modelados atravs de grafos. Um algoritmo de explorao de
grafo pode ser usado para caminhar pela estrutura e retornam informaes teis para a resoluo do problema.
Esta categoria inclui algoritmos de busca e backtracking.
Paradigma heurstico e probabilstico - algoritmos probabilsticos realizam escolhas aleatoriamente.
Algoritmos genticos tentam encontrar a soluo atravs de ciclos de mutaes evolucionrias entre geraes de
passos, tendendo para a soluo exata do problema. Algoritmos heursticos encontram uma soluo aproximada
para o problema.

Classificao por campo de estudo


Cada campo da cincia possui seus prprios problemas e respectivos algoritmos adequados para resolv-los.
Exemplos clssicos so algoritmos de busca, de ordenao, de anlise numrica, de teoria de grafos, de manipulao
de cadeias de texto, de geometria computacional, de anlise combinatria, de aprendizagem de mquina, de
criptografia, de compresso de dados e de interpretao de texto.

Classificao por complexidade


Alguns algoritmos so executados em tempo linear, de acordo com a entrada, enquanto outros so executados em
tempo exponencial ou at mesmo nunca terminam de serem executados. Alguns problemas tem mltiplos algoritmos
enquanto outros no possuem algoritmos para resoluo.
[1] TAVARES, P. de Campos; Algoritmo, in "Enciclopdia Verbo Luso-Brasileira da Cultura, Edio Sculo XXI", Volume II, Editorial Verbo,
Braga, Janeiro de 1998 ISBN 972-22-1864-6.
[2] algoritmos e mercados (http:/ / expresso. sapo. pt/ algoritmos-assaltam-mercados-de-icommoditiesi-depois-das-bolsas=f714175) Acedido em
20 de julho 2012
Algoritmo 35

Bibliografia
Algoritmos e Programao - Teoria e Prtica: para universitrios e profissionais de informtica (http://www.
novateceditora.com.br/livros/algoritmos/): Novatec Editora. ISBN 85-7522-073-X
Donald E. Knuth (1973) The Art of Computer Programming, Volume 1: Fundamental Algorithms (2 edio).
Addison-Wesley, ISBN 0-201-03809-9 (em ingls)

Ligaes externas
O que algoritmo? (http://revistaescola.abril.com.br/matematica/pratica-pedagogica/algoritmo-611956.
shtml) (em portugus) - Revista Nova Escola
Dictionary of Algorithms and Data Structures (http://www.nist.gov/dads/)
Aprenda a Programar (http://algoritmizando.com/desenvolvimento/aprender-algoritmos/): Srie de artigos
didticos ensinando Portugus Estruturado
Exerccios resolvidos de algoritmos para estudo (http://algoritmizando.com/desenvolvimento/
40-exercicios-de-algoritmos-resolvidos-para-estudo/)

Crivo de Eratstenes
O Crivo de Eratstenes um algoritmo e um mtodo simples e prtico para encontrar nmeros primos at um certo
valor limite. Segundo a tradio, foi criado pelo matemtico grego Eratstenes (c. 285-194 a.C.), o terceiro
bibliotecrio-chefe da Biblioteca de Alexandria.

Explicao do Algoritmo
Para exemplific-lo, vamos determinar a lista de nmeros entre 1 e 30.
Inicialmente, determina-se o maior nmero a ser checado. Ele corresponde raiz quadrada do valor limite,
arredondado para baixo. No caso, a raiz de 30, arredondada para baixo, 5.
Crie uma lista de todos os nmeros inteiros de 2 at o valor limite: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, e 30.
Encontre o primeiro nmero da lista. Ele um nmero primo, 2.
Remova da lista todos os mltiplos do nmero primo encontrado. No nosso exemplo, a lista fica: 2, 3, 5, 7, 9, 11,
13, 15, 17, 19, 21, 23, 25, 27 e 29.
O prximo nmero da lista primo. Repita o procedimento. No caso, o prximo nmero da lista 3. Removendo
seus mltiplos, a lista fica: 2, 3, 5, 7, 11, 13, 17, 19, 23, 25 e 29. O prximo nmero, 5, tambm primo; a lista
fica: 2, 3, 5, 7, 11, 13, 17, 19, 23 e 29. 5 o ltimo nmero a ser verificado, conforme determinado inicialmente.
Assim, a lista encontrada contm somente nmeros primos.
Crivo de Eratstenes 36

Visualizao do Crivo

Utilizao em linguagens de programao


A simplicidade do cdigo faz com que este seja usado como benchmark para comparar compiladores e chips.[1] Uma
das verses mais populares deste benchmark foi publicado na Revista Byte, no incio dos anos 1980.[2][3]

Referncias
[1] Sieve of Eratosthenes - Benchmarks (http:/ / www. keil. com/ benchmarks/ sieve. asp), site www.keil.com
[2] The Sieve (http:/ / home. hccnet. nl/ a. w. m. van. der. horst/ numbertheory. html), Factoring and Primes, site home.hccnet.nl
[3] Cdigo fonte do programa sieve.c (http:/ / www. cs. nthu. edu. tw/ ~tingting/ Archi_07/ benchmark/ sieve. c), site www.cs.nthu.edu.tw
Algoritmo de Dijkstra 37

Algoritmo de Dijkstra

Algoritmo de Dijkstra

classe Algoritmo de busca

estrutura de dados Grafo

complexidade pior
caso
Algoritmos

O algoritmo de Dijkstra, concebido pelo cientista da computao holands Edsger Dijkstra em 1956 e publicado
em 1959[][1], soluciona o problema do caminho mais curto num grafo dirigido ou no dirigido com arestas de peso
no negativo, em tempo computacional O([m+n]log n) onde m o nmero de arestas e n o nmero de vrtices. O
algoritmo que serve para resolver o mesmo problema em um grafo com pesos negativos o algoritmo de
Bellman-Ford, que possui maior tempo de execuo que o Dijkstra.
O algoritmo de Dijkstra assemelha-se ao BFS, mas um algoritmo guloso, ou seja, toma a deciso que parece
tima no momento. Para a teoria dos grafos uma "estratgia gulosa" conveniente j que sendo P um menor
caminho entre 2 vrtices U e V, todo sub-caminho de P um menor caminho entre 2 vrtices pertencentes ao
caminho P, desta forma construmos os melhores caminhos dos vrtices alcanveis pelo vrtice inicial
determinando todos os melhores caminhos intermedirios. Nota: diz-se 'um menor caminho' pois caso existam 2
'menores caminhos' apenas um ser descoberto.
O algoritmo considera um conjunto S de menores caminhos, iniciado com um vrtice inicial I. A cada passo do
algoritmo busca-se nas adjacncias dos vrtices pertencentes a S aquele vrtice com menor distncia relativa a I e
adiciona-o a S e, ento, repetindo os passos at que todos os vrtices alcanveis por I estejam em S. Arestas que
ligam vrtices j pertencentes a S so desconsideradas.
Um exemplo prtico do problema que pode ser resolvido pelo algoritmo de Dijkstra : algum precisa se deslocar de
uma cidade para outra. Para isso, ela dispe de vrias estradas, que passam por diversas cidades. Qual delas oferece
uma trajetria de menor caminho?

Algoritmo de Dijkstra
1 passo: iniciam-se os valores:

para todo v V[G]


d[v]
[v] nulo
d[s] 0

V[G] o conjunto de vrtices(v) que formam o Grafo G. d[v] o vetor de distncias de s at cada v. Admitindo-se a
pior estimativa possvel, o caminho infinito. [v] identifica o vrtice de onde se origina uma conexo at v de
Algoritmo de Dijkstra 38

maneira a formar um caminho mnimo.


2 passo: temos que usar o conjunto Q, cujos vrtices ainda no contm o custo do menor caminho d[v]
determinado.

Q V[G]

3 passo: realizamos uma srie de relaxamentos das arestas, de acordo com o cdigo:

enquanto Q
u extrair-mn(Q) //Q Q - {u}
para cada v adjacente a u
se d[v] > d[u] + w(u, v) //relaxe (u, v)
ento d[v] d[u] + w(u, v)
[v] u
Q Q {v}

w(u, v) o peso(weight) da aresta que vai de u a v.


u e v so vrtices quaisquer e s o vrtice inicial.
extrair-mn(Q), pode usar um heap de mnimo ou uma lista de vrtices onde se extrai o elemento u com menor valor
d[u].
No final do algoritmo teremos o menor caminho entre s e qualquer outro vrtice de G. O algoritmo leva tempo O(m
+ n log n) caso seja usado um heap de Fibonacci, O(m log n) caso seja usado um heap binrio e O(n) caso seja
usado um vetor para armazenar Q.

Implementao em C/C++
Implementao em C utilizando uma matriz de adjacncias. Dependendo da quantidade limite de vrtices (MAXV)
pode se tornar ineficiente quanto ao uso de memria, sendo recomendado usar uma lista de adjacncias.
#include <string.h> //memset

// MAXV uma constante que define a quantidade mxima de vrtices

#define MAXV 100

// Matriz de adjacncias

// Se MAdj[i][j] > 0, ento h aresta que liga 'i' a 'j' com custo MAdj[i][j].

int MAdj[MAXV][MAXV];

// Armazena a distncia mnima partindo de um vrtice 'i' at todos os outros vrtices

// dis[j] representa a menor distncia de 'i' a 'j'.

int dis[MAXV];

// Calcula as distncias de 'Vi' a todos os outros vrtices de um grafo com 'V' vrtices e armazena-as em dis[]

void dijkstra (int Vi, int V)

// vis[i] informa se o vrtice 'i' j foi visitado/analisado ou no (inicialmente nenhum vrtice foi)

char vis[MAXV];

memset (vis, 0, sizeof (vis));

// Inicialmente afirmamos que a menor distncia encontrada entre Vi e qualquer outro vrtice (exceto o prprio Vi) infinita
Algoritmo de Dijkstra 39

memset (dis, 0x7f, sizeof (dis));

dis[Vi] = 0;

while (1)

int i, n = -1;

for (i = 0; i < V; i++)

if (! vis[i] && (n < 0 || dis[i] < dis[n]))

n = i;

if (n < 0)

break;

vis[n] = 1;

for (i = 0; i < V; i++)

if (MAdj[n][i] && dis[i] > dis[n] + MAdj[n][i])

dis[i] = dis[n] + MAdj[n][i];

Implementao em C++ utilizando uma lista de adjacncias.


#include <string.h> //memset

#include <vector>

using namespace std;

// MAXV uma constante que define a quantidade mxima de vrtices

#define MAXV 100

// Lista de adjacncias

// Para inserir uma aresta - partindo do vrtice 'i' ao vrtice 'j', com custo 'c' - na lista, podemos usar:

// LAdj[i].push_back (make_pair (j, c));

vector < pair <int, int> > LAdj[MAXV];

// Armazena a distncia mnima partindo de um vrtice 'i' at todos os outros vrtices

// dis[j] representa a menor distncia de 'i' a 'j'.

int dis[MAXV];

// Calcula as distncias de 'Vi' a todos os outros vrtices de um grafo com 'V' vrtices e armazena-as em dis[]

void dijkstra (int Vi, int V)

// vis[i] informa se o vrtice 'i' j foi visitado/analisado ou no (inicialmente nenhum vrtice foi)

char vis[MAXV];

memset (vis, 0, sizeof (vis));

// Inicialmente afirmamos que a menor distncia encontrada entre Vi e qualquer outro vrtice (exceto o prprio Vi) infinita
Algoritmo de Dijkstra 40

memset (dis, 0x7f, sizeof (dis));

dis[Vi] = 0;

while (1)

int i, n = -1;

for (i = 0; i < V; i++)

if (! vis[i] && (n < 0 || dis[i] < dis[n]))

n = i;

if (n < 0)

break;

vis[n] = 1;

for (i = 0; i < LAdj[n].size (); i++)

// Aresta n -> LAdj[n][i].first com custo LAdj[n][i].second

if (dis[LAdj[n][i].first] > dis[n] + LAdj[n][i].second)

dis[LAdj[n][i].first] = dis[n] + LAdj[n][i].second;

A implementao do algortmo utilizando uma lista de adjacncias ligeiramente mais rpida que a implementao
com uma matriz de adjacncias para casos em que o nmero de arestas no se aproxima do pior caso (uma aresta
ligando cada par de vrtices); quando prximo ao pior caso, o desempenho similar. Ambos possuem complexidade
de tempo em torno de O(V).
possvel obter uma soluo em O(E + V log V) (custo amortizado), onde E o nmero de arestas, utilizando um
heap de fibonacci ou O(E log V) usando priority queue da STL de C++ para extrair o vrtice no-visitado com
menor distncia. O heap simples, embora levemente mais lento que o heap de fibonacci, tambm pode ser usado para
obter uma complexidade similar.

Ligaes externas
Artigo explicativo sobre o algoritmo [2]
Artigo e Implementao do Algoritmo de Dijkstra em C [3]
(em espanhol) Algoritmo de Dijkstra em C [4]
(em ingls) Algoritmo de Dijkstra em C# [5]
(em ingls) [6] - NIST
(em ingls) Applet do algoritmo de Dijkstra [7]
[2] http:/ / www. inf. ufsc. br/ grafos/ temas/ custo-minimo/ dijkstra. html
[3] http:/ / www. vivaolinux. com. br/ script/ Algoritmo-de-Dijkstra
[4] http:/ / www. mis-algoritmos. com/ source-154. html
[5] http:/ / www. codeproject. com/ useritems/ Shortest_Path_Problem. asp
[6] http:/ / www. nist. gov/ dads/ HTML/ dijkstraalgo. html
[7] http:/ / www-b2. is. tokushima-u. ac. jp/ ~ikeda/ suuri/ dijkstra/ Dijkstra. shtml
Algoritmo guloso 41

Algoritmo guloso
Algoritmo guloso, ou ganancioso, uma tcnica de algoritmos para resolver problemas de otimizao, sempre
realizando a escolha que parece ser a melhor no momento; fazendo uma escolha tima local, na esperana de que
esta escolha leve at a soluo tima global.
Vantagens: Algoritmos simples e de fcil implementao.
Desvantagens: Nem sempre conduz solues timas globais. Podem efetuar clculos repetitivos.

Este artigo sobre matemtica mnimo. Voc pode ajudar a Wikipdia expandindo-o [1].

Referncias
[1] http:/ / pt. wikipedia. org/ w/ index. php?title=Algoritmo_guloso& action=edit

Busca em profundidade
Busca em profundidade (ou busca em
profundidade-primeiro, tambm usada a
sigla em ingls DFS) um algoritmo usado
para realizar uma busca ou travessia numa
rvore, estrutura de rvore ou grafo.
Intuitivamente, o algoritmo comea num n
raiz (selecionando algum n como sendo o
raiz, no caso de um grafo) e explora tanto
quanto possvel cada um dos seus ramos,
antes de retroceder(backtracking).

Ordem dos vrtices explorados na busca em profundidade


Busca em profundidade 42

Definio Formal
Formalmente, um algoritmo de busca em profundidade realiza
uma busca no-informada que progride atravs da expanso do
primeiro n filho da rvore de busca, e se aprofunda cada vez
mais, at que o alvo da busca seja encontrado ou at que ele se
depare com um n que no possui filhos (n folha). Ento a busca
retrocede (backtrack) e comea no prximo n. Numa
implementao no-recursiva, todos os ns expandidos
recentemente so adicionados a uma pilha, para realizar a
explorao.

A complexidade espacial de um algoritmo de busca em


profundidade muito menor que a de um algoritmo de busca em
largura. A complexidade temporal de ambos algoritmos so
proporcionais ao nmero de vrtices somados ao nmero de Representao visual de uma busca em profundidade

arestas dos grafos aos quais eles atravessam.


Quando ocorrem buscas em grafos muito grandes, que no podem ser armazenadas completamente na memria, a
busca em profundidade no termina, em casos onde o comprimento de um caminho numa rvore de busca infinito.
O simples artifcio de lembrar quais ns j foram visitados no funciona, porque pode no haver memria
suficiente. Isso pode ser resolvido estabelecendo-se um limite de aumento na profundidade da rvore.

Exemplo
Para o grafo ao lado, uma busca em profundidade comeando em
A, assumindo-se que as arestas esquerdas do grafo apresentado
sejam escolhidas antes das arestas direitas, e assumindo que a
busca relembre os ns previamente visitados e que no os repita
(desde que este seja um grafo pequeno), visitaremos os ns na
seguinte ordem : A, B, D, F, E, C, G.
Modificando essa mesma busca, sem que nos recordemos dos ns
previamente visitados, teramos como resultado a seguinte ordem
de visita dos ns: A, B, D, F, E, A, B, D, F, E, etc, eternamente, j
que a busca ficaria presa no ciclo A,B,D,F,E e nunca alcanaria G
ou C. Exemplo Busca em profundidade
grfico transversal
O aprofundamento iterativo previne esse looping, alcanando os
seguintes ns, nas seguintes profundidades, assumindo-se que ele
prossiga da esquerda para a direita, como mostrado abaixo:
0: A
1: A (repetido), B, C, E
(Perceba que o aprofundamento iterativo agora enxergou C, ao passo que uma busca em profundidade convencional
no enxergaria.)
2: A, B, D, F, C, G, E, F
(Perceba que a busca ainda enxerga C, mas que ele vem depois. Perceba tambm que ele enxerga E via diferentes
caminhos, e passa duas vezes pelo F .)
3: A, B, D, F, E, C, G, E, F, B
Busca em profundidade 43

Para esse grafo, quanto maior for a profundidade aplicada, os dois ciclos ABFE e AEFB simplesmente ficaro
maiores, antes que o algoritmo desista e tente outro ramo.

Aplicaes
Achar componentes conectados
Achar componentes fortemente conectados
Ordenao topolgica
Resoluo de quebra-cabeas como labirinto

Pseudocdigo
function Busca_Profundidade(Inicio, Alvo)
empilha(Pilha,Inicio)
while Pilha is not empty
var Nodo := desempilha(Pilha)
Colore(Nodo, Cinza)
if Nodo = Alvo
return Nodo
for Filho in Expande(Nodo)
if Filho.cor = Branco
empilha(Pilha, Filho)
Colore(Nodo, Preto)

Pesquisa binria

Pesquisa binria
classe Algoritmo de busca

estrutura de dados Array, Listas ligadas

complexidade caso mdio


complexidade melhor caso
complexidade de espaos pior
caso
otimo Sim

espao
Algoritmos

A pesquisa ou busca binria (em ingls binary search algorithm ou binary chop) um algoritmo de busca em
vetores que segue o paradigma de diviso e conquista. Ela parte do pressuposto de que o vetor est ordenado e
realiza sucessivas divises do espao de busca comparando o elemento buscado (chave) com o elemento no meio do
vetor. Se o elemento do meio do vetor for a chave, a busca termina com sucesso. Caso contrrio, se o elemento do
meio vier antes do elemento buscado, ento a busca continua na metade posterior do vetor. E finalmente, se o
elemento do meio vier depois da chave, a busca continua na metade anterior do vetor.
Pesquisa binria 44

Anlise de Complexidade
A complexidade desse algoritmo da ordem de (log2 n), em que n o tamanho do vetor de busca. Apresenta-se
mais eficiente que a Busca linear cuja ordem O(n).

Pseudo-Cdigo
Um pseudo-cdigo recursivo para esse algoritmo, dados V o vetor com elementos comparveis, n seu tamanho e e
o elemento que se deseja encontrar:

BUSCA-BINRIA (V[], incio, fim, e)


i recebe o ndice do meio entre incio e fim
se (v[i] = e) entao
devolva o ndice i # elemento e encontrado
fimse
se (inicio = fim) entao
no encontrou o elemento procurado
seno
se (V[i] vem antes de e) ento
faa a BUSCA-BINRIA(V, i+1, fim, e)
seno
faa a BUSCA-BINRIA(V, inicio, i-1, e)
fimse
fimse

Implementaes

Cdigo em Ruby
def search(vector, lower, upper, element)
return -1 if lower > upper
mid = (lower+upper)/2
if (vector[mid] == element)
element
elsif (element < vector[mid])
search(vector, lower, mid-1, element)
else
search(vector, mid+1, upper, element)
end
end

def binary_search(vector,element)
search(vector, 0, vector.size-1, element)
end
Pesquisa binria 45

Cdigo em C
//em C para se passar um vetor como parmetro para uma funo, tem que
se passar o ponteiro do vetor
int PesquisaBinaria ( int *array, int chave , int N)
{
int inf = 0; //Limite inferior (o primeiro elemento do vetor
em C zero )
int sup = N-1; //Limite superior (termina em um nmero a menos
0 9 so 10 numeros )
int meio;
while (inf <= sup)
{
meio = inf + (sup-inf)/2;
if (chave == array[meio])
return meio;
else if (chave < array[meio])
sup = meio-1;
else
inf = meio+1;
}
return -1; // no encontrado
}

Obs: A linguagem C fornece a funo bsearch[1] na sua biblioteca padro.

Java
public static int buscaBinaria( int[] array, int valor )
{
int esq = 0;
int dir = array.length - 1;
int valorMeio;

while ( esq <= dir ) {


valorMeio = esq + ((dir - esq) / 2);
if ( array[valorMeio] < valor ) {
esq = valorMeio + 1;
} else if( array[valorMeio] > valor ) {
dir = valorMeio - 1;
} else {
return valorMeio;
}
}
return -1;
}
Pesquisa binria 46

Cdigo em python
def binsearch(seq, search):
right = len(seq)
left = 0
previous_center = -1
if search < seq[0]:
return -1
while 1:
center = (left + right) / 2
candidate = seq[center]
if search == candidate:
return center
if center == previous_center:
return - 2 - center
elif search < candidate:
right = center
else:
left = center
previous_center = center

Cdigo em C#
static int pesquisaBinaria(int[] vetor, int chave)
{
//Ordena o vetor.
Array.Sort(vetor);

int meio;
int Min = 0;
int Max = vetor.Length - 1;

do
{
meio = (int)(Min + Max) / 2;
if (vetor[meio] == chave)
{
//Retorna a posio do nmero na seqencia.
return meio;
}
else if (chave > vetor[meio])
Min = meio + 1;
else
Max = meio - 1;
}
while (Min <= Max);

//Caso o retorno for -1, ento o nmero no existe na seqencia.


return -1;
Pesquisa binria 47

Cdigo em Pascal
function BuscaBinaria (Vetor: array of string; Chave: string; Dim:
integer): integer;
var inicio, fim: integer; {Auxiliares que representam o
inicio e o fim do vetor analisado}
meio: integer; {Meio do vetor}
begin
fim := Dim; {O valor do ltimo ndice do vetor}
inicio := 1; {O valor do primeiro ndice do vetor}
BuscaBinaria := -1; {Retorna o valor -1 se a chave nao for
encontrada.}
repeat
meio := (inicio+fim) div 2;
if (Chave = vetor[meio]) then
begin
BuscaBinaria := meio;
inicio:=fim+1; {Interrompo o repeat quando a
chave for encontrada sem ter que testar l no until. Bonito no?!}
end;
if (Chave < vetor[meio]) then
fim:=(meio-1);
if (Chave > vetor[meio]) then
inicio:=(meio+1);
until (inicio > fim);
end;

Cdigo Recursivo em Pascal


function BuscaBinariaRecursiva(var Vetor: array of string; L,H:
integer; chave: string): integer;
var m:integer; {variavel auxiliar que indica o meio do vetor}
begin
ordena(Vetor,H); {Procedimento que ordena o vetor, tais como:
bubble sort, quick sort, entre outros}
if L>H then {L= variavel que indica o comeo do vetor, H=
variavel que indica o fim do vetor}
BuscaBinariaRecursiva:=-1
else
begin
m:=(L+H) div 2;
if x<Vetor[M] then
BuscaBinariaRecursiva:=BuscaBinariaRecursiva(Vetor,L,M-1,x)
else
if x>Vetor[M] then
BuscaBinariaRecursiva:=BuscaBinariaRecursiva(Vetor,M+1,H,x)
else
Pesquisa binria 48

BuscaBinariaRecursiva:=M;
end;
end;

Cdigo em Lua
function buscaBinaria(v, x)
ini = 1
fim = #v
while(ini<=fim)
do
pivo= math.floor((fim+ini)/2)
if(x > v[pivo])
then
ini = pivo+1
end

if(x < v[pivo])


then
fim = pivo-1
end

if (x==v[pivo])
then
return pivo
end
end
return -1
end

Cdigo em Scheme
(define vetor (vector 1 2 4 6 8 9 10 23 45 ))
(define (buscab vetor numero inicio fim)
(letrec ([ndivi (floor (/ (+ fim inicio) 2))] [n-medio
(vector-ref vetor ndivi)])
(cond
[(> inicio fim) false]
[(= numero n-medio) ndivi]
[(< numero n-medio) (buscab vetor numero inicio (- ndivi 1))]
[else (> numero n-medio) (buscab vetor numero (+ ndivi 1)
fim)])))
(buscab vetor 23 0 9)
Pesquisa binria 49

Cdigo em PHP
function buscaBinaria($valorPesquisa, array $vetor) {

$n_elementos = count($vetor);
$inicio = 0; $fim = $n_elementos -1; $meio = (int) (($fim -
$inicio) / 2) + $inicio;

while ($inicio <= $fim) {


if ($vetor[$meio] < $valorPesquisa) {
$inicio = $meio + 1;
} elseif ($vetor[$meio] > $valorPesquisa) {
$fim = $meio - 1;
} else {
return $meio;
}

$meio = (int) (($fim - $inicio) / 2) + $inicio;

return -1;
}

$a = array(1, 2, 3, 4, 5, 6);

print "call buscaBinaria(4, [1, 2, 3, 4, 5, 6]); return: ";


var_dump(buscaBinaria(4, $a));
print "call buscaBinaria(6, [1, 2, 3, 4, 5, 6]); return: ";
var_dump(buscaBinaria(6, $a));
print "call buscaBinaria(1, [1, 2, 3, 4, 5, 6]); return: ";
var_dump(buscaBinaria(1, $a));
print "call buscaBinaria(8, [1, 2, 3, 4, 5, 6]); return: ";
var_dump(buscaBinaria(8, $a));

[1] bsearch(3) - binary search of a sorted array (http:/ / linux. die. net/ man/ 3/ bsearch)

Ligaes externas
Tecnologia da Informao - Goinia - GO (http://www.go.senac.br/faculdade)
Projeto de Algoritmos - Paulo Feofiloff -IME-USP (http://www.ime.usp.br/~pf/algoritmos/aulas/bubi2.
html)
NIST Dicionrio de Algoritmos e Estrutura de Dados :binary search (http://www.nist.gov/dads/HTML/
binarySearch.html)
Tim Bray. On the Goodness of Binary Search (http://www.tbray.org/ongoing/When/200x/2003/03/22/
Binary). Pequeno ensaio das vantagens da busca binria e exemplo de cdigo em Java.
Explanao e cdigo da busca binria em C++ (http://www.datastructures.info/
what-is-a-binary-seach-algorithm-and-how-does-it-work/)
Pesquisa binria 50

Google Research: Nearly All Binary Searches and Mergesorts are Broken (http://googleresearch.blogspot.com/
2006/06/extra-extra-read-all-about-it-nearly.html)

rvore AVL
rvore AVL (ou rvore balanceada pela altura), em
Cincia da Computao, uma rvore de busca binria
auto-balanceada. Em tal rvore, as alturas das duas
sub-rvores a partir de cada n difere no mximo em
uma unidade. As operaes de busca, insero e
remoo de elementos possuem complexidade O( log2
n ) (no qual o nmero de elementos da rvore).
Inseres e remoes podem tambm requerer o
rebalanceamento da rvore, exigindo uma ou mais
rotaes.

O nome AVL vem de seus criadores Adelson Velsky e


Landis, e sua primeira referncia encontra-se no
documento "Algoritmos para organizao da
informao" de 1962.

Uma rvore no-AVL


Caractersticas

Balanceamento
Uma rvore AVL dita balanceada quando, para cada
n da rvore, a diferena entre as alturas das suas
sub-rvores (direita e esquerda) no maior do que um.
Caso a rvore no esteja balanceada necessrio seu
balanceamento atravs da rotao simples ou rotao
dupla. O balanceamento requerido para as operaes
Mesma rvore aps balanceamento por altura, agora uma rvore
de insero e remoo de elementos. Para definir o
AVL
balanceamento utilizado um fator especfico para ns.
O fator de balanceamento de um n dado pelo seu peso em relao a sua sub-rvore. Um n com fator balanceado
pode conter 1, 0, ou -1 em seu fator. Um n com fator de balanceamento diferente dos citados considerado uma
rvore no-AVL e requer um balanceamento por rotao ou dupla-rotao.
rvore AVL 51

Operaes

Insero
Insero em uma rvore AVL deve ser dada pela insero do nodo seguida de uma verificao na propriedade do
fator de balanceamento. Caso no obedea a essa propriedade, deve-se fazer uma rotao conveniente.

Remoo
A remoo deve ser dada por uma rotao em torno do n a ser removido, a fim de torn-lo folha para que ento
possa ser removido. Em alguns casos, aps a remoo so necessrias rotaes para ajustar o fator de balanceamento.

Pesquisa
O nmero de comparaes para localizar um elemento em AVL aproximadamente 1.44 log2 n no pior caso.

Rotao
A operao bsica em uma rvore AVL geralmente envolve os mesmos algoritmos de uma rvore de busca binria
desbalanceada. A rotao na rvore AVL ocorre devido ao seu desbalanceamento, uma rotao simples ocorre
quando um n est desbalanceado e seu filho estiver no mesmo sentido da inclinao, formando uma linha reta. Uma
rotao-dupla ocorre quando um n estiver desbalanceado e seu filho estiver inclinado no sentido inverso ao pai,
formando um "joelho".

Rotao esquerda
Em uma rvore binria, basta empurrar o nodo N para baixo e para a esquerda. O filho direita de N o substitui, e o
filho esquerda do filho direita vem a ser o novo filho direita de N. Segue pseudocdigo:
Seja Y o filho direita de X Torne o filho esquerda de Y o filho direita
de X. Torne X filho esquerda de Y

Rotao direita
Numarvore binria basta empurrar o nodo N para baixo e para a direita. O filho esquerda de N o substitui, e o
filho direita do filho esquerda vem a ser o novo filho esquerda de N. Segue pseudocdigo:
Seja Y o filho esquerda de X Torne o filho direita de Y o filho esquerda
de X. Torne X o filho direita de Y interessante observar que as rotaes duplas nada mais so
que duas rotaes simples seguidas, independentes se direita ou esquerda.

Bibliografia
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second
Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7.

Ligaes externas
Apresentao detalhada sobre AVL para trabalho da UFRJ [1]
Applet de uma rvore AVL [2]
Mais um applet de rvore AVL [3]
rvores AVL no National Institute of Standarts and Technology [4]
rvore AVL 52

Referncias
[1] http:/ / www. vbbsoftware. com/ avl. pdf
[2] http:/ / www. csi. uottawa. ca/ ~stan/ csi2514/ applets/ avl/ BT. html
[3] http:/ / webpages. ull. es/ users/ jriera/ Docencia/ AVL/ AVL%20tree%20applet. htm
[4] http:/ / www. nist. gov/ dads/ HTML/ avltree. html

Problema do caminho mnimo


Na teoria de grafos, o problema do caminho
mnimo consiste na minimizao do custo de
travessia de um grafo entre dois ns (ou
vrtices); custo este dado pela soma dos pesos
de cada aresta percorrida.
Formalmente, dado um grafo valorado (ou seja,
um conjunto V de vrtices, um conjunto A de
arestas e uma funo de peso )
e, dado qualquer elemento v de V, encontrar
um caminho P de v para cada v' de V tal que

mnimo entre todos os caminhos conectando


n a n'.
Os algoritmos especializados em solucionar o
problema do caminho mnimo so
eventualmente chamados de algoritmos de O caminho mnimo entre D e E no D-E, mas sim D-F-E, com uma distncia
busca de caminhos. Entre os algoritmos dessa de 14.
classe, os mais conhecidos so:
Algoritmo de Dijkstra Resolve o problema com um vrtice-fonte em grafos cujas arestas tenham peso maior
ou igual a zero. Sem reduzir o desempenho, este algoritmo capaz de determinar o caminho mnimo, partindo de
um vrtice de incio v para todos os outros vrtices do grafo.
Algoritmo de Bellman-Ford Resolve o problema para grafos com um vrtice-fonte e arestas que podem ter
pesos negativos.
Algoritmo A* um algoritmo heurstico que calcula o caminho mnimo com um vrtice-fonte.
Algoritmo de Floyd-Warshall Determina a distncia entre todos os pares de vrtices de um grafo.
Algoritmo de Johnson Determina a distncia entre todos os pares de vrtices de um grafo, pode ser mais veloz
que o algoritmo de Floyd-Warshall em grafos esparsos.
Um problema relacionado o Problema do Caixeiro-viajante, que consiste em determinar o caminho mais curto que
passa exatamente uma vez por cada vrtice e retorna ao vrtice de partida. Este um problema NP-Completo, para
os quais no h uma soluo eficiente.
rvore B 53

rvore B
Na cincia da computao uma rvore
B uma estrutura de dados projetada
para funcionar especialmente em
memria secundria como um disco
magntico ou outros dispositivos de
armazenamento secundrio. Dentre
suas propriedades ela permite a
insero, remoo e busca de chaves
numa complexidade de tempo
logartmica e, por esse motivo, muito Exemplo de rvore B

empregada em aplicaes que


necessitam manipular grandes quantidades de informao tais como um banco de dados ou um sistema de arquivos.

Inventada por Rudolf Bayer e Edward Meyers McCreight em 1971 enquanto trabalhavam no Boeing Scientific
Research Labs, a origem do nome (rvore B) no foi definida por estes. Especula-se que o B venha da palavra
balanceamento, do nome de um de seus inventores Bayer ou de Boeing, nome da empresa.
Se analisarmos as rvores B, elas so uma generalizao das rvores binria de busca, pois cada n de uma rvore
binria armazena uma nica chave de busca, enquanto as rvores B armazenam um nmero maior do que um de
chaves de busca em cada n, ou no termo mais usual para essa rvore, em cada pgina. Como a idia principal das
rvores B trabalhar com dispositivos de memria secundria, quanto menos acessos a disco a estrutura de dados
proporcionar, melhor ser o desempenho do sistema na operao de busca sobre os dados manipulados.

Viso geral
Os dispositivos de memria de um
computador consiste em memria
principal e secundria sendo cada uma
delas com suas caractersticas. A
memria primria mais conhecida
como memria voltil de
endereamento direto (RAM), esta por rvore-B de ordem 2(Bayer & McCreight 1972) ou ordem 5 (Knuth 1998).
sua vez apresenta baixo tempo de
acesso, porm armazena um volume relativamente pequeno de informao e altos custos. J a memria secundria,
possui um endereamento indireto, armazena um grande volume de informao e possui um acesso (seek) muito
lento quando comparada com a memria primria. A rvore B uma soluo para cenrios em que o volume de
informao alto (e este no pode ser armazenado diretamente em memria primria) e, portanto, apenas algumas
pginas da rvore podem ser carregadas em memria primria.

As rvores B so organizadas por ns, tais como os das rvores binrias de busca, mas estes apresentam um
conjunto de chaves maior do que um e so usualmente chamados de pginas. As chaves em cada pgina so, no
momento da insero, ordenadas de forma crescente e para cada chave h dois endereos para pginas filhas, sendo
que, o endereo esquerda para uma pgina filha com um conjunto de chaves menor e o direita para uma pgina
filha com um conjunto de chaves maior. A figura acima demonstra essa organizao de dados caracterstica.
Vale lembrar que todo este endereamento esta gravado em arquivo (memria secundria) e que um acesso a uma
posio do arquivo uma operao muito lenta. Atravs da paginao possvel carregar em memria primria uma
rvore B 54

grande quantidade de registros contidos numa nica pgina e assim decidir qual a prxima pgina que o algoritmo de
busca ir carregar em memria primria caso esta chave buscada no esteja na primeira pgina carregada. Aps
carregada uma pgina em memria primria, a busca de chave pode ser realizada linearmente sobre o conjunto de
chaves ou atravs de busca binria.

Definio
Para definir uma rvore B devemos esclarecer os conceitos de ordem e pgina folha de acordo com cada autor.
Bayer e McCreight[], Comer[], dentre outros, definem a ordem como sendo o nmero mnimo de chaves que uma
pgina pode conter, ou seja, com exceo da raiz todas devem conter esse nmero mnimo de chaves, mas essa
definio pode causar ambiguidades quando se quer armazenar um nmero mximo mpar de chaves[]. Por exemplo,
se uma rvore B de ordem 3, uma pgina estar cheia quando tiver 6 ou 7 chaves[]? Ou ainda, se quisermos
armazenar no mximo 7 chaves em cada pgina qual ser a ordem da rvore, uma vez que, o mnimo de chaves k e
o mximo 2k?[]
Knuth props que a ordem de uma rvore B fosse o nmero mximo de pginas filhas que toda pgina pode conter.
Dessa forma, o nmero mximo de chaves por pgina ficou estabelecido como a ordem menos um[].
O termo pgina folha tambm inconsistente, pois referenciado diferentemente por vrios autores. Bayer e
McCreight referem-se a estas como as pginas mais distantes da raiz, ou aquelas que contm chaves no nvel mais
baixo da rvore.[] J Knuth define o termo como as pginas que esto abaixo do ultimo nvel da rvore, ou seja,
pginas que no contm nenhuma chave.[]
De acordo com a definio de Knuth de ordem e pgina folha de Bayer e McCreight, uma rvore B de ordem d
(nmero mximo de pginas filhas para uma pgina pai) deve satisfazer as seguintes propriedades:
1. Cada pgina contm no mximo d pginas filhas
2. Cada pgina, exceto a raiz e as folhas, tem pelo menos d/2 pginas filhas
3. A pgina raiz tem ao menos duas pginas filhas (ao menos que ela seja uma folha)
4. Toda pgina folha possui a mesma profundidade, na qual equivalente altura da rvore
5. Uma pgina no folha com k pginas filha contem k-1 chaves
6. Uma pgina folha contm pelo menos d/2-1 chaves e no mximo d-1 chaves

Pgina raiz
A pgina raiz das rvores B possuem o limite superior de d-1 chaves armazenadas, mas no apresentam um nmero
mnimo de chaves, ou seja, elas podem ter um nmero inferior a d/2-1 de chaves. Na figura acima, essa pgina
representada pelo n que possui o registro 7 e 16.

Pginas internas
As pginas internas so as pginas em que no so folhas e nem raiz, estas devem conter o nmero mnimo (d/2-1)
e mximo (d-1) de chaves.
rvore B 55

Pginas folha
Estes so os ns que possuem a mesma restrio de mximo e mnimo de chaves das pginas internas, mas estes no
possuem apontadores para pginas filhas. Na figura acima so todos os demais ns exceto a raiz.

Estrutura da pgina
Uma possvel estrutura de dados para uma pgina de rvore B na linguagem C:

#define D 5 //rvore de ordem 5

typedef struct BTPage{


//armazena numero de chaves na pagina
short int totalChaves;

//vetor de chaves
int chaves[D-1];

//endereos das paginas filhas, -1 aponta para NULL


int filha[D];
}Page;
rvore B 56

Operaes bsicas
As operaes bsicas sobre um rvore B so a busca, insero e remoo
de chaves.

Busca
A busca de uma chave k em uma rvore B muito parecido com uma
busca em rvore binria, porm, agora a cada n carregado em memria
primria temos vrias vias para o n seguinte da busca e no apenas duas.
Caso a chave k no esteja na pgina carregada em memria primria
basta carregar a prxima pgina apontada pelo intervalo que a chave k
corresponde na pgina atual.

Insero
A operao de insero, inicialmente com a rvore vazia, deve garantir
que o n raiz ser criado. Criado o n raiz, a insero das prximas
chaves seguem o mesmo procedimento: busca-se a posio correta da
chave em um n folha e insere a chave garantindo a ordenao destas.
Aps feito isso podem ocorrer duas situaes:
1. Pgina folha est com um nmero menor de chaves do que o
mximo permitido (d-1): Nesse caso apenas inserimos a chave de
maneira ordenada na pgina
2. Pgina folha completa ou com o nmero mximo de chaves
permitido (d-1): Nesse caso ocorre o overflow da pgina em questo e Exemplo de insero em rvore B da
necessrio a operao de split para manter o balanceamento da sequncia de 1 a 7. Os ns dessa rvore
possuem no mximo 3 filhos
rvore.
1. Primeiramente escolhe-se um valor intermedirio na sequncia
ordenada de chaves da pgina incluindo-se a nova chave que deveria ser inserida. Este valor exatamente uma
chave que ordenada com as chaves da pgina estar no meio da sequncia.
2. Cria-se uma nova pgina e os valores maiores do que a chave intermediria so armazenados nessa nova
pgina e os menores continuam na pgina anterior (operao de split).
3. Esta chave intermediria escolhida dever ser inserido na pgina pai, na qual poder tambm sofrer overflow
ou dever ser criada caso em que criada uma nova pgina raiz. Esta srie de overflows pode se propagar para
toda a rvore B, o que garante o seu balanceamento na insero de chaves.
rvore B 57

Remoo
O algoritmo de remoo de uma rvore B deve
garantir que as propriedades da rvore sejam
mantidas, pois uma chave pode ser eliminada
de qualquer pgina e no apenas de pginas
folha. Nessa operao podem ocorrer
underflows nas pginas, ou seja, quando h
um nmero abaixo do mnimo permitido
(d/2-1) de chaves em uma pgina. Na
remoo h vrios casos a se analisar, as
seguintes figuras apresentam alguns casos
numa rvore de ordem 5:

Caso da figura 1: Neste caso a remoo da


chave 8 no causa o underflow na pgina
Figura 1: Remoo da chave 8 e posterior reorganizao da estrutura
folha em que ela est, portanto ela
simplesmente apagada e as outras chaves
so reorganizadas mantendo sua ordenao.
Caso da figura 2: O caso da figura 2
apresentado a tcnica de redistribuio de
chaves. Na remoo da chave 18, a pgina
que contm essa chave possui uma pgina
irm direita com um nmero superior ao
mnimo de chaves (pgina com chaves 24,
25 e 26) e, portanto, estas podem ser
redistribudas entre elas de maneira que no
final nenhuma delas tenha um nmero
inferior ao mnimo permitido.

Figura 2: Remoo da chave 18 e posterior redistribuio das chaves


rvore B 58

Caso da figura 3: Nesta figura foi


removido a chave 5, como no foi possivel
utilizar a tcnica de redistribuio, pois as
pginas irms possuem o nmero mnimo
de chaves, ento foi necessrio concatenar
o contedo da pgina que continha a chave
5 com sua pgina irm esquerda e a chave
separadora pai. Ao final do processo a
pgina pai fica com uma nica chave
(underflow) e necessrio diminuir a altura
da rvore de maneira que o contedo da
pgina pai e sua irm, juntamente com a
raiz, sejam concatenados para formar uma
Figura 3: Remoo da chave 5 e posterior concatenao com pgina irm
pgina nica.
esquerda

Caso da figura 4: A remoo da chave 13


nesse caso foi realizado com a substituio
do 13 pelo menor nmero da subrvore
direita de 13 que era o 14. Essa troca no
causou o underflow da pgina em que
estava o 14 e, portanto no gerou grandes
alteraes na rvore.

Figura 4: Remoo da chave 13 e promoo da menor chave da subrvore


direita de 13
rvore B 59

Caso da figura 5: Caso semelhante ao


anterior, mas esse ocorre o underflow da
pgina que contm a menor chave da
subrvore direita de 13. Com isso, como
no possivel a redistribuio,
concatena-se o contedo dessa pgina com
sua irm direita o que gera tambm
underflow da pgina pai. O underflow da
pgina pai tambm resolvido com a
concatenao com sua irm e a raiz,
resultando na diminuio da altura da
rvore.
Figura 5: Chave 14 promovida para a raiz o que causa underflow em sua
pgina
Algoritmos

Busca
Neste algoritmo recursivo os parmetros recebidos inicialmente devem ser a chave buscada e um ponteiro para a
pgina raiz da rvore B.

Busca(k, ponteiroRaiz)
{
se(ponteiroRaiz == -1)
{
return (chave nao encontrada)
}
senao
{
carrega em memoria primaria pagina apontado por
ponteiroRaiz
procura k na pagina carregada
se(k foi encontrada)
{
return (chave encontrada)
}
senao
{
ponteiro = ponteiro para a prxima pgina da possvel
ocorrncia de k
return (Busca (k, ponteiro))
}
}
}
rvore B 60

Insero
O algoritmo de insero em rvore B um procedimento recursivo que inicialmente ponteiroRaiz aponta para a raiz
da rvore em arquivo, key a chave a ser inserida e chavePromovida representa a chave promovida aps um split de
uma pgina qualquer.

Inserao(ponteiroRaiz, key, chavePromovida)


{
se(ponteiroRaiz == -1)//se ponteiroRaiz nao aponta para nenhuma
pagina
{
chavePromovida = key
return(flag que indica que houve promoo de chave)
}
senao
{
carregue a pgina P apontada por ponteiroRaiz em memoria
primria
busque por key nessa pgina P
posicao = pgina no qual key poderia estar
}

se(key foi encontrada)


{
//chave ja esta na arvore, retorne uma flag de erro
return(flag de erro)
}

flagRetorno = Inserao(posicao, key,


chavePromovida)//procedimento recursivo

se(flagRetorno indica que nao houve promoao de chave ou que


ocorreu um erro)
{
return(conteudo de flagRetorno)
}
senao se(h espao na pgina P para chavePromovida)
{
insere chavePromovida na pgina P
escreve pgina P em arquivo
return(flag que indica que nao houve promocao de chave)
}
senao //nao ha espao em P para key
{
realize operao de split em P
escreva em arquivo a nova pgina e a pgina P
return(flag que indica que houve promoao de chave)
}
}
rvore B 61

Remoo
Busque a chave k
Busque a menor chave M na pgina folha da sub-rvore direita de k
Se a chave k no est numa folha
{
Substitua k por M
}
Apague a chave k ou M da pgina folha
Se a pgina folha no sofrer underflow
{
fim do algoritmo
}
Se a pgina folha sofrer underflow, verifique as pginas irms da
pgina folha
{
Se uma das pginas tiver um nmero maior do que o mnimo redistribua
as chaves
Seno concatene as pginas com uma de suas irms e a chave pai
separadora
}
Se ocorrer concatenao de pginas aplique o trecho das linhas 8 at 17
para a pgina pai da folha

Imprimir emOrdem em C
void emOrdem (tpaginaB raiz) {
if(raiz==NULL)
return;
for(int i=0;i<raiz.n,i++)
emOrdem(raiz->pont[i]);
printf("%i",raiz->chv[i]);
}
emOrdem(raiz->pont[raiz.n]);
}

Variaes
As rvores B no so as nicas estruturas de dados usadas em aplicaes que demandam a manipulao de grande
volume de dados, tambm existem variaes desta que proporcionam determinadas caractersticas como as rvores
B+ e B*. Estas, por sua vez, se assemelham muito com as rvores B, mas possuem propriedades diferentes.
As rvores B+ possuem seus dados armazenados somente em seus ns folha e, seus ns internos e raiz, so
apenas referncias para as chaves que esto em ns folha. Assim possivel manter ponteiros em seus ns folha
para um acesso sequencial ordenado das chaves contidas no arquivo.
rvores B* diferem das rvores B em relao ao particionamento de suas pginas. A estratgia dessa variao
realizar o particionamento de duas pginas irms somente quando estas estiverem completamente cheias e, claro,
rvore B 62

isso somente possvel atravs da resdistribuio de chaves entre estas pginas filhas. Estando completamente
cheias, as chaves so redistribudas entre trs pginas diferentes que so as duas irms anteriores e uma nova
criada.

Comparao com as variaes


Se compararmos as rvores B com suas variaes podemos enumerar algumas caractersticas importantes para a
escolha de implementao destas:
rvores B+:
1. A principal caracterstica proporcionada por esta variao o fato de permitir o acesso sequencial das chaves
por meio de seu sequence set de maneira mais eficiente do que o realizado em rvores B .[]
2. Alm do mais, as pginas utilizadas em seu index set podem conter mais apontadores para pginas filha
permitindo reduzir a altura da rvore.[]
rvores B*:
1. A principal vantagem decorrente dessa variao o fato desta apresentar suas pginas com no mnimo 2/3 do
nmero mximo de chaves, ou seja, esta variao apresenta no pior caso um ndice de utilizao do arquivo de
66%, enquanto em rvores B esse ndice de pior caso cai para 50%.[]

Bibliografia
Cormen, Thomas; Stein, Clifford. Introduction to Algorithms (em ingls). 2ed. [S.l.]:MIT Press and
McGraw-Hill, 2001.Captulo: 18, ISBN 0-262-03293-7
Folk, Michael; Zoellick, Bill. File Structures (em ingls). 2ed. [S.l.]:Addison-Wesley, 1992.590 p. ISBN
0-201-55713-4

Knuth, Donald. The Art of Computer Programming: Sorting and Searching (em ingls). 2ed.
[S.l.]:Addison-Wesley, 1998. vol.3. ISBN 0-201-89685-0

Ligaes externas
Applet de uma rvore B segundo a definio de Bayer & McCreight (1972) [1]
Animao em Flash de uma rvore B [2]
Applet de uma rvore B, rvore AVL, rvore binria [3]
Cdigo em C++ de uma rvore B [4]
Aplicao em MS Visual C# que implementa um rvore B orientada a objetos [5]

Referncias
[1] http:/ / slady. net/ java/ bt/ view. php
[2] http:/ / ats. oka. nu/ b-tree/ b-tree. manual. html
[3] http:/ / groups. engin. umd. umich. edu/ CIS/ course. des/ cis350/ treetool/
[4] http:/ / cis. stvincent. edu/ html/ tutorials/ swd/ btree/ btree. html
[5] http:/ / www. inf. ufrgs. br/ ~pmdusso/ works/ Relatorio_CPD_Disk_Guru. htm
63

Programao dinmica

Programao dinmica
Programao dinmica um mtodo para a construo de algoritmos para a resoluo de problemas
computacionais, em especial os de otimizao combinatria. Ela aplicvel a problemas nos quais a soluo tima
pode ser computada a partir da soluo tima previamente calculada e memorizada - de forma a evitar reclculo - de
outros subproblemas que, sobrepostos, compem o problema original.
O que um problema de otimizao deve ter para que a programao dinmica seja aplicvel so duas principais
caractersticas: subestrutura tima e superposio de subproblemas. Um problema apresenta uma subestrutura tima
quando uma soluo tima para o problema contm em seu interior solues timas para subproblemas. A
superposio de subproblemas acontece quando um algoritmo recursivo reexamina o mesmo problema muitas vezes.

Exemplos
Como exemplo simples de programao dinmica, com alguma frequncia, alguns textos, utilizam a determinao da
Sequncia de Fibonacci, quando implementada de forma recursiva. Isso porque quando a forma recursiva
implementada
sem maiores cuidados, sem memorizao, o seu clculo de tempo cresce exponencialmente. Observe que a rigor esse
caso no um problema de programao dinmica, visto que o clculo do n-simo nmero
de Fibonacci cresce linearmente, e no exponencialmente. Porm este exemplo ainda assim utilizado, pois a
simplicidade grande.

Se n <= 1 ento F(n) := 1


caso contrrio F(n) := F(n-1) + F(n-2)

Quando implementada de forma recursiva "ingnua" (naive), sem memorizao, a dupla chamada F na segunda
linha,
causa a necessidade da repetio de clculos, que cresce exponencialmente.
[1]

[1] Grafos e Algoritmos Computacionais, Jayme Luiz Szwarccfiter, 1984 Editora Campus Ltda.
64

Grafos

Grafo
Em matemtica e cincia da computao, grafo o objeto bsico de
estudo da teoria dos grafos. Tipicamente, um grafo representado
como um conjunto de pontos (vrtices) ligados por retas (as arestas).
Dependendo da aplicao, as arestas podem ser direcionadas, e so
representadas por "setas".
Os grafos so muito teis na representao de problemas da vida real,
em vrios campos profissionais. Por exemplo, pode-se representar um
mapa de estradas atravs dos grafos e usar algoritmos especficos para
Um grafo com 6 vrtices e 7 arestas.
determinar o caminho mais curto entre dois pontos, ou o caminho mais
econmico. Assim, os grafos podem possuir tambm pesos (ou custo),
quer nas arestas quer nos vrtices, e o custo total em estudo ser calculado a partir destes pesos.

Grafos podem ser utilizados tambm em redes PERT no mbito do planejamento de projetos. Neste caso, a cada
aresta est associado o custo de execuo, e as tarefas precedentes de uma outra sero suas afluentes.
Outro exemplo o caso das redes de computadores, sendo cada terminal representado por um vrtice, o cabo de rede
pelas arestas e o custo associado a latncia, por exemplo, ou o nmero de mquinas que a comunicao atravessa
entre os ns. nestes princpios que assenta todo o protocolo IP que torna possvel a Internet ser uma realidade.
Grafos tm sido utilizados para representar o formalismo das redes complexas, onde o nmero de ns e de conexes
entre esses ns muito alto e complexamente estabelecido.

Introduo
Uma possvel definio para grafos: "O grafo propriamente dito uma representao grfica das relaes existentes
entre elementos de dados. Ele pode ser descrito num espao euclidiano de n dimenses como sendo um conjunto V
de vrtices e um conjunto A de curvas contnuas (arestas)". Podemos avaliar um grafo atravs de seu tipo,
propriedades e aplicaes[1].

Busca em grafo
Vrios problemas representados por um grafo podem ser resolvidos efetuando uma busca nesse grafo. A busca em
grafo consiste em explorar um grafo, de forma que obtenha um processo sistemtico de como caminhar por seus
vrtices e arestas. s vezes preciso visitar todos os vrtices de um grafos, s vezes o problema pode ser resolvido
visitando somente um subconjunto dos vrtices.
Se o grafo for uma rvore, esta questo se torna simples, podem utilizar as visitas em pr-ordem, ou ordem de nvel.
Grafo 65

Algoritmos de percurso
Existem dois mtodos de percurso em grafos: percurso em profundidade (depth-first search DFS) e o percurso em
largura (breadth first search BFS).
A ideia bsica do DFS buscar "mais a fundo" no grafo quando possvel. Assim, a partir de um vrtice v, as arestas
ainda no exploradas o so e, ao final, a busca retrocede.
A ideia do BFS bastante simples: os vrtices do grafo so visitados nvel a nvel, ou seja, todos os vrtices a uma
distncia k do vrtice inicial so visitados antes de qualquer vrtice a uma distncia k +1 do inicial.

Referncias
http://www.icmc.sc.usp.br/manuals/sce183/gfbus.html
Cormen. Thomas (2000); Leiserson, Charles.; Rivest, Ronald. Introduction to Algorithmics, McGraw-Hill.
Algoritmos em Grafos - Paulo Feofiloff [1]

Referncias
[1] http:/ / www. ime. usp. br/ ~pf/ algoritmos_em_grafos/ aulas/ grafos. html

Teoria dos grafos


A teoria dos grafos um ramo da matemtica que estuda as relaes
entre os objetos de um determinado conjunto. Para tal so empregadas
estruturas chamadas de grafos, G(V,A), onde V um conjunto no
vazio de objetos denominados vrtices e A um conjunto de pares no
ordenados de V, chamado arestas.
Dependendo da aplicao, arestas podem ou no ter direo, pode ser
permitido ou no arestas ligarem um vrtice a ele prprio e vrtices
e/ou arestas podem ter um peso (numrico) associado. Se as arestas
tm uma direo associada (indicada por uma seta na representao
grfica) temos um grafo direcionado, grafo orientado ou digrafo. Um
grafo com um nico vrtice e sem arestas conhecido como o grafo
trivial. Grafo com 4 vrtices e 6 arestas. um grafo
completo, conexo e planar.
Estruturas que podem ser representadas por grafos esto em toda parte
e muitos problemas de interesse prtico podem ser formulados como
questes sobre certos grafos. Por exemplo, a estrutura de links da Wikipedia pode ser representada por um dgrafo:
os vrtices so os artigos da Wikipedia e existe uma aresta do artigo A para o artigo B se e somente se A contm um
link para B. Dgrafos so tambm usados para representar mquinas de estado finito. O desenvolvimento de
algoritmos para manipular grafos um importante tema da cincia da computao.
Teoria dos grafos 66

Histrico
O artigo de Leonhard Euler, publicado em 1736, sobre o problema das sete pontes de Knigsberg, considerado o
primeiro resultado da teoria dos grafos.[] tambm considerado um dos primeiros resultados topolgicos na
geometria; isto , no dependente de quaisquer medidas. Isso ilustra a profunda conexo entre a teoria dos grafos e
topologia.

Definies de grafos e digrafos


Na literatura, as definies bsicas da teoria dos grafos variam bastante. Aqui esto as convenes usadas nesta
enciclopdia.
Um grafo direcionado (tambm chamado digrafo ou quiver) consiste de
um conjunto V de vrtices,
um conjunto E de arestas e
mapas s, t : E V, onde s(e) a fonte e t(e) o alvo da aresta direcionada e.
Um grafo no direcionado (ou simplesmente grafo) dado por
um conjunto V de vrtices,
um conjunto E de arestas e
uma funo w : E P(V) que associa a cada aresta um subconjunto de dois ou de um elemento de V, interpretado
como os pontos terminais da aresta.
Em um grafo ou digrafo com pesos, uma funo adicional E R associa um valor a cada aresta, o que pode ser
considerado seu "custo"; tais grafos surgem em problemas de rota tima tais como o problema do caixeiro viajante.

Representao grfica (layout do grafo)


Os grafos so geralmente representados graficamente da seguinte maneira: desenhado um crculo para cada vrtice,
e para cada aresta desenhado um arco conectando suas extremidades. Se o grafo for direcionado, seu sentido
indicado na aresta por uma seta.
Note que essa representao grfica (o layout) no deve ser confundida com o grafo em si (a estrutura abstrata,
no-grfica). Vrios diferentes layouts podem corresponder ao mesmo grafo.[1] O que importa quais vrtices esto
conectados entre si por quantas arestas.

Glossrio dos conceitos bsicos de teoria dos grafos


O grafo de exemplo exibido direita um grafo simples com o
conjunto de vrtices V = {1, 2, 3, 4, 5, 6} e um conjunto de arestas E =
{ {1,2}, {1,5}, {2,3}, {2,5}, {3,4}, {4,5}, {4,6} } (com o mapeamento
w sendo a identidade).
Uma aresta conecta dois vrtices; esses dois vrtices so ditos como
incidentes aresta. A valncia (ou grau) de um vrtice o nmero de
arestas incidentes a ele, com loops contados duas vezes. No grafo de
exemplo os vrtices 1 e 3 possuem uma valncia de 2, os vrtices 2, 4 e
Um grafo com 6 vrtices e 7 arestas
5 tm a valncia de 3 e o vrtice 6 tem a valncia de 1. Se E finito,
ento a valncia total dos vrtices o dobro do nmero de arestas. Em
um dgrafo, distingue-se o grau de sada (o nmero de arestas saindo de um vrtice) e o grau de entrada (o nmero
de arestas entrando em um vrtice). O grau de um vrtice igual soma dos graus de sada e de entrada.

Dois vrtices so considerados adjacentes se uma aresta existe entre eles. No grafo acima, os vrtices 1 e 2 so
adjacentes, mas os vrtices 2 e 4 no so. O conjunto de vizinhos de um vrtice consiste de todos os vrtices
Teoria dos grafos 67

adjacentes a ele. No grafo-exemplo, o vrtice 1 possui 2 vizinhos: vrtice 2 e vrtice 5. Para um grafo simples, o
nmero de vizinhos de um vrtice igual sua valncia.
Na computao, um grafo finito direcionado ou no-direcionado (com, digamos, n vrtices) geralmente
representado por sua matriz de adjacncia: uma matriz n-por-n cujo valor na linha i e coluna j fornece o nmero de
arestas do i-simo ao j-simo vrtices.
Se for possvel estabelecer um caminho de qualquer vrtice para qualquer outro vrtice de um grafo, diz-se que o
grafo conexo. Se for sempre possvel estabelecer um caminho de qualquer vrtice para qualquer outro vrtice
mesmo depois de remover k-1 vrtices, ento diz-se que o grafo est k-conexo. Note que um grafo est k-conexo se,
e somente se, contm k caminhos independentes entre qualquer par de vrtices. O grafo de exemplo acima conexo
(e portanto 1-conexo), mas no 2-conexo.
Em um grafo genrico G, o corte associado a um conjunto X de vrtices o conjunto de todas as arestas que tm
uma ponta em X e outra em V(G) - X, onde V(G) o conjunto de todos os vrtices pertencentes ao grafo G.
Grafo simples um grafo no direcionado, sem laos e que existe no mximo uma aresta entre quaisquer dois
vrtices (sem arestas paralelas). No grafo de exemplo, (1, 2, 5, 1, 2, 3) um caminho com comprimento 5, e (5, 2,
1) um caminho simples de comprimento 2.
Grafo completo o grafo simples em que, para cada vrtice do grafo, existe uma aresta conectando este vrtice a
cada um dos demais. Ou seja, todos os vrtices do grafo possuem mesmo grau. O grafo completo de n vrtices
frequentemente denotado por Kn. Ele tem n(n-1)/2 arestas (correspondendo a todas as possveis escolhas de pares
de vrtices).
Grafo nulo o grafo cujo conjunto de vrtices vazio.
Grafo vazio o grafo cujo conjunto de arestas vazio.
Grafo trivial o grafo que possui apenas um vertice e nenhuma aresta.
Grafo regular um grafo em que todos os vrtices tem o mesmo grau.
Multigrafo um grafo que permite mltiplas arestas ligando os mesmos vrtices (arestas paralelas).
Lao (loop) num grafo ou num digrafo uma aresta e em E cujas terminaes esto no mesmo vrtice.
Pseudografo um grafo que contm arestas paralelas e laos.
Ciclo (ou circuito) um caminho que comea e acaba com o mesmo vrtice. Ciclos de comprimento 1 so laos.
No grafo de exemplo, (1, 2, 3, 4, 5, 2, 1) um ciclo de comprimento 6. Um ciclo simples um ciclo que tem um
comprimento pelo menos de 3 e no qual o vrtice inicial s aparece mais uma vez, como vrtice final, e os outros
vrtices aparecem s uma vez. No grafo acima, (1, 5, 2, 1) um ciclo simples. Um grafo chama-se acclico se no
contm ciclos simples.
Ponto de articulao ou Vrtice de corte um vrtice cuja remoo desliga um grafo. Uma ponte uma aresta
cuja remoo desliga um grafo. Um componente biconectado um conjunto mximo de arestas tal que qualquer
par de arestas do conjunto fazem parte de um ciclo simples comum. O contorno de um grafo o comprimento do
ciclo simples mais curto no grafo. O contorno de um grafo acclico , por definio, infinito.
rvore um grafo simples acclico e conexo. s vezes, um vrtice da rvore distinto e chamado de raiz.
rvores so comumente usadas como estruturas de dados em informtica (veja estrutura de dados em rvore).
Floresta um conjunto de rvores; equivalentemente a uma floresta, em algum grafo acclico.
Subgrafo de um grafo G um grafo cujo conjunto dos vrtices um subconjunto do conjunto de vrtices G, cujo
conjunto de arestas um subconjunto do conjunto de arestas de G, e cuja funo w uma restrio da funo de
G
Subgrafo gerador aquele obtido pela remoo de uma ou mais arestas de um outro grafo, dizemos ento que
este novo grafo obtido gerador do primeiro,
Teoria dos grafos 68

Subgrafo induzido obtido pela remoo de vrtices e consequente das arestas relacionadas com ele de um outro
grafo, dizemos que este novo grafo um grafo induzido do original.
Grafo parcial de um grafo G um subgrafo com o mesmo conjunto de vrtices que G. Uma rvore parcial um
grafo parcial que rvore. Todo grafo tem pelo menos uma rvore parcial.
Clique em um grafo um subgrafo que tambm um grafo completo. No grafo do exemplo acima, os vrtices 1,
2 e 5 formam um clique.
Conjunto independente em um grafo um conjunto de vrtices no adjacentes entre si. No exemplo acima, os
vrtices 1, 3 e 6 formam um conjunto independente e 3, 5 e 6 so outro conjunto independente.
Grafo planar aquele que pode ser representado em um plano sem qualquer interseco entre arestas. O grafo do
exemplo planar; o grafo completo de n vertices, para n> 4, no planar.
Caminho uma sequncia de vrtices tal que de cada um dos vrtices existe uma aresta para o vrtice seguinte.
Um caminho chamado simples se nenhum dos vrtices no caminho se repete. O comprimento do caminho o
nmero de arestas que o caminho usa, contando-se arestas mltiplas mltiplas vezes. O custo de um caminho
num grafo balanceado a soma dos custos das arestas atravessadas. Dois caminhos so independentes se no
tiverem nenhum vrtice em comum, excepto o primeiro e o ltimo.
Caminho euleriano em um grafo o caminho que usa cada aresta exatamente uma vez. Se tal caminho existir, o
grafo chamado traversvel. Um ciclo euleriano um ciclo que usa cada aresta exatamente uma vez.
Caminho hamiltoniano em um grafo o caminho que visita cada vertice exatamente uma vez. Um ciclo
hamiltoniano um ciclo que visita cada vrtice uma s vez. O grafo do exemplo contm um caminho
hamiltoniano. Enquanto determinar se um dado grafo contm um caminho ou ciclo euleriano trivial, o mesmo
problema para caminhos e ciclos hamiltonianos extremamente rduo.
Lema do aperto de mos diz que se os convidados de uma festa apertarem as mos quando se encontrarem pela
primeira vez, o nmero de convidados que apertam a mo um nmero mpar de vezes par. Tambm em grafos
no direcionados a soma dos graus de todos os vrtices igual ao dobro do nmero de arestas.
Grafo bipartido o grafo cujos vrtices podem ser divididos em dois conjuntos, nos quais no h arestas entre
vrtices de um mesmo conjunto. Para um grafo ser bipartido ele no pode conter circuitos de comprimento mpar.
1. Se um grafo G bipartido, todo o circuito de G possui comprimento par.
Sejam V1 e V2 os dois conjuntos em que, de acordo com a definio de grafo bipartido, se particiona V(G).
Toda a aresta de G conecta um vrtice em V1 com outro em V2. Assim sendo, se X for um vrtice de V1,
para voltar a esse vrtice ter de se ir a V2 e voltar a V1 um nmero indeterminado de vezes, e de cada
vez sero percorridas duas arestas, uma de um vrtice em V1 para um vrtice em V2 e outra de um vrtice
em V2 para um vrtice em V1. Logo, o nmero de arestas a percorrer ser par, ou seja, o comprimento do
circuito par.
2. Se todo o circuito de um grafo G possui comprimento par, ento o grafo bipartido.
Seja G um grafo em que todo o circuito tem comprimento par, e seja X um vrtice de G. Denotemos por V1
o conjunto formado por X e por todos os vrtices cuja distncia a X par. Seja V2 = V(G)\V1 (isto , o
conjunto formado pelos vrtices de G que no pertencem a V1). Pretende mostrar-se que no existe
qualquer aresta que conecte vrtices de V1 ou vrtices de V2. Suponhamos a existncia de tal aresta, isto ,
suponhamos a existncia de dois vrtices em V1 (ou V2), digamos Xi e Xj, conectados por uma aresta. Ora
existe j um caminho de comprimento par entre Xi e Xj, j que existem caminhos, ambos de comprimento
par (ou mpar, no caso de Xi e Xj pertencerem a V2), entre Xi e X e entre X e Xj. Se a esse caminho
juntarmos a aresta {Xi;Xj} obtemos um circuito de comprimento mpar o que contraria a hiptese de apenas
existirem circuitos de comprimento par.
Teoria dos grafos 69

Grafo bipartido completo o grafo bipartido, cujo qualquer vrtice do primeiro conjunto adjacente a todos
vrtices do segundo conjunto
Grafo k-partido ou grafo de k-colorao um grafo cujos vrtices podem ser particionados em k conjuntos
disjuntos, nos quais no h arestas entre vrtices de um mesmo conjunto. Um grafo 2-partido o mesmo que
grafo bipartido.
Emparelhamento de grafos consiste em partir o grafo em conjuntos de vrtices a qual no compartilham
nenhuma aresta entre eles.
Teorema das quatro cores baseado no problema das cores necessrias para se colorir um mapa sem que os
pases vizinhos compartilhem da mesma cor. Transformando o mapa em um grafo pode-se provar que pode-se
representar qualquer mapa (um grafo planar) com apenas 4 cores (4 parties).
Percurso rvores:
Percorrimento sistemtico em todos os vrtices e arestas do grafo. Grafo pode ser dirigido ou no.
O percurso em rvores o processo de visitar cada n da rvore exatamente uma vez.
O percurso pode ser interpretado como colocar todos os ns em uma linha, no existe uma ordem para ser
seguida.
Existem n percursos diferentes, quase todos caticos.
Os bsicos so percurso em profundidade e percurso em largura
Fila: busca em largura
Pilha: busca em profundidade
Busca em extenso ou largura: (Breadth-First Search ou BFS).
A propriedade especial est no fato de a rvore no possuir ciclos: dados dois vrtices quaisquer, existe exatamente 1
caminho entre eles. Um percurso em extenso visitar cada n comeando do menor nvel e move-se para os nveis
mais altos nvel aps nvel, visitando cada n da esquerda para a direita. Sua implementao direta quando uma fila
utilizada. Depois que um n visitado, seus filhos, se houver algum, so colocados no final da fila e o n no incio
da fila visitado. Assim, os ns do nvel n+1 sero visitados somente depois de ter visitados todos os ns do nvel n.
Computa a menor distncia para todos os vrtices alcanaveis. O sub-grafo contendo os caminhos percorridos
chamado de breadth-first tree.
Busca em profundidade (Depth-first search ou DFS).
Um algoritmo de busca em profundidade realiza uma busca no-informada que progride atravs da expanso do
primeiro n filho da rvore de busca, e se aprofunda cada vez mais, at que o alvo da busca seja encontrado ou at
que ele se depare com um n que no possui filhos (n folha). Ento a busca retrocede (backtrack) e comea no
prximo n. Numa implementao no-recursiva, todos os ns expandidos recentemente so adicionados a uma
pilha, para realizar a explorao. A complexidade espacial de um algoritmo de busca em profundidade muito
menor que a de um algoritmo de busca em largura. A complexidade temporal de ambos algoritmos so proporcionais
ao nmero de vrtices somados ao nmero de arestas dos grafos aos quais eles atravessam. Quando ocorrem buscas
em grafos muito grandes, que no podem ser armazenadas completamente na memria, a busca em profundidade no
termina, em casos onde o comprimento de um caminho numa rvore de busca infinito. O simples artifcio de
lembrar quais ns j foram visitados no funciona, porque pode no haver memria suficiente. Isso pode ser
resolvido estabelecendo-se um limite de aumento na profundidade da rvore.
Teoria dos grafos 70

Problemas que envolvem grafos


Colorao de grafos: o Teorema das quatro cores
Conjuntos de Grafos
Conjunto independente
Clique
Problemas de roteamento:
Sete pontes de Knigsberg
rvore de extenso mnima
Problema do caminho mnimo
Problema da inspeo de rotas (tambm conhecido como o "Problema do carteiro chins")
Problema do caixeiro viajante
Fluxos de rede:
Teorema do mnimo corte-mximo fluxo
conjectura da reconstruo
Problemas de Isomorfismo (casamento de grafos)
Rotulao cannica?
Isomorfismo de subgrafos e monomorfismos.
Mximo subgrafo comum

Algoritmos importantes
algoritmo de Dijkstra
algoritmo de Kruskal
algoritmo do vizinho mais prximo
algoritmo de Prim.

Generalizaes
Num hipergrafo uma aresta pode conectar mais que dois vrtices.
Um grafo no-direcionado pode ser visto como um complexo simplicial consistindo de smplices de uma dimenso
(as arestas) e smplices de dimenso zero (os vrtices). Ou seja, complexos so generalizaes de grafos que
permitem smplices de maiores dimenses.
[1] Ver por exemplo, (http:/ / www. aisee. com/ gallery/ graph23. htm)

Ligaes externas

Em ingls
Graph theory tutorial (http://www.utm.edu/departments/math/graph/)
Graph theory algorithm presentation (http://www.cs.wpi.edu/~dobrush/cs507/presentation/2001/Project10/
ppframe.htm)
Some graph theory algorithm animations (http://students.ceid.upatras.gr/~papagel/project/contents.htm)
Step through the algorithm to understand it.
The compendium of algorithm visualisation sites (http://www2.hig.no/~algmet/animate.html)
A search site for finding algorithm implementations, explanations and animations (http://www.spectster.com/)
Graph Theory Software (http://graphtheorysoftware.com/)
Teoria dos grafos 71

Em portugus
Material sobre grafos da USP So Carlos (http://www.icmc.sc.usp.br/manuals/sce183/grafos.html)
Uma Introduo Sucinta Teoria dos Grafos (http://www.ime.usp.br/~pf/teoriadosgrafos/texto/
TeoriaDosGrafos.pdf)
Material com "Atlas de Grafos" da FINTEC (http://www.fintec.edu.br/peter/relat04/atlas1/atlas_index.htm)
Enumerao de caminhos - Algoritmo Grafos (http://thiagoprocaci.blogspot.com/2009/10/
enumeracao-de-caminhos-algoritmo-grafos.html)

Ferramentas de grafos populares


http://www.graphviz.org/(em Ingls)
http://www.absint.com/aisee/index_pt.htm (em Portugus)
http://www.aisee.com (em Ingls)
http://www.research.att.com/sw/tools/graphviz/(em Ingls)
http://www.cs.uni-sb.de/RW/users/sander/html/gsvcg1.html (em Ingls)
http://www.tulip-software.org (em Ingls)
http://www.roxgt.org
http://planarity.net
72

Outros a catalogar a seu tempo

Lista ligada
Uma lista ligada ou lista encadeada uma estrutura de dados linear e dinmica. Ela composta por clulas que
apontam para o prximo elemento da lista. Para "ter" uma lista ligada/encadeada, basta guardar seu primeiro
elemento, e seu ltimo elemento aponta para uma clula nula. O esquema a seguir representa uma lista
ligada/encadeada com 5 elementos:

Clula 1 ----> Clula 2 ---> Clula 3 ---> Clula 4 ---> Clula 5 ---> (Nulo)

Para inserir dados ou remover dados necessrio ter um ponteiro que aponte para o 1 elemento e outro que aponte
para o fim, porque se queremos inserir ou apagar dados que esto nessas posies, a operao rapidamente
executada. Caso seja necessrio editar um n que esteja no meio da lista haver uma busca pela posio desejada.

Vantagens
A insero ou remoo de um elemento na lista no
implica a mudana de lugar de outros elementos;
No necessrio definir, no momento da criao da
lista, o nmero mximo de elementos que esta Diagrama conceitual de uma lista ligada.

poder ter. Ou seja, possvel alocar memria


"dinamicamente", apenas para o nmero de ns necessrios.

Desvantagens
A manipulao torna-se mais "perigosa" uma vez que, se o encadeamento (ligao) entre elementos da lista for
mal feito, toda a lista pode ser perdida;
Para aceder ao elemento na posio n da lista, deve-se percorrer os n - 1 anteriores.

Nveis de complexidade
Numa lista com n itens, temos as seguintes complexidades de tempo no pior caso:
Insero
Cabea O(1)
Cauda O(1)
Meio O(n)
Eliminao
Cabea O(1)
Cauda O(n)
Meio O(n)
Lista ligada 73

Exemplo em C
Exemplo de cdigo feito em linguagem de programao C:

Estrutura
typedef struct No_st{
int numero;
struct No *prox;
}No;

O tipo de dados seria definido apenas pela chamada ao mtodo struct, mas a incluso do typedef simplifica a sua
utilizao. A partir deste momento, a varivel do tipo No est disponvel, sendo o seu acesso feito como a uma
qualquer estrutura de dados.
Exemplo de inicializao e preenchimento no main:

int main(void){
No exemplo; /*A varivel exemplo do tipo no*/
No *pexemplo; /*A varivel pexemplo do tipo apontador para no*/

exemplo.numero = 1;
pexemplo = &exemplo;

printf("%d\n", exemplo.numero);
printf("%d\n", pexemplo->numero);

return (1);

Neste exemplo, ambas as chamadas funo printf() iriam imprimir o nmero 1.

Manuteno

Cria Lista
Para comear uma lista no basta comear a inserir novas clulas, preciso uma base, ou raiz, que ser sempre a
mesma para uma lista. Esta raiz pode ser simplesmente um apontador para uma lista ou um apontador para uma
primeira clula vazia. Normalmente, para listas, usada a clula vazia, j para as pilhas e filas usado o apontador
para os respectivos. A funo seguinte usada no main aps ser declarada a varivel raiz que ser do tipo apontador
para lista( que nestes exemplos tem o nome No).Esta cria uma clula vazia e mete a raiz a apontar para esta:

No * cria_lista(){ // Funo do tipo apontador para lista, i.e., o


tipo de funo tem de ser igual ao tipo que retorna
No * novo,*aux;

novo = (No *) malloc( sizeof( No )); /*Aloca memria do tamanho


de uma clula*/

if(novo == NULL) exit(0); /* Se no alocar memria significa que


no h memoria disponvel, logo deve sair*/
Lista ligada 74

novo->prox = NULL; /*Como esta deve ser a primeira funo a


ser executada, esta clula vazia aponta para NULL*/

aux= novo; /*Para retornar o aux com o endereo da clula vazia,


deve ser corrigido o valor do mesmo*/

return (aux); /*Retorna o aux*/

Um exemplo da sua utilizao no main seria:

int main(void){
No * raiz;

/*raiz = (No *) malloc( sizeof(No) ); */


raiz = cria_lista();
/* Depois comea o seu uso: Insero, Remoo, etc...*/
return EXIT_SUCCESS;
}

Como raiz est sendo passada como parmetro na funo cria_lista() e em outras funes, preciso alocar memria
para raiz de modo que seja possvel realizar as operaes no ponteiro que interage com raiz dentro das funes.

No incio
No * inserirNoInicio(No * raiz, int numero){
No * novo, *aux;
aux = raiz;
novo = (No *) malloc( sizeof(No) );
if(novo == NULL) exit(0);
novo->numero = numero;
novo->prox = aux->prox;
aux->prox = novo;
return(aux);
}

No fim
void inserirNoFim(struct No **raiz, int numero){
No *novo;
novo = (No *) malloc(sizeof(No));
if(novo == NULL) exit(0);
novo->numero = numero;
novo->prox = NULL;

if(*raiz == NULL){
*raiz = novo;
}else{
No *aux;
Lista ligada 75

aux = *raiz;
while(aux->prox != NULL){
aux = aux->prox;
}
aux->prox = novo;
}
}

Remoo

No incio
void removerNoInicio(No *raiz){
No *aux;
if(raiz == NULL)
printf("\nA lista ja esta vazia");
else{
aux = raiz->prox;
raiz->prox = aux->prox;
free(aux);
}
}

No fim
void removerNoFim(struct No **raiz){
if(*raiz == NULL)
printf("\nA lista ja esta vazia");
else{
struct No *auxFrente, *auxTras=NULL;
auxFrente = *raiz;
while(auxFrente->prox != NULL){
auxTras = auxFrente;
auxFrente = auxFrente->prox;
}

if(auxTras != NULL)
auxTras->prox = NULL;

free(auxFrente);
}
}

Exemplo de um Cdigo feito para um dicionrio de palavras em linguagem de programao C:

struct dic{
char *original;
char *complementar;
struct dic *prox;
};
Lista ligada 76

struct dic* ini=NULL;


struct dic* last=NULL;''

//adicionar um novo dic nossa lista


void dic_add(char *original, char *complementar){

//se last igual a Null quer dizer que a lista est vazia
if (last == NULL){
// o elemento ser o primeiro
last = (struct dic*)malloc(sizeof(struct dic));
(*last).original = original;
(*last).complementar = complementar;
// Definio da cabea da fila
ini = last;
} else {
// o elemento ser o ltimo
(*last).prox = (struct dic*)malloc(sizeof(struct dic));
last = (*last).prox;
(*last).original = original;
(*last).complementar = complementar;
}
}

//Percorrer e Imprimir a lista ligada


void dic_print(){
int sair = 0;
struct dic* act = ini;

do {
if (act == last)
sair = 1;
printf("----------------------------------------------\n");
printf("original: %s\n",(*act).original);
printf("complementar: %s\n",(*act).complementar);
printf("prox: %d\n", (*act).prox);
act = (*act).prox;
} while(sair == 0);
printf("----------------------------------------------");
}
Lista ligada 77

Exemplo em C++
Pode-se utilizar tambm uma sintaxe de classe, atribuindo esses mtodos, da linguagem de programao C++. Aqui,
foram criadas duas classes: Node (n) e List (lista). Os mtodos criados foram os seguintes: adicionar, excluir,
buscar e imprimir.

#include <iostream>
using namespace std;

class Node {
public:
int value; // Pode ser implementado qualquer tipo de dados
aqui.
Node *next;
Node () {
next = NULL; // Construtor padro
}
Node (int _value) { // Construtor para o caso de haver j um
valor a ser atribudo
value = _value;
next = NULL;
}
};

class List {
public:
Node *head; // A "cabea" um ponteiro para o primeiro
elemento da lista.
List () { // Construtor padro; nico
head = NULL;
}

void push_back (int x) { // Mtodo para adicionar um elemento


novo ao final da lista.
Node *novo = new Node;
novo->value = x;
if (head == NULL)
head = novo;
else {
Node *onde = head;
while (onde->next)
onde = onde->next;
onde->next = novo;
}
}

void imprime(){ // Mtodo para imprimir, na sada padro, todos


os elementos na tela;
Lista ligada 78

Node* temp = head;


while (temp) {
cout << temp->value << endl;
temp = temp->next;
}
return;
}

bool find (int x) { // Mtodo de busca de um elemento na lista


Node *pointer = new Node;
if (!head)
return false;
pointer = head;
for (; pointer; pointer = pointer->next)
if (pointer->value == x)
return true;
return false;
}

bool deletar (int x) { // Mtodo de excluso de um elemento da


lista, nesse caso, eliminando todos os elementos equivalentes a "x"
Node *pointer = new Node;
if (!find(x))
return false;
while (head->value == x)
head = head->next;
if (!head)
return false;
pointer = head;
while (pointer) {
if (pointer->next)
if (pointer->next->value == x)
pointer->next = pointer->next->next;
pointer = pointer->next;
}
return true;
}

};

Exemplo em Java
Exemplo de um Cdigo feito para um dicionrio de palavras em linguagem de programao Java:

class No
{
Object elemento;
No prox;
Lista ligada 79

No (Object elem){
elemento = elem;
prox = null;
}
}

public class ListaLigada


{
private No primeiro, ultimo;
private int nroNos;

ListaLigada ()
{
primeiro = null;
ultimo = null;
nroNos = 0;
}

public boolean isVazia() {


return (primeiro == null && ultimo == null);
}

public void addInicio(Object o) {


nroNos++;
No novoNo = new No(o);
if (isVazia())
ultimo = novoNo;
else
novoNo.prox = primeiro;
primeiro = novoNo;
}

public void addFinal(Object o) {


nroNos++;
No novoNo = new No(o);
if (isVazia())
primeiro = novoNo;
else
ultimo.prox = novoNo;
ultimo = novoNo;
}

public int getNroNos() {


return nroNos;
}
Lista ligada 80

/*
* @param posicao
* posio contada a partir do zero como
primeiro elemento
*/
public void addMeio(Object o, int posicao) {
nroNos++;
No novoNo = new No(o);
if(posicao <= 1) {
addInicio(novoNo);
return;
}
if (posicao > nroNos) { //Outra abordagem seria lanar
exceo para posio invlida (>nroNos+1)
addFinal(novoNo);
return;
}
No noTemp = primeiro.prox;
for(int posAux=1;posAux<posicao;posAux++)
noTemp = noTemp.prox;
novoNo.prox = (noTemp.prox).prox;
noTemp.prox = novoNo;
}

public void Remover(Object elemento)


{
No noTemp = primeiro;
No noAnt = null;

if (primeiro.elemento.equals(elemento)) {
primeiro = primeiro.prox;
nroNos--;
}
else {
while (noTemp !=null &&
!noTemp.elemento.equals(elemento)) {
noAnt = noTemp;
noTemp = noTemp.prox;
}
if(noTemp != null) {
noAnt.prox = noTemp.prox;
nroNos--;
}
if(noTemp == ultimo) {
ultimo = noAnt;
}
}
Lista ligada 81

public Object BuscarElemento (Object elemento)


{
int i = 1;
No noTemp = primeiro;

while (noTemp !=null) {


if(noTemp.elemento.equals(elemento)) {
return noTemp;
}
i = i +1;
noTemp = noTemp.prox;
}
return null;
}
}

Complexidade computacional
A teoria da complexidade computacional um ramo da teoria da computao em cincia da computao terica e
matemtica que se concentra em classificar problemas computacionais de acordo com sua dificuldade inerente, e
relacionar essas classes entre si. Neste contexto, um problema computacional entendido como uma tarefa que , em
princpio, passvel de ser resolvida por um computador (o que basicamente significa que o problema pode ser
descrito por um conjunto de instrues matemticas). Informalmente, um problema computacional consiste de
instncias do problema e solues para essas instncias do problema. Por exemplo, o teste de primalidade o
problema de determinar se um dado nmero primo ou no. As instncias deste problema so nmeros naturais, e a
soluo para uma instncia sim ou no, dependendo se o nmero primo ou no.
Um problema considerado como inerentemente difcil se a sua soluo requer recursos significativos, qualquer que
seja o algoritmo usado. A teoria formaliza esta intuio atravs da introduo de modelos matemticos de
computao para estudar estes problemas e quantificar os recursos necessrios para resolv-los, tais como tempo e
armazenamento. Outras medidas de complexidade tambm so utilizadas, tais como a quantidade de comunicao
(usada em complexidade de comunicao), o nmero de portas em um circuito (usado na complexidade de circuito)
e o nmero de processadores (usados em computao paralela). Um dos papis da teoria da complexidade
computacional determinar os limites prticos do que os computadores podem e no podem fazer.
Campos intimamente relacionados com a cincia da computao terica so a anlise de algoritmos e a teoria da
computabilidade. Uma distino chave entre a anlise de algoritmos e teoria da complexidade computacional que a
primeira dedicada a analisar a quantidade de recursos necessrios para um determinado algoritmo resolver um
problema, enquanto o segundo faz uma pergunta mais geral sobre todos os possveis algoritmos que podem ser
usados para resolver o mesmo problema. Mais precisamente, ele tenta classificar os problemas que podem ou no
podem ser resolvidos com os recursos devidamente restritos. Por sua vez, impondo restries sobre os recursos
disponveis o que distingue a complexidade computacional da teoria da computabilidade: a segunda pergunta que
tipos de problemas podem, em princpio, ser resolvidos atravs de algoritmos.
Complexidade computacional 82

Problemas Computacionais

Instncias de Problema
Um problema computacional pode ser visto como uma coleo
infinita de instncias em conjunto com uma soluo para cada
instncia. A sequncia de entrada para um problema
computacional referido como uma instncia do problema, e no
deve ser confundido com o problema em si. Na teoria da
complexidade computacional, um problema se refere questo
abstrata para ser resolvido. Em contraste, uma instncia deste
problema uma expresso concreta, que pode servir como entrada
para um problema de deciso. Por exemplo, considere o problema
de teste de primalidade. A instncia um nmero (por exemplo,
15) e a soluo "sim" se o nmero primo e "no" se for o
contrrio (neste caso "no"). Alternativamente, a instncia uma
entrada especial para o problema, e a soluo a sada Um caminho timo para o cacheiro viajante passando
pelas 15 maiores cidades da Alemanha. o menor
correspondente entrada. [1]
caminho entre as 43.589.145.600 possibilidades de
se visitar cada cidade exatamente uma nica vez.
Para realar ainda mais a diferena entre um problema e uma
instncia, considere a seguinte instncia da verso de deciso do
problema do caixeiro viajante: Existe um percurso de, no mximo, 2000km de comprimento passando por todas as
15 maiores cidades da Alemanha? A resposta a esta determinada instncia do problema de pouca utilidade para a
resoluo de outras instncias do problema, como pedir uma ida e volta atravs de todos os lugares de Milo cujo
comprimento total no mximo 10km. Por esta razo, a teoria da complexidade aborda problemas computacionais e
no instncias particulares do problema.

Representando instncias de problema


Ao considerar problemas computacionais, uma instncia de problema uma cadeia sobre um alfabeto. Normalmente,
o alfabeto considerado como sendo o alfabeto binrio (ou seja, o conjunto {0,1}), e, assim, as cadeias so
bitstrings. Como em um computador do mundo real, objetos matemticos que no so bitstrings devem ser
devidamente codificados. Por exemplo, nmeros inteiros podem ser representados em notao binria, e grafos
podem ser codificados diretamente via suas matrizes de adjacncia, ou por codificao de suas listas de adjacncia
em binrio.
Apesar de algumas provas de complexidade-terica de teoremas regularmente assumir alguma escolha concreta de
codificao de entrada, tenta-se manter a discusso abstrata o suficiente para ser independente da escolha da
codificao. Isto pode ser conseguido assegurando que diferentes representaes possam ser transformadas em outra
de forma eficiente.
Complexidade computacional 83

Problemas de deciso como linguagens formais


Problemas de deciso so um dos objetos de estudo centrais na
teoria da complexidade computacional. Um problema de deciso
um tipo especial de problema computacional cuja resposta sim
ou no, ou alternativamente 1 ou 0. Um problema de deciso pode
ser visto como uma linguagem formal, onde os membros da
linguagem so instncias cuja resposta sim, e os no membros da
linguagem so aquelas instncias cuja sada no. O objetivo
decidir, com a ajuda de um algoritmo, se uma dada sequncia de
entrada um membro da linguagem formal em considerao. Se o
algoritmo decidir este problema, ele retorna a resposta sim, diz-se
que o algoritmo aceita a sequncia de entrada, caso contrrio,
diz-se que rejeita a entrada. Um problema de deciso tem apenas duas sadas
possveis, sim ou no (ou alternativamente 1 ou 0) para
Um exemplo de um problema de deciso o seguinte. A entrada qualquer entrada.
um grafo arbitrrio. O problema consiste em decidir se o dado
grafo conexo ou no. A linguagem formal associada a este problema de deciso ento o conjunto de todos os
grafos conexosobviamente, para obter uma definio precisa dessa linguagem, preciso decidir como grafos so
codificados como cadeias binrias.

Problemas de funo
Um problema de funo um problema computacional, onde uma nica sada (de uma funo total) esperada para
cada entrada, mas a sada mais complexa do que a de um problema de deciso, isto , no apenas sim ou no.
Exemplos notveis incluem o problema do caixeiro viajante e o problema de fatorao de inteiros.
tentador pensar que a noo de problemas de funo muito mais rica do que a noo de problemas de deciso.
No entanto, o caso realmente no esse, j que problemas de funo podem ser reformulados como problemas de
deciso. Por exemplo, a multiplicao de dois nmeros inteiros pode ser expressa como o conjunto (a,b,c) tal qual a
relao ab=c descreve. Decidir se uma dada tripla membro deste conjunto corresponde a resolver o problema
da multiplicao de dois nmeros.

Medio do tamanho de uma instncia


Para medir a dificuldade de resolver um problema computacional, pode-se desejar ver quanto tempo o melhor
algoritmo necessita para resolver o problema. No entanto, o tempo de execuo pode, em geral, depender da
instncia. Em particular, instncias maiores exigiro mais tempo para resolver. Assim, o tempo necessrio para
resolver um problema (ou o espao necessrio, ou qualquer outra medida de complexidade) calculado em funo
do tamanho da instncia. Isso geralmente leva em considerao o tamanho da entrada em bits. A Teoria da
Complexidade est interessada em como os de algoritmos crescem com um aumento no tamanho da entrada. Por
exemplo, no problema de descobrir se um grafo conectado, quanto tempo a mais leva para resolver um problema
para um grafo com 2n vrtices comparado ao tempo levado para um grafo com n vrtices?
Se o tamanho da entrada n, o tempo gasto pode ser expresso como uma funo de n. J que o tempo gasto em
diferentes entradas de mesmo tamanho pode ser diferente, o pior caso em complexidade de tempo T(n) definido
como sendo o tempo mximo dentre todas as entradas de tamanho n. Se T(n) um polinmio em n, ento o
algoritmo dito ser um algoritmo de tempo polinomial. A tese de Cobham diz que um problema pode ser resolvido
com uma quantidade factvel de recursos se ele admite um algoritmo de tempo polinomial.
Complexidade computacional 84

Modelos de mquinas e medidas de complexidade

Mquina de Turing
Uma mquina de Turing um modelo matemtico de uma mquina de
computao em geral. um dispositivo terico que manipula smbolos
contidos em uma tira de fita. Mquinas de Turing no pretendem ser
uma tecnologia de computao na prtica, mas sim uma experincia de
pensamento que representa uma mquina de computao. Acredita-se
que se um problema pode ser resolvido por um algoritmo, ento existe
uma mquina de Turing que resolve o problema. Na verdade, esta a
Uma representao artstica de uma mquina de
afirmao da tese de Church-Turing. Alm disso, sabe-se que tudo o
Turing
que pode ser computado em outros modelos de computao conhecido
por ns hoje, como uma mquina RAM, Jogo da Vida de Conway,
autmato celular ou qualquer linguagem de programao pode ser computado em uma mquina de Turing. Como as
mquinas de Turing so fceis de analisar matematicamente, e acredita-se que sejam to poderosas quanto qualquer
outro modelo de computao, a mquina de Turing o modelo mais comumente usado em teoria da complexidade.

Muitos tipos de mquinas de Turing so usados para definir as classes de complexidade, tais como mquinas de
Turing determinsticas, mquinas de Turing probabilsticas, mquinas de Turing no-determinsticas, mquinas de
Turing qunticas, mquinas de Turing simtricas e mquinas de Turing alternadas. Todas elas so igualmente
poderosas, em princpio, mas quando os recursos (tais como tempo e espao) so limitados, algumas destas podem
ser mais poderosas do que outras.
Uma mquina de Turing determinstica a mquina de Turing do tipo mais bsico, que utiliza um conjunto fixo de
regras para determinar suas aes futuras. Uma mquina de Turing probabilstica uma mquina de Turing
determinstica com um suprimento extra de bits aleatrios. A capacidade de tomar decises probabilsticas muitas
vezes ajuda algoritmos a resolverem problemas de forma mais eficiente. Algoritmos que usam bits aleatrios so
chamados algoritmos probabilsticos. A mquina de Turing no-determinstica uma mquina de Turing
determinstica com uma caracterstica adicional de no-determinismo, que permite que uma mquina de Turing tenha
vrias possveis aes futuras a partir de um determinado estado. Uma maneira de entender o no-determinismo
visualizar os ramos da mquina de Turing como os vrios caminhos computacionais possveis a cada passo, e se ela
resolve o problema em qualquer um desses ramos, diz-se ter resolvido o problema. Evidentemente, este modelo no
pretende ser um modelo fisicamente realizvel, apenas uma mquina abstrata teoricamente interessante que d
origem a classes de complexidade particularmente interessantes. Por exemplo, veja algoritmo no-determinstico.

Outros modelos de mquinas


Muitos modelos de mquinas diferentes do padro de mquinas de Turing multi-fitas tm sido propostos na
literatura, por exemplo, mquinas de acesso aleatrio. Talvez surpreendentemente, cada um desses modelos pode ser
convertido para outro, sem fornecer qualquer poder computacional extra. O consumo de tempo e memria desses
modelos alternativos pode variar.[2] O que todos estes modelos tm em comum que as mquinas funcionam de
forma determinstica.
No entanto, alguns problemas computacionais so mais fceis de analisar em termos de recursos mais incomuns. Por
exemplo, uma mquina de Turing no-determinstica um modelo computacional em que permitido ramificar-se
para verificar muitas possibilidades diferentes de uma s vez. A mquina de Turing no-determinstica tem muito
pouco a ver com a forma como ns queremos fisicamente computar algoritmos, mas a sua ramificao capta
exatamente muitos dos modelos matemticos que queremos analisar, de modo que o tempo no-determinstico um
recurso muito importante na anlise de problemas computacionais.
Complexidade computacional 85

Medidas de complexidade
Para uma definio precisa do que significa resolver um problema utilizando uma determinada quantidade de tempo
e espao, um modelo computacional tal como a mquina de Turing determinstica utilizado. O tempo exigido por
uma mquina de Turing determinstica M na entrada x o nmero total de transies de estado, ou etapas, que a
mquina faz antes de parar e responder com a sada ("sim" ou "no"). Diz-se que a mquina de Turing M opera
dentro do tempo f(n), se o tempo exigido por M em cada entrada de comprimento n no mximo f(n). Um problema
de deciso A pode ser resolvido em tempo f(n) se existe uma operao da mquina de Turing em tempo f(n) que
resolve o problema. Como a teoria da complexidade est interessada em classificar problemas com base na sua
dificuldade, definem-se conjuntos de problemas com base em alguns critrios. Por exemplo, o conjunto de
problemas solucionveis no tempo f(n) em uma mquina de Turing determinstica ento indicado por DTIME(f(n)).
Definies anlogas podem ser feitas para os requisitos de espao. Embora o tempo e o espao sejam os mais
conhecidos recursos de complexidade, qualquer medida de complexidade pode ser vista como um recurso
computacional. Medidas de complexidade so geralmente definidas pelos axiomas de complexidade de Blum. Outras
medidas de complexidade utilizadas na teoria da complexidade incluem a complexidade de comunicao, a
complexidade do circuito e a complexidade da rvore de deciso.

Melhor, pior e caso mdio de complexidade


O melhor, o pior e o caso mdio de complexidade
referem-se a trs maneiras diferentes de medir a
complexidade de tempo (ou qualquer outra medida de
complexidade) de entradas diferentes do mesmo
tamanho. Uma vez que algumas entradas de tamanho n
podem ser mais rpidas para resolver do que outras,
definimos as seguintes complexidades:

Complexidade no melhor caso: Esta a


complexidade de resolver o problema para a melhor
entrada de tamanho n.
Complexidade no pior caso: Esta a complexidade
de resolver o problema para a pior entrada de
Visualizao do algoritmo quicksort que tem no caso mdio
tamanho n. desempenho .
Complexidade no caso mdio: Esta a
complexidade de resolver o problema na mdia. Essa complexidade s definida com relao a uma distribuio
de probabilidade sobre as entradas. Por exemplo, se todas as entradas do mesmo tamanho so consideradas terem
a mesma probabilidade de aparecer, a complexidade do caso mdio pode ser definida com relao distribuio
uniforme sobre todas as entradas de tamanho n.
Por exemplo, considere o algoritmo de ordenao quicksort. Isso resolve o problema de ordenar uma lista de inteiros
que dada como entrada. O pior caso quando a entrada j est ordenada ou est em ordem inversa, e o algoritmo
leva tempo O(n2) para este caso. Se assumirmos que todas as permutaes possveis da lista de entrada so
igualmente provveis, o tempo mdio necessrio para a ordenao O(n log n). O melhor caso ocorre quando cada
piv divide a lista pela metade, tambm precisando tempo O(n log n).
Complexidade computacional 86

Limites superior e inferior da complexidade dos problemas


Para classificar o tempo de computao (ou recursos semelhantes, como o consumo de espao), necessrio provar
os limites superiores e inferiores sobre a quantidade mnima de tempo exigida pelo algoritmo mais eficiente para
resolver um determinado problema. A complexidade de um algoritmo geralmente entendida como a sua
complexidade de pior caso, a menos que seja especificado o contrrio. A anlise de um determinado algoritmo cai
sob o campo de anlise de algoritmos. Para mostrar um limite superior T(n) sobre a complexidade de tempo de um
problema, necessrio mostrar apenas que h um determinado algoritmo com tempo de funcionamento, no mximo,
T(n). No entanto, provar limites inferiores muito mais difcil, uma vez que limites inferiores fazem uma declarao
sobre todos os possveis algoritmos que resolvem um determinado problema. A frase "todos os algoritmos possveis"
inclui no apenas os algoritmos conhecidos hoje, mas qualquer algoritmo que possa ser descoberto no futuro. Para
mostrar um limite inferior de T(n) para um problema requer mostrar que nenhum algoritmo pode ter complexidade
de tempo menor do que T(n).
Limites superiores e inferiores so geralmente indicados usando a notao O-grande, que desconsidera fatores
constantes e termos menores. Isso faz com que os limites independam dos detalhes especficos do modelo
computacional utilizado. Por exemplo, T(n)=7n2+15n+40, em notao O-grande seria escrito da seguinte forma
T(n)=O(n2).

Classes de complexidade

Definio de classes de complexidade


Uma classe de complexidade um conjunto de problemas de complexidade relacionados. As classes mais simples
de complexidade so definidas pelos seguintes fatores:
O tipo de problema computacional: Os problemas mais comumente utilizados so problemas de deciso. No
entanto, classes de complexidade podem ser definidas com base em problemas de funo, problemas de
contagem, problemas de otimizao, problemas de promessa, etc.
O modelo de computao: O modelo mais comum de computao a mquina de Turing determinstica, mas
muitas classes de complexidade so baseadas em mquinas de Turing no-determinsticas, circuitos Booleanos,
mquinas de Turing qunticas, circuitos montonos, etc.
O recurso (ou recursos) que est sendo limitado e os limites: Essas duas propriedades so geralmente declaradas
em conjunto, tais como "tempo polinomial", "espao logartmico", "profundidade constante", etc.
claro, algumas classes de complexidade tm definies complexas que no se encaixam nesse quadro. Assim, uma
classe de complexidade tpica tem uma definio como a seguinte:
O conjunto de problemas de deciso solveis por uma mquina de Turing determinstica dentro do tempo f(n).
(Esta classe de complexidade conhecida como DTIME(f(n))).
Mas limitar o tempo de computao acima por alguma funo concreta f(n) muitas vezes produz classes de
complexidade que dependem do modelo da mquina escolhida. Por exemplo, a linguagem {xx | x uma sequncia
binria qualquer} pode ser resolvida em tempo linear em uma mquina de Turing multi-fitas, mas necessariamente
exige tempo quadrtico no modelo de mquinas de Turing single-fita. Se permitirmos variaes no tempo polinomial
em execuo, a tese de Cobham-Edmonds afirma que "as complexidades do tempo em quaisquer dois modelos
razoveis e gerais de computao so polinomialmente relacionados" (Goldreich 2008, Chapter 1.2). Isto forma a
base para a classe de complexidade P, que o conjunto de problemas de deciso solveis por uma mquina de
Turing determinstica dentro do tempo polinomial. O conjunto correspondente de problemas de funo FP.
Complexidade computacional 87

Importantes classes de complexidade


Muitas classes de complexidade importantes
podem ser definidas por limitando o tempo
ou espao usado pelo algoritmo. Algumas
importantes classes de complexidade de
problemas de deciso definidas desta
maneira so as seguintes:

Uma representao da relao entre as classes de complexidade

Classe de complexidade Modelo de computao Limitao de recursos

DTIME(f(n)) Mquina de Turing Determinstica Tempo f(n)

P Mquina de Turing Determinstica Tempo poly(n)

EXPTIME Mquina de Turing Determinstica Tempo 2poly(n)

NTIME(f(n)) Mquina de Turing No-Determinstica Tempo f(n)

NP Mquina de Turing No-Determinstica Time poly(n)

NEXPTIME Mquina de Turing No-Determinstica Tempo 2poly(n)

DSPACE(f(n)) Mquina de Turing Determinstica Espao f(n)

L Mquina de Turing Determinstica Espao O(log n)

PSPACE Mquina de Turing Determinstica Espao poly(n)

EXPSPACE Mquina de Turing Determinstica Espao 2poly(n)

NSPACE(f(n)) Mquina de Turing No-Determinstica Espao f(n)

NL Mquina de Turing No-Determinstica Espao O(log n)

NPSPACE Mquina de Turing No-Determinstica Espao poly(n)

NEXPSPACE Mquina de Turing No-Determinstica Espao 2poly(n)

Acontece que PSPACE = NPSPACE e EXPSPACE = NEXPSPACE pelo teorema de Savitch.


Outras classes de complexidade importantes incluem BPP, ZPP e RP, que so definidas usando mquinas de Turing
probabilstica; AC e NC, que so definidas usando circuitos booleanos e BQP e QMA, que so definidas usando
mquinas de Turing qunticas. #P uma importante classe complexidade de problemas de contagem (que no so
problemas de deciso). Classes como IP e AM so definidas usando sistemas de prova interativa. ALL a classe de
todos os problemas de deciso.
Complexidade computacional 88

Teoremas de hierarquia
Para as classes de complexidade definidas desta forma, desejvel provar que relaxar os requisitos em funo
(digamos) do tempo de computao realmente define um conjunto maior de problemas. Em particular, embora
DTIME(n) esteja contido em DTIME(n2), seria interessante saber se a incluso estrita. Para requisitos de tempo e
de espao, a resposta a tais perguntas dada pelo teorema de hierarquia para a complexidade de tempo e pelo
teorema de hierarquia para a complexidade de espao, respectivamente. Eles so chamados teoremas de hierarquia
porque induzem uma hierarquia adequada sobre as classes definidas, restringindo os respectivos recursos. Assim,
existem pares de classes de complexidade tal que uma est propriamente contida na outra. Depois de ter deduzido
assim as relaes de pertinncia estrita de conjuntos, podemos continuar a fazer declaraes quantitativas sobre
quanto mais tempo adicional ou espao necessrio para aumentar o nmero de problemas que podem ser
resolvidos.
Mais precisamente, o teorema de hierarquia de tempo afirma que:

.
O teorema de hierarquia de espao afirma que:

.
Os teoremas de hierarquia de tempo e de espao formam a base para a maioria dos resultados de separao de classes
de complexidade. Por exemplo, o teorema da hierarquia de tempo nos diz que P est estritamente contida em
EXPTIME, e o teorema hierarquia do espao nos diz que L est estritamente contida em PSPACE.

Reduo
Muitas classes de complexidade so definidas usando o conceito de reduo. Uma reduo uma transformao de
um problema em outro problema. Ela captura a noo informal de um problema que seja pelo menos to difcil
quanto outro problema. Por exemplo, se um problema X pode ser resolvido usando um algoritmo para Y, X no
mais difcil do que Y, e dizemos que X se reduz a Y. Existem muitos tipos diferentes de reduo, com base no mtodo
de reduo, como redues de Cook, redues de Karp e redues Levin, e no limite da complexidade das redues,
como redues de tempo polinomial ou redues log-space.
A reduo mais comumente usada uma reduo em tempo polinomial. Isso significa que o processo de reduo
leva tempo polinomial. Por exemplo, o problema do quadrado de um inteiro pode ser reduzido para o problema da
multiplicao de dois nmeros inteiros. Isso significa que um algoritmo para multiplicar dois inteiros pode ser usado
para o quadrado de um inteiro. De fato, isso pode ser feito dando a mesma entrada para ambas as entradas do
algoritmo de multiplicao. Assim, vemos que o problema do quadrado de um inteiro no mais difcil do que o
problema da multiplicao, j que o problema do quadrado de um inteiro pode ser reduzido ao problema da
multiplicao.
Isso motiva o conceito de um problema que ser difcil para uma classe de complexidade. Um problema X difcil
para uma classe de problemas C se todo problema em C pode ser reduzido a X. Assim, nenhum problema em C
mais difcil do que X, uma vez que um algoritmo para X nos permite resolver qualquer problema em C. claro que a
noo de problemas difceis depende do tipo de reduo a ser utilizado. Para as classes de complexidade maiores do
que P, redues em tempo polinomial so comumente usados. Em particular, o conjunto de problemas que so
difceis para NP o conjunto de problemas NP-difcil.
Se um problema X est em C e difcil para C, ento diz-se que X completo para C. Isto significa que X o
problema mais difcil em C. (Uma vez que muitos problemas poderiam ser igualmente difceis, pode-se dizer que X
um dos os problemas mais difceis em C.) Assim, a classe de problemas NP-completo contm os problemas mais
difceis em NP, nesse sentido eles so os mais propensos a no estarem em P. Como o problema P=NP no foi
resolvido, ser capaz de reduzir um conhecido problema NP-completo, 2, para outro problema, 1, indicaria que no
h nenhuma soluo conhecida em tempo polinomial para 1. Isso ocorre porque uma soluo em tempo polinomial
Complexidade computacional 89

para 1 renderia uma soluo em tempo polinomial para 2. Da mesma forma que todos os problemas NP podem ser
reduzidos ao conjunto, encontrar um problema NP-completo que pudesse ser resolvido em tempo polinomial
significaria que P=NP.[3]

Importantes problemas em aberto

O problema P versus NP
A classe de complexidade P muitas vezes vista como
uma abstrao matemtica de modelagem dessas
tarefas computacionais que admitem um algoritmo
eficiente. Esta hiptese chamada de tese de
Cobham-Edmonds. A classe de complexidade NP, por
outro lado, contm muitos problemas que as pessoas
gostariam de resolver de forma eficiente, mas para os
quais nenhum algoritmo eficiente conhecido, como o
problema da satisfatibilidade booleana, o problema do Diagrama de classes de complexidade assumindo que PNP. A
caminho hamiltoniano e o problema da cobertura de existncia de problemas em NP fora tanto de P quanto de
[]
vrtices. Como as mquinas de Turing determinstica NP-completo, neste caso, foi estabelecida por Ladner.

so mquinas de Turing no-determinsticas especiais,


fcil observar que cada problema em P tambm membro da classe NP.

A questo de saber se P igual a NP uma das questes mais importantes em aberto na cincia da computao
terica por causa da gama de implicaes de uma soluo.[3] Se a resposta for sim, para muitos problemas
importantes pode ser mostrado que h solues mais eficientes para eles. Estes incluem vrios tipos de problemas de
programao inteira em investigao operacional, muitos problemas na rea de logstica, previso da estrutura de
protenas na biologia,[4] e capacidade de encontrar provas formais de teoremas da matemtica pura.[5] O problema P
versus NP um dos Problemas do Prmio Millenium (Millenium Prize Problems) proposto pelo Instituto Clay de
Matemtica (Clay Mathematics Institute). Existe um prmio de um milho de dlares para resolver o problema.[6]

Problemas em NP que no se sabe se pertencem a P ou a NP-completo


Foi mostrado por Ladner que, se P NP, ento existem problemas em NP que no esto nem em P nem em
NP-completo.[] Tais problemas so chamados de problemas NP-intermedirio. O problema do isomorfismo de
grafos, o problema do logaritmo discreto e o problema de fatorao de inteiros so exemplos de problemas que
acredita-se que sejam NP-intermedirio. Eles so alguns dos muito poucos problemas NP que no se sabe se esto
em P ou em NP-completo.
O problema do isomorfismo de grafos o problema computacional para determinar se dois grafos finitos so
isomorfos. Um importante problema no resolvido na teoria da complexidade se o problema do isomorfismo de
grafos est em P, NP-completo, ou NP-intermedirio. A resposta no conhecida, mas acredita-se que o problema
no seja, pelo menos, NP-completo.[] Se o isomorfismo de grafos for NP-completo, a hierarquia de tempo polinomial
colapsa para seu segundo nvel.[7] Uma vez que acredita-se veemente que a hierarquia polinomial no colapse para
nenhum nvel finito, acredita-se que o isomorfismo de grafos no seja NP-completo. O melhor algoritmo para este
problema, de acordo com Laszlo Babai e Eugene Luks tem tempo de execuo 2O((n log(n))) para grafos com n
vrtices.
O problema da fatorao de inteiros o problema computacional para determinar a fatorao prima de um dado
inteiro. Formulado como um problema de deciso, o problema para decidir se a entrada tem um fator menor que k.
Nenhum algoritmo de fatorao de inteiro eficiente conhecido, e este fato a base de vrios sistemas criptogrficos
Complexidade computacional 90

modernos, como o algoritmo RSA. O problema da fatorao de inteiros est em NP e em co-NP (e at mesmo em
UP e co-UP [8]). Se o problema NP-completo, a hierarquia de tempo polinomial colapsar para seu primeiro nvel
(ou seja, NP ser igual a co-NP). O melhor algoritmo conhecido para fatorao de inteiros o GNFS (general
number field sieve), que leva tempo O(e(64/9)1/3(n.log 2)1/3(log (n.log 2))2/3) para fatorar um inteiro de n-bit. No
entanto, o melhor algoritmo quntico conhecido para este problema, o algoritmo de Shor, executado em tempo
polinomial. Infelizmente, este fato no diz muito sobre onde est o problema com relao a classes de complexidade
no-quntica.

Separaes entre outras classes de complexidade


Muitas classes de complexidade conhecidas so suspeitas de no serem iguais, mas isso no foi provado. Por
exemplo, P NP PP PSPACE, mas possvel que P = PSPACE. Se P no for igual a NP, ento P no ser
igual PSPACE tambm. Uma vez que existem muitas classes de complexidade conhecidas entre P e PSPACE, tais
como RP, BPP, PP, BQP, MA, PH, etc, possvel que todas estas classes de complexidade colapsem para uma
nica classe. Provar que qualquer uma destas classes no so iguais seria um grande avano na teoria da
complexidade.
Na mesma linha, co-NP a classe que contm os problemas do complemento (ou seja, problemas com as respostas
sim / no invertidsa) dos problemas NP. Acredita-se [9] que NP no seja igual a co-NP, no entanto, ainda no foi
comprovado. Tem sido mostrado que, se essas duas classes de complexidade no so iguais, ento P no igual a
NP.
Da mesma forma, no se sabe se L (o conjunto de todos os problemas que podem ser resolvidos no espao
logartmico) est contido estritamente em P ou igual a P. Novamente, existem muitas classes de complexidade
entre elas, tais como NL e NC, e no se sabe se elas so classes iguais ou distintas.
Suspeita-se que P e BPP sejam iguais. No entanto, um problema em aberto, no momento, se BPP = NEXP.

Intratabilidade
Problemas que podem ser resolvidos na teoria (por exemplo, dado um tempo infinito), mas que na prtica levam
muito tempo para as suas solues sejam teis, so conhecidos como problemas intratveis.[10] Na teoria da
complexidade, os problemas que no apresentam solues em tempo polinomial so considerados intratveis por
mais pequenas que sejam suas entradas. Na verdade, a tese de Cobham-Edmonds afirma que apenas os problemas
que podem ser resolvidos em tempo polinomial podem ser computados de maneira factvel por algum dispositivo
computacional. Problemas que so conhecidos por serem intratveis neste sentido incluem aqueles que so
EXPTIME-difcil. Se NP no o mesmo que P, ento os problemas NP-completo so tambm intratveis neste
sentido. Para ver porque algoritmos de tempo exponencial podem ser impraticveis, considere um programa que faz
2n operaes antes de parar. Para n pequeno, digamos 100, e assumindo, por exemplo, que o computador faz 1012
operaes por segundo, o programa seria executado por cerca de 41010 anos, que aproximadamente a idade do
universo. Mesmo com um computador muito mais rpido, o programa s seria til para casos muito pequenos e,
nesse sentido, a intratabilidade de um problema um tanto independente do progresso tecnolgico. No entanto, um
algoritmo de tempo polinomial no sempre prtico. Se seu tempo de execuo , digamos n15, no razovel
consider-lo eficiente e ainda intil, salvo em casos de pequeno porte.
O que intratabilidade significa na prtica est aberto em debate. Dizer que um problema no est em P no implica
que todos os grandes casos de problemas so difceis ou at mesmo que a maioria deles so. Por exemplo, o
problema da deciso na Aritmtica de Presburger tem demonstrado no estar em P, ainda foram escritos algoritmos
que resolvem o problema em tempos razoveis na maioria dos casos. Da mesma forma, os algoritmos podem
resolver o problema da mochila NP-completo em uma ampla faixa de tamanhos em menos que o tempo quadrtico e
resolvedores de SAT rotineiramente lidam com grandes instncias do problema de satisfatibilidade booleana
NP-completo.
Complexidade computacional 91

Teoria da complexidade contnua


A teoria da complexidade contnua pode se referir teoria da complexidade dos problemas que envolvem funes
contnuas que so aproximadas por discretizaes, como estudado em anlise numrica. Uma abordagem para a
teoria da complexidade da anlise numrica [11] a complexidade baseada em informao (IBC).
A teoria da complexidade contnua tambm pode se referir teoria da complexidade do uso da computao
analgica, que utiliza sistemas dinmicos contnuos e equaes diferenciais.[12] A teoria de controle pode ser
considerada uma forma de computao e equaes diferenciais so usadas na modelagem de sistemas de tempo
contnuo e hbridos de tempo discreto-contnuo.[13]

Histria
Antes de a pesquisa propriamente dita explicitamente dedicada complexidade dos problemas algortmicos comear,
os numerosos fundamentos foram estabelecidos por vrios pesquisadores. O mais influente entre estes foi a definio
das mquinas de Turing por Alan Turing em 1936, que acabou por ser uma noo muito robusta e flexvel de
computador.
Fortnow & Homer (2003) datam o incio dos estudos sistemticos em complexidade computacional com o
importante artigo "On the Computational Complexity of Algorithms" de Juris Hartmanis e Richard Stearns (1965),
que estabeleceu as definies de complexidade de tempo e de espao e provou os teoremas de hierarquia.
De acordo com Fortnow & Homer (2003), trabalhos anteriores que estudaram problemas solucionveis por mquinas
de Turing com recursos especficos limitados inclui a definio de John Myhill de autmatos linearmente limitados
(Myhill 1960), o estudo de Raymond Smullyan sobre conjuntos rudimentares (1961), assim como o artigo de Hisao
Yamada [14] sobre computao em tempo real (1962). Um pouco mais cedo, Boris Trakhtenbrot (1956), um pioneiro
no campo da URSS, estudou outra medida especfica de complexidade.[15] Como lembra ele:

Contudo, [meu] interesse inicial [na teoria dos autmatos] era cada vez mais posto de lado From Logic to Theoretical
em detrimento complexidade computacional, uma excitante fuso de mtodos Computer Science An
combinatoriais, herdada da teoria da comutao, com o arsenal conceitual da teoria de Update. In: Pillars of
algoritmos. Essas ideias me ocorreram antes, em 1955, quando eu cunhei o termo "funo Computer Science, LNCS
de sinalizao", que hoje comumente conhecido como "medida de complexidade". 4800, Springer 2008.
Boris Trakhtenbrot

Em 1967, Manuel Blum desenvolveu uma teoria da complexidade axiomtica com base em seus axiomas e provou
um resultado importante, o ento chamado, teorema da acelerao de Blum (speed-up theorem). O campo realmente
comeou a florescer quando o pesquisador norte-americano Stephen Cook e, trabalhando independentemente,
Leonid Levin na URSS, provaram que existem importantes problemas praticveis que so NP-completos. Em 1972,
Richard Karp partiu desta ideia e deu um salto frente com seu artigo histrico, "Reducibility Among Combinatorial
Problems", no qual ele mostrou que 21 diferentes problemas de combinatria e problemas tericos de grafos,
famosos por sua intratabilidade computacional, so NP-completos.[16]
Complexidade computacional 92

Veja tambm

Problemas em aberto da cincia da computao


Categoria:Teoria da computao
Anexo:Lista de termos relacionados aos algoritmos e estruturas de dados

Notas
[1] Escolha uma cidade, e pegue todas as ordenaes possveis das outras 14 cidades. Depois divida por dois, porque no importa em qual
direo pelo tempo elas vm uma aps a outra: 14 / 2 = 43.589.145.600.
[2] Veja
[3] Veja
[7] Uwe Schning, "Graph isomorphism is in the low hierarchy", Proceedings of the 4th Annual Symposium on Theoretical Aspects of Computer
Science, 1987, 114124; also: Journal of Computer and System Sciences, vol. 37 (1988), 312323
[8] Lance Fortnow. Computational Complexity Blog: Complexity Class of the Week: Factoring. September 13, 2002. http:/ / weblog. fortnow.
com/ 2002/ 09/ complexity-class-of-week-factoring. html
[9] Boaz Barak's course on Computational Complexity (http:/ / www. cs. princeton. edu/ courses/ archive/ spr06/ cos522/ ) Lecture 2 (http:/ /
www. cs. princeton. edu/ courses/ archive/ spr06/ cos522/ lec2. pdf)
[10] Hopcroft, J.E., Motwani, R. and Ullman, J.D. (2007) Introduction to Automata Theory, Languages, and Computation, Addison Wesley,
Boston/San Francisco/New York (page 368)
[11] Complexity Theory and Numerical Analysis (http:/ / citeseerx. ist. psu. edu/ viewdoc/ download?doi=10. 1. 1. 33. 4678& rep=rep1&
type=pdf), Steve Smale, Acta Numerica, 1997 - Cambridge Univ Press
[12] A Survey on Continuous Time Computations (http:/ / arxiv. org/ abs/ arxiv:0907. 3117), Olivier Bournez, Manuel Campagnolo, New
Computational Paradigms. Changing Conceptions of What is Computable. (Cooper, S.B. and L{\"o}we, B. and Sorbi, A., Eds.). New York,
Springer-Verlag, pages 383-423. 2008
[13] Computational Techniques for the Verification of Hybrid Systems (http:/ / citeseerx. ist. psu. edu/ viewdoc/ download?doi=10. 1. 1. 70.
4296& rep=rep1& type=pdf), Claire J. Tomlin, Ian Mitchell, Alexandre M. Bayen, Meeko Oishi, Proceedings of the IEEE, Vol. 91, No. 7,
July 2003.
[15] Trakhtenbrot, B.A.: Signalizing functions and tabular operators. Uchionnye Zapiski Penzenskogo Pedinstituta (Transactions of the Penza
Pedagogoical Institute) 4, 7587 (1956) (in Russian)
Complexidade computacional 93

Referncias

Bibliografia
Arora, Sanjeev; Barak, Boaz (2009), Computational Complexity: A Modern Approach (http://www.cs.
princeton.edu/theory/complexity/), Cambridge, ISBN 978-0-521-42426-4
Downey, Rod; Fellows, Michael (1999), Parameterized complexity (http://www.springer.com/sgw/cda/
frontpage/0,11855,5-0-22-1519914-0,00.html?referer=www.springer.de/cgi-bin/search_book.
pl?isbn=0-387-94883-X), Berlin, New York: Springer-Verlag
Du, Ding-Zhu; Ko, Ker-I (2000), Theory of Computational Complexity, John Wiley & Sons, ISBN
978-0-471-34506-0
Goldreich, Oded (2008), Computational Complexity: A Conceptual Perspective (http://www.wisdom.
weizmann.ac.il/~oded/cc-book.html), Cambridge University Press
van Leeuwen, Jan, ed. (1990), Handbook of theoretical computer science (vol. A): algorithms and complexity,
MIT Press, ISBN 978-0-444-88071-0
Papadimitriou, Christos (1994), Computational Complexity (1st ed.), Addison Wesley, ISBN 0201530821
Sipser, Michael (2006), Introduction to the Theory of Computation (2nd ed.), USA: Thomson Course
Technology, ISBN 0534950973
Predefinio:Garey-Johnson

Surveys
Khalil, Hatem; Ulery, Dana (1976), A Review of Current Studies on Complexity of Algorithms for Partial
Differential Equations (http://portal.acm.org/citation.cfm?id=800191.805573), ACM '76 Proceedings of the
1976 Annual Conference, pp.197, doi: 10.1145/800191.805573 (http://dx.doi.org/10.1145/800191.805573)
Cook, Stephen (1983), "An overview of computational complexity", Commun. ACM (ACM) 26 (6): 400408,
doi: 10.1145/358141.358144 (http://dx.doi.org/10.1145/358141.358144), ISSN 0001-0782 (http://worldcat.
org/issn/0001-0782)
Fortnow, Lance; Homer, Steven (2003), "A Short History of Computational Complexity" (http://people.cs.
uchicago.edu/~fortnow/papers/history.pdf), Bulletin of the EATCS 80: 95133
Mertens, Stephan (2002), "Computational Complexity for Physicists", Computing in Science and Engg.
(Piscataway, NJ, USA: IEEE Educational Activities Department) 4 (3): 3147, doi: 10.1109/5992.998639 (http://
dx.doi.org/10.1109/5992.998639), ISSN 1521-9615 (http://worldcat.org/issn/1521-9615)

Ligaes externas
The Complexity Zoo (http://qwiki.stanford.edu/wiki/Complexity_Zoo)
Pascal (linguagem de programao) 94

Pascal (linguagem de programao)


Pascal
Paradigma Abstrao de dados,
Programao estruturada,
Programao procedural

Surgido em 1970, ltima reviso em 2002

Criado por []
Niklaus Wirth

Estilo de tipagem: forte

Compiladores Delphi, Free Pascal, GNU Pascal, MIDletPascal, Palm & Pascal, Turbo Pascal

Dialetos: Macintosh Pascal, Turbo Pascal, UCSD

Influenciada por ALGOL

Influenciou Ada, Component Pascal, Icon, Java, Modula-2, Oberon, Oberon-2, Object Pascal, Oxygene

Pascal uma linguagem de programao estruturada, que recebeu este nome em homenagem ao matemtico Blaise
Pascal. Foi criada em 1970 pelo suo Niklaus Wirth,[] tendo em mente encorajar o uso de cdigo estruturado.
O prprio Niklaus Wirth diz que Pascal foi criada simultaneamente para ensinar programao estruturada e para ser
utilizada em sua fbrica de software. Simultaneamente, a linguagem reflete a liberao pessoal de Wirth das
restries impostas aps seu envolvimento com a especificao de ALGOL 68, e sua sugesto para essa
especificao, o ALGOL W.
Pascal originou uma enorme gama de dialetos, podendo tambm ser considerada uma famlia de linguagens de
programao. Grande parte de seu sucesso se deve a criao, na dcada de 1980, da linguagem Turbo Pascal,
inicialmente disponvel para computadores baseados na na arquitetura 8086 (com verses para 8080 no seu incio).
Pascal normalmente uma das linguagens de escolha para ensinar programao, junto com Scheme, C e Fortran.
Comercialmente, a linguagem foi sucedida pela criao da linguagem Object Pascal, atualmente utilizada nos IDEs
Embarcadero Delphi (Object Pascal), Kylix e Lazarus. Academicamente, seus sucessores so as linguagens
subsequentes de Niklaus Wirth: Modula-2[] e Oberon. A partir da verso 2005, o Delphi passou a se referir a sua
linguagem de programao como Delphi Language.
Assim como a linguagem C, que foi padronizado pela ANSI (ANSI C), o Pascal possui padres pela ISO, como o
Pascal Standard e o Advanced Pascal.

Implementaes
O primeiro compilador Pascal foi desenvolvido em Zurique para a famlia de computadores CDC 6000, sendo
lanado em 1970. Tambm em 1970 foi desenvolvido o primeiro compilador Pascal norte americano, na
Universidade de Illinois por Donald B. Gillies, que gerava cdigo de mquina nativo para o mini-computador
PDP-11.
Pensando-se em propagar rapidamente o uso da linguagem, foi criado, em Zurique, um "kit de converso" que
incluia um compilador que gerava cdigo intermedirio, e um simulador para ele. Esse kit foi batizado de p-System,
e foi utilizado, entre outras coisas, para criar um sistema operacional para mini-computadores chamado UCSD
p-System, desenvolvido pelo Instituto de Sistemas de Informao da Universidade da Califrnia em San Diego.
Segundo o prprio Niklaus Wirth, o p-System e o UCSD foram instrumentais na popularizao do Pascal. No padro
UCSD, as Strings passaram a ser tipos prdefinidos (no Pascal padro era utilizados packed-arrays).[]
Pascal (linguagem de programao) 95

Nos anos 80, Anders Hejlsberg desenvolveu o compilador Blue Label Pascal o Nascom-2. Depois, ele foi trabalhar
na Borland e reescreveu seu compilador transformando-o no Turbo Pascal para a plataforma IBM PC (e tambm
CP/M 80), que era vendido a US$ 49,95, muito mais barato do que o Blue Label. Uma caracterstica muito
importante que o Turbo Pascal uma linguagem compilada, que gera cdigo de mquina real para a arquitetura
Intel 8088, tornando-a muito mais rpida do que as linguagens interpretadas.
Por ser mais barato, o Turbo Pascal passou a ter uma grande influncia na comunidade Pascal, que comeou a se
concentrar na plataforma IBM PC no fim dos anos 80. Muitos usurios de PC da poca migraram para o Turbo
Pascal, em busca de uma linguagem estruturada que no fosse interpretada, para substituir, por exemplo, o BASIC.
Pode se afirmar que o sucesso comercial de Turbo Pascal foi definitivo para a ampla divulgao da linguagem Pascal
entre os usurios de micro-computador.[]
Outra variante era o Super Pascal, que adicionava labels no numricas, o comando return e expresses como nomes
de tipos.
Durante os anos 90, compiladores que podiam ser modificados para trabalhar com arquiteturas diferentes tiveram
grande destaque, incluindo nessa lista o Pascal.
O prximo grande passo para a linguagem, foi a implementao da orientao a objeto (OO ou OOP em ingls) na
sua estrutura, comeando com a verso 5.5 do Turbo Pascal. Mais tarde, ao projetar o Delphi, querendo
funcionalidades mais elaboradas da orientao a objeto, a Borland utilizou o conceito Object Pascal criado pela
Apple Inc., utilizando-o como base para uma nova linguagem, que nas verses iniciais era chamado de Object Pascal
foi rebatizado como Delphi Programming Language nas verses posteriores. As maiores diferenas em relao s
implementaes OO das verses mais antigas foram a adio do conceito de objetos por referncia, construtores,
destrutores e propriedades, entre outros.

Padres/Normas
Em 1983, a linguagem foi padronizada, na norma internacional ISO / IEC 7185, assim como vrios padres locais
especficos de cada pas, incluindo a norma americana ANSI/IEEE770X3.97-1983, e ISO 7185:1983. A diferena
entre as duas normas que a padro ISO possui o nvel 1, extenso do arrays conformantes, enquanto a ANSI no
permitiu esta extenso linguagem original (verso Wirth). Em 1989, foi revista ISO 7185 (ISO 7185:1990) para
corrigir vrios erros e ambiguidades encontradas no documento original
Em 1990, foi criado uma norma ISO / IEC 10206 padronizando o Pascal. Em 1993, o padro ANSI foi substitudo
pelo ANSI organizao com um "ponteiro" para a norma ISO 7185:1990, que termina efetivamente o seu estatuto
como um padro diferente.
A norma ISO 7185 foi indicado para ser uma clarificao de Wirth da linguagem como detalhado em 1974 Manual
do Usurio e Relatrio [Jensen e Wirth], mas tambm foi notvel pela incluso de "Parmetros de array
conformantes" como um nvel 1 da norma, sendo nvel 0 Pascal sem Conformantes Arrays.
Note que o prprio Niklaus Wirth se refere linguagem 1974 como o padro, por exemplo, para diferenci-la das
caractersticas especficas de implementao em nvel de mquina do compilador CDC 6000. Esta linguagem foi
documentada em "The Pascal Report", a segunda parte do "Pascal users manual and report".
Nas grandes mquinas (mainframes e minicomputadores) originadas pelo Pascal, eram seguidos padres gerais. Na
IBM-PC, no eram. No IBM-PC, o Turbo Pascal e Delphi, padro Borland, tem o maior nmero de usurios. Assim,
de extrema importncia entender se uma determinada aplicao corresponde a linguagem original Pascal, Borland
ou um dialeto do mesmo.
As verses da linguagem do IBM-PC comearam a divergir com a vinda da UCSD Pascal, uma aplicao que
implementou ao programa vrias prorrogaes para a linguagem, juntamente com vrias omisses e mudanas.
Muitas caractersticas da linguagem UCSD sobrevivem atualmente, inclusive em linguagens Borlands.
Pascal (linguagem de programao) 96

Sintaxe
A linguagem Pascal foi criada para incentivar a programao modular e estruturada, facilitando a criao de
procedimentos com baixo acoplamento e alta coeso. Um programa em Pascal composto de constantes e variveis
globais, procedimentos e funes re-entrantes e um programa principal.[]
Procedimentos no retornam valores, funes sim.[] Tanto em procedimentos quanto em funes os parmetros
podem ser passados por referncia ou por valor.[] possvel passar vetores e matrizes com o tamanho, mas no a
quantidade de dimenses, especificado no tempo de execuo.
Procedimentos e funes podem conter, dentro de seu escopo, novos procedimentos e funes. Dentro de qualquer
parte do programa tambm podem ser criados blocos com os comandos BEGIN e END, que tambm possuem seu
prprio escopo.[] Nas verses originais, as variveis s podiam ser declaradas em posies especficas e no ao
decorrer do programa, o que limitava a regra de escopo.
O conjunto de procedimentos e funes pr-definidos fixo e inclui as funes read, readln, write e writeln, para
realizar E/S.[]

Exemplos de cdigo
Nota importante: Os programas foram desenvolvidos com o Turbo Pascal (Borland). Para funcionarem com outros
compiladores, devem ser feitas as seguintes alteraes:
Linha inicial passa de program name; para program name (input,output);
A instruo readkey desaparece
A directiva uses desaparece porque prpria do Turbo Pascal, bem como a biblioteca crt
A instruo clrscr desaparece porque faz parte da biblioteca crt
A declarao string passa para array [1..255] of char (supondo que iriam ser usados at 255 caracteres) j que o
Pascal no suporta strings nativamente.
As instrues readln para ler cadeias de caracteres, tm de estar todas dentro de ciclos, para ler um caracter de
cada vez.

Programa Ol Mundo
program OlaMundo;
begin
WriteLn('Ol, Mundo!');
end.

Nmeros perfeitos
program numerosPerfeitos;

uses crt;

var
ate, x, soma, i: integer;

begin
clrscr;
x := 0;
writeln('Numeros perfeitos abaixo de');
Readln(ate);
Pascal (linguagem de programao) 97

repeat
x := x + 1;
soma := 0;
for i := 1 to x - 1 do
begin
if x mod i = 0 then
soma := soma + i;
end;
if soma = x then
begin
writeln(x);
end;
until (x > ate);
writeln('Pressione qualquer tecla para finalizar');
readkey;
end.

Repetio
Soma dos nmeros pares.

program Soma_Pares;
uses crt;
var
superior, soma, num: integer;
begin
soma:=0;
write ('Entre com o limite superior');
readln (superior);
num:=2;

repeat
soma:=soma+num;
num:=num+2;
until (num > superior);

writeln('A soma dos nmeros pares de 2 at ', superior,' ', soma);


readln;
end.

Nmeros pares entre dois valores inteiros


program pares;

var
x, y: integer;

begin
writeln('Digite os dois valores');
Pascal (linguagem de programao) 98

readln(x, y);
if (x mod 2)<> 0 then
x := x + 1;
while x<= y do
begin
writeln(x, ' - ');
x := x + 2;
end;
writeln('Fim da Lista');

end.

Teste lgico
program Teste;
uses
crt;
var
a, b: integer;
begin
clrscr;
writeln('Digite um nmero para A');
readln(a);
writeln('Digite o nmero para B');
readln(b);
if (a > b) then { Se A maior que B ento }
writeln('A maior que B')
else { Seno }
if (a< b) then
writeln('B maior que A')
else
writeln('B igual A');
readkey;
end.

Compiladores Gratuitos
H vrios compiladores Pascal gratuitos, como por exemplo:
Chrome [1] a prxima gerao do Object Pascal para as plataformas .NET e Mono, desenvolvida pela
RemObjects Software [2]
Free Pascal [3] um poderoso compilador escrito em Pascal, distribuido sob a licena de uso GNU GPL. Pode ser
utilizado em conjunto com cdigo escrito em Turbo Pascal ou Delphi, e pode ser usados em vrias plataformas e
sistemas operacionais
GNU Pascal Compiler (GPC) [4] o compilador padro da GNU Compiler Collection (GCC). O compilador foi
escrito em C, mas a maior parte da biblioteca de funes da linguagem escrita em Pascal. Ele segue os padres
ANSI/ISO e grande parte dos padres Borland/Turbo Pascal. O suporte ao Delphi ainda limitado
Kylix [5] uma verso do Delphi para o sistema operacional Linux, sendo que seu compilador e sua interface de
desenvolvimento so gratuitas para uso no comercial, mas sua biblioteca de componentes no. Espera-se que o
Pascal (linguagem de programao) 99

cdigo-fonte do compilador seja aberto em breve


P4 compiler [6] , utilizado para o desenvolvimento de vrios compiladores Pascal escritos em Pascal, incluindo o
UCSD p-System
Pascalzim [7] O Pascalzim um compilador gratuito que foi desenvolvido na Universidade de Braslia e
utilizado em vrias disciplinas de introduo a programao na UnB e outras universidades
Turbo Pascal era o principal compilador Pascal para PCs durante os anos 80 e incio dos anos 90, devendo sua
popularidade ao seu grande poder e pequeno tempo de compilao. Hoje em dia, suas verses mais antigas (at a
verso 5.5) podem ser baixadas gratuitamente no site da Borland (exige registro)
Virtual Pascal [8] foi criado por Vitaly Miryanov em 1995 como um compilador nativo para OS/2, compatvel
com a sitaxe do Pascal da Borland. Mais tarde foi comercialmente lanado pela fPrint, adicionando a ele suporte
para Win32, tornando-se um freeware em 2000. Atualmente, ele pode ser compilado para as plataformas Win32,
OS/2 e Linux, sendo compatvel em grande parte com o Pascal da Borland e o Delphi
Uma extensa lista de compiladores pode ser encontrada na Pascaland [9]. O site escrito em francs, mas isso no faz
muita diferena, j que apenas uma lista de URLs para os compiladores.
[1] http:/ / www. chromesville. com
[2] http:/ / www. remobjects. com
[3] http:/ / www. freepascal. org
[4] http:/ / www. gnu-pascal. de/
[5] http:/ / www. borland. com/ kylix/
[6] http:/ / homepages. cwi. nl/ ~steven/ pascal/
[7] http:/ / pascalzim. tripod. com/
[8] http:/ / www. vpascal. com/
[9] http:/ / pascaland. org

Ligaes externas
Free Pascal (http://www.freepascal.org/) (em ingls) - compilador cdigo aberto
The Pascal Programming Language (http://pascal-central.com/ppl/index.html) (em ingls) por Bill Catambay
Sinuca (https://sites.google.com/site/sinucapascal/sinuca) (em portugus) - jogo feito em Pascal, com cdigo
fonte
Tutorial de Pascal (http://wiki.portugal-a-programar.org/dev_geral:pascal:tutorial_2010:indice) (em portugus)
na Wiki P@P, do Portugal-a-Programar(R)
Algoritmo de ordenao 100

Algoritmo de ordenao
Algoritmo de ordenao em cincia da computao um algoritmo que coloca os elementos de uma dada
sequncia em uma certa ordem -- em outras palavras, efetua sua ordenao completa ou parcial. As ordens mais
usadas so a numrica e a lexicogrfica.
Existem vrias razes para se ordenar uma sequncia. Uma delas a possibilidade se acessar seus dados de modo
mais eficiente.

Mtodos de ordenao de vetores

Mtodos simples
Insertion sort
Selection sort
Bubble sort
Comb sort

Mtodos sofisticados
Quick sort
Merge sort
Heapsort
Shell sort
Radix sort
Gnome sort
Count sort
Bucket sort
Cocktail sort
Timsort

Mtodos de pesquisa
Pesquisa binria
Busca linear
BogoBusca

Galeria
Algoritmo de ordenao 101

Insertion Sort Selection Sort Bubble Sort

Algoritmo gentico
Um algoritmo gentico (AG) uma tcnica de busca utilizada na cincia da computao para achar solues
aproximadas em problemas de otimizao e busca, fundamentado principalmente pelo americano John Henry
Holland. Algoritmos genticos so uma classe particular de algoritmos evolutivos que usam tcnicas inspiradas pela
biologia evolutiva como hereditariedade, mutao, seleo natural e recombinao (ou crossing over).
Algoritmos genticos so implementados como uma simulao de computador em que uma populao de
representaes abstratas de soluo selecionada em busca de solues melhores. A evoluo geralmente se inicia a
partir de um conjunto de solues criado aleatoriamente e realizada por meio de geraes. A cada gerao, a
adaptao de cada soluo na populao avaliada, alguns indivduos so selecionados para a prxima gerao, e
recombinados ou mutados para formar uma nova populao. A nova populao ento utilizada como entrada para a
prxima iterao do algoritmo.
Algoritmos genticos diferem dos algoritmos tradicionais de otimizao em basicamente quatro aspectos:
Baseiam-se em uma codificao do conjunto das solues possveis, e no nos parmetros da otimizao em si;
os resultados so apresentados como uma populao de solues e no como uma soluo nica;
no necessitam de nenhum conhecimento derivado do problema, apenas de uma forma de avaliao do resultado;
usam transies probabilsticas e no regras determinsticas.[]

Algoritmo
Os Algoritmos genticos so em geral algoritmos simples e fceis de serem implementados. Segue abaixo um trecho
de pseudo-cdigo descrevendo um algoritmo gentico:

funo AlgoritmoGentico(populao, funo-objetivo) sadas: indivduo


entradas: populao uma lista de indivduos
funo-objetivo uma funo que recebe um indivduo e retorna um nmero real.
repetir
lista de pais := seleo(populao, funo-objetivo)
populao := reproduo(lista de pais)
enquanto nenhuma condiao de parada for atingida
retorna o melhor indivduo da populao de acordo com a funo-objetivo

A funo-objetivo o objeto de nossa otimizao. Pode ser um problema de otimizao, um conjunto de teste para
identificar os indivduos mais aptos, ou mesmo uma "caixa preta" onde sabemos apenas o formato das entradas e nos
retorna um valor que queremos otimizar. A grande vantagem dos algoritmos genticos esta no fato de no
Algoritmo gentico 102

precisarmos saber como funciona esta funo objetivo, apenas t-la disponvel para ser aplicada aos indivduos e
comparar os resultados.
O indivduo meramente um portador do seu cdigo gentico. O cdigo gentico uma representao do espao de
busca do problema a ser resolvido, em geral na forma de seqncias de bits. Por exemplo, para otimizaes em
problemas cujos valores de entrada so inteiros positivos de valor menor que 255 podemos usar 8 bits, com a
representao binria normal, ou ainda uma forma de cdigo gray. Problemas com mltiplas entradas podem
combinar as entradas em uma nica seqncia de bits, ou trabalhar com mais de um "cromossomo", cada um
representando uma das entradas. O cdigo gentico deve ser uma representao capaz de representar todo o conjunto
dos valores no espao de busca, e precisa ter tamanho finito..[1]
A seleo tambm outra parte chave do algoritmo. Em geral, usa-se o algoritmo de seleo por "roleta", onde os
indivduos so ordenados de acordo com a funo-objetivo e lhes so atribudas probabilidades decrescentes de
serem escolhidos - probabilidades essas proporcionais razo entre a adequao do indivduo e a soma das
adequaes de todos os indivduos da populao. A escolha feita ento aleatoriamente de acordo com essas
probabilidades. Dessa forma conseguimos escolher como pais os mais bem adaptados, sem deixar de lado a
diversidade dos menos adaptados. Outras formas de seleo podem, ainda, ser aplicadas dependendo do problema a
ser tratado.Como exemplos pode-se citar a seleo por "torneio" (onde so selecionados diversos pequenos
subconjuntos da populao, sendo selecionado o indivduo de maior adequao de cada um desses grupos), a seleo
por "classificao" ou "ranking" (semelhante seleo por "roleta", com a diferena de que a probabilidade de
seleo relacionada sua posio na ordenao dos indivduos da populao e no sua adequao em si) e a
seleo por "truncamento" (onde so selecinados os N melhores indviduos da populao, descartando-se os outros).
[2]

A reproduo, tradicionalmente, divididas em trs etapas: acasalamento, recombinao e mutao. O


acasalamento a escolha de dois indivduos para se reproduzirem (geralmente gerando dois descendentes para
manter o tamanho populacional). A recombinao, ou crossing-over um processo que imita o processo biolgico
homnimo na reproduo sexuada: os descendentes recebem em seu cdigo gentico parte do cdigo gentico do pai
e parte do cdigo da me. Esta recombinao garante que os melhores indivduos sejam capazes de trocar entre si as
informaes que os levam a ser mais aptos a sobreviver, e assim gerar descendentes ainda mais aptos. Por ltimo
vem as mutaes, que so feitas com probabilidade a mais baixa possvel, e tem como objetivo permitir maior
variabilidade gentica na populao, impedindo que a busca fique estagnada em um mnimo local.[3]

Programao Gentica
Por ser um algoritmo extremamente simples e eficiente, existem diversas variaes em cima do algoritmo gentico
bsico para se obter resultados melhores ou mesmo tratar novas classes de problemas. Uma dessas variaes a
Programao gentica. Na Programao gentica os indivduos representam pequenos programas de computador que
sero avaliados de acordo com o resultado de sua execuo. Estes programas podem ser expresses simples, como
frmulas aritmticas ou programas complexos, com operaes de lao e condicionais, tpicas de uma linguagem de
programao comum.[][]
Algoritmo gentico 103

Bibliotecas e Frameworks para Algoritmos Genticos


Pyevolve [4] (Framework open-source para Algoritmos Genticos e Programao Gentica - Python)
GAUL [5] (Biblioteca open-source para Algoritmos Genticos e metaheursticas - Linguagem C)
JGAP [6] (Pacote open-source para Algoritmos Genticos - Java)
JAGA [7] (Pacote open-source para Algoritmos Genticos e Programao Gentica - Java)
GAlib [8] (Framework open-source para Algoritmos Genticos - C++)
EvolveDotNet [9] (Framework open-source para Algoritmos Genticos - C#)

Bibliografia
KOZA, J.R.. Genetic Programming: On the Programming of Computers by Means of Natural Selection.
[S.l.]:MIT Press, 1992.
GOLDBERG, David E.. Genetic Algorithms in Search, Optimization, and Machine Learning.
EUA:Addison-Wesley, 1989.
NORVIG, Peter, RUSSEL, Stuart. Artificial Intelligence: A Modern Aproach. Upper Saddle River, NJ,
EUA:Prentice Hall, 1995.
Linden, Ricardo. Algoritmos Genticos - uma importante ferramenta da inteligncia computacional - 2 Edio.
BR:Brasport, 2008.

Ligaes externas
Introduo aos Algoritmos Geneticos [10]
Viso geral sobre algoritmos genticos [11]
Trabalho de graduao sobre Algoritmos Genticos [12]
Texto sobre Programao e Algoritmos Genticos [13]

Referncias
[1] Para uma discusso sobre as formas de representao do espao de busca, veja: pgina 80
[2] Veja em Captulo 9 - Outros Tipos de Seleo.
[3] Veja em pgina 147 para ver outras orperaes que podem ser aplicadas nos indivduos para a reproduo.
[4] http:/ / pyevolve. sourceforge. net
[5] http:/ / gaul. sourceforge. net
[6] http:/ / jgap. sourceforge. net/
[7] http:/ / www. jaga. org/
[8] http:/ / lancet. mit. edu/ ga/
[9] http:/ / code. google. com/ p/ evolvedotnet/
[10] http:/ / www. obitko. com/ tutorials/ genetic-algorithms/ portuguese/
[11] http:/ / www. demiurgo. com. br/ 2009/ 05/ 20/ algoritmos-geneticos-visao-geral/
[12] http:/ / iaufes20092. pbworks. com/ AG+ -+ Quadro+ Cognitivo+ 7
[13] http:/ / adrianoyamamoto. blogspot. com/ 2011/ 06/ programacao-genetica. html
Decomposio de Dantzig-Wolfe 104

Decomposio de Dantzig-Wolfe
O princpio da decomposio de Dantzig-Wolfe,
originalmente desenvolvida pelos matemticos
norte-amercianos George Dantzig e Phil Wolfe, foi
publicado em 1960[1] dando incio a um intenso
trabalho de pesquisa na rea de programao
matemtica em larga escala. Este procedimento mais
adequado quando aplicado problemas lineares cuja
matriz de coeficientes tem uma estrutura angular, isto ,
um ou mais blocos independentes lincados por
equaes acopladas.

Ele opera formando um ``problema mestre``


equivalente, com poucas linhas, mas com nmero
muito maior de colunas. Este problema ento Matriz mostrando a estrutura angular com blocos independentes
lincados por equaes acopladas
resolvido sem tabular todas as colunas, gerando elas
sempre que o mtodo simplex precisa, usando uma
tecnica conhecida com gerao de coluna.

O algoritmos envolve iteraes entre um conjunto de subproblemas cujo funo objetivo contm parmetros
variveis e um problema mestre.
O subproblema recebe um conjunto de parmetros do problema mestre e ento envia suas solues para o problema
mestre, que combina esta soluo com a soluo anterior e computa novos parmetros.

Ligaes externas
Introduo Decomposio de Dantzig-Wolfe [2]

Referncias
[1] George B. Dantzig and Philip Wolfe. Decomposition Principle for Linear Programs. Operations Research 8 (1960) pp 101111
[2] http:/ / paginas. fe. up. pt/ ~mam/ dantzig. pdf
Diviso e conquista 105

Diviso e conquista
Diviso e Conquista (do ingls Divide and Conquer) em computao uma tcnica de projeto de algoritmos
utilizada pela primeira vez por Anatolii Karatsuba em 1960 no algoritmo de Karatsuba.

Tcnica
Esta tcnica consiste em dividir um problema maior recursivamente em problemas menores at que o problema
possa ser resolvido diretamente. Ento a soluo do problema inicial dada atravs da combinao dos resultados de
todos os problemas menores computados. Vrios problemas podem ser solucionados atravs desta tcnica, como o
da ordenao de nmeros atravs do algoritmo merge sort e da transformao discreta de Fourier atravs da
transformada rpida de Fourier. Outro problema clssico que pode ser resolvido atravs desta tcnica a Torre de
Hanoi.
A tcnica soluciona o problema atravs de trs fases:
1. Diviso: o problema maior dividido em problemas menores e os problemas menores obtidos so novamente
divididos sucessivamente de maneira recursiva.
2. Conquista: o resultado do problema calculado quando o problema pequeno o suficiente.
3. Combinao: o resultado dos problemas menores so combinados at que seja obtida a soluo do problema
maior.

Eficincia
Problemas que utilizam esta tcnica podem tirar proveito de mquinas com mltiplos processadores pois a fase de
diviso em problemas menores proporciona uma diviso natural do trabalho. Cada um dos problemas menores
obtidos pode ser calculado separadamente em um processador sem depender dos demais.
A soluo por esta tcnica tambm eficiente no uso da memria cache pois ao final da fase de diviso grande parte
dos dados necessrios para a fase de combinao j esto disponveis na cache proporcionando um acesso mais veloz
aos dados. Porm o carter recursivo das solues acaba gerando um trabalho de processamento maior devido ao uso
de chamadas recursivas e o uso da pilha de chamadas.
Minimax 106

Minimax
Em teoria da deciso, o minimax (ou minmax) um mtodo para minimizar a perda mxima possvel. Pode ser
considerado como a maximizao do ganho mnimo (maximin). Comea-se com dois jogadores 0-0 da teoria dos
jogos, cobrindo ambos os casos em que os jogadores tomam caminhos alternados (por rodadas) ou simultaneamente.
Pode-se estender o conceito para jogos mais complexos e para tomada de deciso na presena de incertezas. Nesse
caso no existe outro jogador, as consequncias das decises dependem de fatores desconhecidos.
Uma verso simples do algoritmo minimax lida com jogos como o jogo da velha, no qual cada jogador pode ganhar,
perder ou empatar. Se o jogador A pode vencer com um movimento, seu melhor movimento o movimento para a
vitria. Se o jogador B identifica que um movimento levar a uma situao em que o adversrio pode ganhar em um
movimento, enquanto outro movimento levar a uma situao de empate, ento a melhor jogada do jogador B a
que leva para o empate. Aps algumas rodadas fcil identificar qual o melhor movimento. O algoritmo minimax
ajuda a encontrar a melhor jogada ao caminhar pelas opes vlidas a partir do fim do jogo. A cada passo assume-se
que o jogador A est tentando maximizar as chances de A ganhar, enquanto na prxima rodada o jogador B est
tentando minimizar as chances de isso acontecer (ao maximizar as chances de que ele prprio ganhe).

Algoritmo
O algoritmo minimax (usando uma heurstica para terminar o vasculhamento aps uma dada profundidade)
mostrado abaixo em pseudocdigo.

ROTINA minimax(n, profundidade)


SE n um n terminal OU profundidade = 0 ENTO
RETORNE o valor da heurstica do n
SENO SE o n representa a jogada de algum adversrio ENTO
+
PARA CADA filho DE n
min(, minimax(filho, profundidade-1))
FIM PARA
RETORNE
SENO
-
PARA CADA filho DE n
max(, minimax(filho, profundidade-1))
FIM PARA
RETORNE
FIM SE
FIM ROTINA

A verso negamax deste mesmo algoritmo apresentada abaixo. Essa verso baseia-se na observao que
. Embora essa verso funcione apenas em jogos com dois jogadores, ela evita a
necessidade do algoritmo tratar os jogadores separadamente.
ROTINA negamax(n, profundidade)
SE n um n terminal OU profundidade = 0 ENTO
RETORNE o valor da heurstica do n
SENO
- { a avaliao idntica para ambos os jogadores }
PARA CADA filho DE n
Minimax 107

max(, -negamax(filho, profundidade-1))


FIM PARA
RETORNE
FIM SE
FIM ROTINA

Mtodo do gradiente conjugado


Em matemtica, o mtodo do gradiente conjugado um algoritmo
para a soluo numrica de sistemas particulares de equaes lineares,
aqueles cuja matriz simtrica e positiva definida. O mtodo do
gradiente conjugado um mtodo iterativo, ento ele pode ser aplicado
a sistemas esparsos que so grandes demais para ser tratados por
mtodos diretos como a decomposio de Cholesky. Tais sistemas
surgem frequentemente quando se resolve numericamente equaes
diferenciais parciais.

Referncias
O mtodo do gradiente conjugado foi originalmente proposto em
Hestenes, Magnus R.; Stiefel, Eduard. (dezembro, 1952). "Methods
of Conjugate Gradients for Solving Linear Systems [1]". Journal of
Research of the National Bureau of Standards 49 (6).
Descries do mtodo podem ser encontradas nos seguintes livros
texto: Uma comparao da convergncia do mtodo de
descida do gradiente com tamanho de passo
Kendell A. Atkinson (1988), An introduction to numerical analysis
timo (em verde) e o mtodo do gradiente
(2nd ed.), Section 8.9, John Wiley and Sons. ISBN 0-471-50023-2. conjugado (em vermelho) para a minimizao da
Mordecai Avriel (2003). Nonlinear Programming: Analysis and forma quadrtica com um sistema linear dado. O
Methods. Dover Publishing. ISBN 0-486-43227-0. gradiente conjugado, assumindo aritimtica exata,
converge em no mximo n passos onde n o
Gene H. Golub and Charles F. Van Loan, Matrix computations (3rd
tamnho da matriz do sistema (no exemplo, n=2).
ed.), Chapter 10, Johns Hopkins University Press. ISBN
0-8018-5414-8.

Ligaes externas
Mtodo do gradiente conjugado [2] por Nadir Soualem.
Mtodo do gradiente conjugado com precondicionamento [3] por Nadir Soualem.
An Introduction to the Conjugate Gradient Method Without the Agonizing Pain [4] por Jonathan Richard
Shewchuk.
Mtodos iterativos para sistemas lineares esparsos [5] por Yousef Saad
LSQR: Equaes esparsas e mnimos quadrados [6] por Christopher Paige e Michael Saunders.
Mtodo do gradiente conjugado 108

Referncias
[1] http:/ / nvl. nist. gov/ pub/ nistpubs/ jres/ 049/ 6/ V49. N06. A08. pdf
[2] http:/ / www. math-linux. com/ spip. php?article54
[3] http:/ / www. math-linux. com/ spip. php?article55
[4] http:/ / www. cs. cmu. edu/ ~quake-papers/ painless-conjugate-gradient. pdf
[5] http:/ / www-users. cs. umn. edu/ ~saad/ books. html
[6] http:/ / www. stanford. edu/ group/ SOL/ software/ lsqr. html

Algoritmo simplex
Em teoria de otimizao matemtica, o algoritmo Simplex de George Dantzig uma tcnica popular para dar
solues numricas de problemas da programao linear. Um mtodo sem relao, mas chamado de maneira similar
o mtodo Nelder-Mead ou mtodo Simplex de baixo custo devido a Nelder e Mead (1965) e um mtodo
numrico para otimizao de problemas livres multidimensionais, pertencentes classe mais geral de algoritmos de
busca.
Em ambos os casos, o mtodo usa o conceito de um simplex, que um poltopo de N+1 vrtices em N dimenses:
um segmento de linha sobre uma linha, um tringulo sobre um plano, um tetraedro em um espao de trs dimenses
e assim sucessivamente.

Procedimentos
Estes procedimentos so vlidos para problemas de maximizao:
1. Introduzir as variveis de folga, uma para cada desigualdade;
2. Montar um quadro para os clculos, colocando os coeficientes de todas as variveis com os respectivos sinais e,
na ltima linha, incluir os coeficientes da funo objetivo transformada;
3. Estabelecer uma soluo bsica inicial, usualmente atribuindo valor zero s variveis originais e achando valores
positivos para as variveis de folga;
4. Como prxima varivel a entrar na base, escolher a varivel no bsica que oferece, na ltima linha, a maior
contribuio para o aumento da funo objetivo (ou seja, tem o maior valor negativo). Se todas as variveis que
esto fora da base tiverem coeficientes nulos ou positivos nesta linha, a soluo atual tima. Se alguma dessas
variveis tiver coeficiente nulo, isto significa que ela pode ser introduzida na base sem aumentar o valor da
funo objetivo. Isso quer dizer que temos uma soluo tima, com o mesmo valor da funo objetivo.
5. Para escolher a varivel que deve deixar a base, deve-se realizar o seguinte procedimento:
1. Dividir os elementos da ltima coluna pelos correspondentes elementos positivos da coluna da varivel que
vai entrar na base. Caso no haja elemento nenhum positivo nesta coluna, o processo deve parar, j que a
soluo seria ilimitada.
2. O menor quociente indica a equao cuja respectiva varivel bsica dever ser anulada, tornando-se varivel
no bsica.
6. Usando operaes vlidas com as linhas da matriz, transformar o quadro de clculos de forma a encontrar a nova
soluo bsica. A coluna da nova varivel bsica dever se tornar um vetor identidade, onde o elemento 1 aparece
na linha correspondente varivel que est sendo anulada.
7. Retornar ao passo 4 para iniciar outra iterao.
Algoritmo simplex 109

Links externos
Metodo Simplex [1] Descrio do mtodo Simplex
Mtodo Simplex das Duas Fases [2] Descrio do mtodo Simplex das Duas Fases
PHPSimplex: ferramenta online para resolver problemas de programao linear [3] por Daniel Izquierdo e Juan
Jos Ruiz da Universidade de Mlaga (UMA, Espanha).

Referncias
[1] http:/ / www. celiomoliterno. eng. br/ Arquivos/ Pesop/ Metodo%20Simplex. pdf
[2] http:/ / www. decom. ufop. br/ prof/ marcone/ Disciplinas/ Pesquisa%20Operacional%20I/ DuasFases. pdf
[3] http:/ / www. phpsimplex. com/ simplex/ simplex. htm?l=pt

Simulated annealing
Arrefecimento simulado ou simulated annealing uma metaheurstica para otimizao que consiste numa tcnica
de busca local probabilstica, e se fundamenta numa analogia com a termodinmica.
Esta metaheurstica uma metfora de um processo trmico, dito annealing ou recozimento, utilizado em metalurgia
para obteno de estados de baixa energia num slido. O processo consiste de duas etapas: na primeira a temperatura
do slido aumentada para um valor prximo de 1100C que a temperatura de incio de transformao da austenita
em ferrita; na segunda o resfriamento deve ser realizado lentamente at que o material se solidifique, sendo
acompanhado e controlado esse arrefecimento. Nesta segunda fase, executada lentamente, os tomos que compem o
material organizam-se numa estrutura uniforme com energia mnima. Isto provoca que os tomos desse material
ganhem energia para se movimentarem livremente e, ao arrefecer de forma controlada, dar-lhes uma melhor hiptese
de se organizarem numa configurao com menor energia interna, para ter, como resultado prtico, uma reduo dos
defeitos do material.
De forma anloga, o algoritmo de arrefecimento simulado substitui a soluo actual por uma soluo prxima (i.e.,
na sua vizinhana no espao de solues), escolhida de acordo com uma funo objectivo e com uma varivel
(dita Temperatura, por analogia). Quanto maior for , maior a componente aleatria que ser includa na prxima
soluo escolhida. medida que o algoritmo progride, o valor de decrementado, comeando o algoritmo a
convergir para uma soluo ptima, necessariamente local.
Uma das principais vantagens deste algoritmo permitir testar solues mais distantes da soluo actual e dar mais
independncia do ponto inicial da pesquisa.

Descrio
Esta tcnica comea sua busca a partir de uma soluo inicial qualquer, o procedimento principal consiste em um
loop ou lao que gera aleatoriamente, em cada iterao, um nico vizinho s da soluo corrente s. A cada gerao de
um novo vizinho s de s, testada a variao do valor da funo objetivo, isto , = f (s) f (s), onde temos as
seguintes situaes:
< 0: H uma reduo de energia, a qual implica que a nova soluo melhor que a anterior. O mtodo aceita a
soluo e s passa a ser a nova soluo corrente.
= 0: Caso de estabilidade, no havendo reduo de energia. Na verdade, situao pouco provvel de acontecer
na prtica. A aceitao da soluo , portanto, indiferente.
0: Houve um aumento do estado de energia. A aceitao desse tipo de soluo mais provvel a altas
temperaturas e bastante improvvel a temperaturas reduzidas. Para reproduzir essas caractersticas, geralmente
usa-se, para calcular a probabilidade de se aceitar a nova soluo, uma funo conhecida por fator de Boltzmann,
Simulated annealing 110

que dada por e^(-/T), onde T um parmetro do mtodo, chamado de temperatura e que regula a
probabilidade de solues com pior custo. Por exemplo, esta poder ser:
Gera-se um nmero aleatrio retirado de uma distribuio uniforme no intervalo [0, 1].
Se este nmero for menor ou igual a p, aceita-se a soluo.
Se for maior que p, rejeita-se a soluo.
A temperatura T assume inicialmente um valor elevado, . Aps um nmero fixo de iteraes (o qual representa
o nmero de iteraes para o sistema atingir o equilbrio trmico em uma dada temperatura), a temperatura
gradativamente diminuda por uma razo de resfriamento , tal que Tn * Tn -1, sendo 0 < < 1. Como esse
procedimento se d no incio, h uma chance maior de se escapar de mnimos locais e, medida que T se aproxima
de zero, o algoritmo se comporta como o mtodo de descida, uma vez que diminui a probabilidade de se aceitar
movimentos que possa piorar (T 0 => e-/T 0).
O procedimento finalizado quando a temperatura chega a um valor prximo de zero e nenhuma soluo que piore o
valor da melhor soluo seja mais aceita, ou seja, quando o sistema estiver estvel. A soluo obtida quando o
sistema encontra-se nesta situao evidencia o encontro de um mnimo local.
Algoritmos baseados em Simulated Annealing geralmente incluem reaquecimento seguido de um novo processo de
resfriamento, utilizado quando a quantidade de movimentos consecutivamente rejeitados alta. tambm comum
trabalhar nas temperaturas mais altas com taxa de resfriamento menor e aument-la quando a temperatura reduzir.

Pseudo-cdigo
Antes de apresentar o algoritmo, vejam-se os identificadores neles utilizados:
S0 Configurao Inicial (Entrada);
Si Configurao da Iterao i;
S Configurao Final;
T0 Temperatura Inicial;
Ti Temperatura na Iterao i;
M Nmero mximo de iteraes (Entrada);
P Nmero mximo de Perturbaes por iterao (Entrada);
L Nmero mximo de sucessos por iterao (Entrada);
Factor de reduo da temperatura (Entrada);
f(Si) Valor da funo objetivo correspondente configurao Si;
nSucesso Contador de sucesso em uma iterao;
i e j Variveis de controle de Loops.
Alm dos indicadores acima, consideremos as seguintes funes:
Perturba(S) Funo que realiza uma perturbao na Soluo S;
Randomiza() Funo que gera um nmero aleatrio no intervalo [0,1];
TempInicial() Funo que calcula a temperatura inicial;

Pseudo-Cdigo Simulated Annealing


Inicio
/* Entradas do Algoritmo */
Ler (S0, M, P, L, )
/* Inicializao das variveis */
S = S0
T0 = TempInicial()
T = T0
j=1
Simulated annealing 111

/*Loop principal Verifica se foram atendidas as condies de termino do algoritmo*/


Repita
i=1
nSucesso = 0
/*Loop Interno Realizao de perturbao em uma iterao*/
Repita
Si = Perturba(S)
Fi = f(Si) f(S)
/*Teste de aceitao de uma nova soluo*/
Se (fi 0) ou (exp(-fi/T) > Randomiza()) ento
S= Si
nSucesso = nSucesso + 1
Fim-se
i=i+1
At (nSucesso L) ou (i > P)
/*Actualizao da Temperatura*/
T = .T
/*Actualizao do Contador de iteraes*/
j=j+1
At (nSucesso = 0) ou (j > M)
/*Sada do Algoritmo*/
Imprima(S)

Veja tambm
Mtodo de Monte Carlo
Pesquisa tabu
Cadeias de Markov
Problema do caixeiro viajante
Algoritmo busca-ciclos de Floyd 112

Algoritmo busca-ciclos de Floyd


Algoritmo para Busca de Cclos de Floyd um algoritmo inventado por Robert W. Floyd em 1967 para detectar
ciclos em seqncias arbitrrias, seja em estruturas de dados ou geradas ao vivo (especialmente grafos e seqncias
pseudo-aleatrias) usando espao O(1). Algumas vezes este algoritmo chamado de algoritmo-"tartaruga e a lebre".
A discusso a seguir construda em termos de seqncias aleatrias em particular, de grande importncia na anlise
de geradores de nmero pseudo-aleatrios e nas aplicaes de algoritmos tais como fatorao o algoritmo rho de
Pollard.
Seja

uma funo pseudo-aleatria, com S um conjunto de cardinalidade finita n. Define-se uma seqncia ai como:

Evidentemente tal seqncia deve ter um ciclo aps pelo menos n interaes da funo pseudo-aleatria, porque h
somente n possveis valores para um elemento. A maneira de nave para encontrar o tamanho deste ciclo guardar
cada elemento da seqncia e, aps cada iterao, procurar entre todos eles por duplicaes. Isto significa que a
necessidade de armazenamento O( + ), onde o tamanho do ciclo e o tamanho da cauda (isto , da parte da
seqncia que no cclica).
Note que se nos encontramos dois elementos de seqncia tal que

ento |i j| deve ser mltiplo do comprimento do ciclo, porque a definio de uma seqncia cclica :

A diferena entre os dois ndices que armazenam elementos iguais k, um mltiplo do comprimento do ciclo.
Algoritmo de busca-cclica de Floyd encontra tal igualdade pelo processamento de duas instncias de seqncias em
paralelo, uma das quais mais rpida mais "rpida" do que a outra; isto uma instncia processa duas iteraes
enquanto a outra processa uma. Ento, quando

ento qualquer divisor de 2m m = m deve ser o comprimento do ciclo. Se m composto, pode-se deixar o
algoritmo continuar a processar at que ele encontre mais valores de m para os quais a igualdade acima verdadeira,
e obter o maior divisor comum de m. Neste processo, a lista de possveis 's pode ser preparada.
Algoritmo busca-ciclos de Floyd 113

A melhor maneira de visualizar este algoritmo construir


um diagrama da seqncia. Ele se parecer com a letra
Grega . A seqncia inicia-se no fim da cauda, e
move-=se para cima girando na direo oposta aos
ponteiros do relgio. Acompanhando o algoritmo, as duas
instncias da seqncia iro se encontrar em a6 depois de 6
iteraes. Se o algoritmo continuar, as seqncias se
encontram novamente, aps outras seis iteraes, no
mesmo elemento. Desde que o comprimento do ciclo seja
de fato 6, o mesmo resultado continuar ocorrendo.

No melhor caso, este algoritmo necessita comparaes


(com > 1), desde que a seqncia mais lenta tenha de
percorrer ao menos a parte inicial do ciclo. O pior caso
necessita + /2 comparaes; a seqncia lenta no
alcanar mais do que a metade do crculo sem que
encontrar a seqncia rpida. O algoritmo usa um
Algoritmo Busca-Cclica de Floyd
armazenamento de O(1).

Talvez a mais difundida variante deste algoritmo seja o algoritmo rho de Pollard, um algoritmo de fatorao inteira
que usa nmeros pseudo-aleatrios para fatorar inteiros. H tambm um algoritmo para clculo de logaritmo
discretos baseado no Algoritmo de busca-ciclica de Floyd.

Algoritmo Chaff
Chaff um algoritmo para resolver instncias do Problema de satisfatibilidade booleana em programao. Ele foi
desenvolvido por pesquisadores na Universidade de Princeton, Estados Unidos. O algoritmo trouxe melhorias de
desempenho ao algoritmo DPLL (Davis-Putnam-Logemann-Loveland ) com um nmero de realces para uma
implementao eficiente.No mtodo Chaff, a parte principal no est baseada em algoritmos sofisticados para a
reduo do espao de busca, mas em um desenho bastante eficiente em uma das etapas cruciais do mtodo DPLL: a
propagao unitria. nessa fase que se mostra mais necessrio os esforos de otimizao.

Implementaes
Algumas implementaes disponveis do algoritmo em software so mChaff, xChaff e zChaff, o ltimo sendo o mais
conhecido e usado, inclusive esta implementao j ganhou diversos concursos de resolvedores SAT. Chaff
concentra-se em aperfeioar vrios aspectos do algoritmo DPLL, seu bom desempenho devido ao uso de Literais
observados(vigiados), retrosaltos(backjumping), reincios aleatrios e heurstica para lidar com aprendizado. A
seguir, o algoritmo zChaff mostrar o procedimento de forma semelhante supracitada.

zChaff
A heurstica Chaff tende a melhorar a tcnica utilizada pela heurstica SATO (SAtisability Testing Optimized)
utilizando literais observados. Em contraste com as listas Head and Tail(ver lista simplemente ligada) no h ordem
entre os dois ponteiros. A falta de ordem tem a vantagem de que os literais no precisam ser atualizados quando so
executados os backtrackings(re-leitura ou voltar atrs). Algumas extenses ao procedimento bsico do Davis-Putnam
foram bem sucedidas na heurstica zChaff.
Algoritmo Chaff 114

1.Algumas regras de poda foram incorporadas com sucesso em zChaff. A maioria dessas regras so variveis de
estado dependentes, isto , so estatsticas de ocorrncia de variveis no-assinaladas usadas para marcar o banco
de dados das clusulas a fim de simplificar as variveis j assinalada.
2.Em zChaff adota-se o processo de aprendizagem de conflitos (Conflict Learning) aplicado primeiramente em
Relsat e posteriormente aprimorado em GRASP. Esse processo evita que o algoritmo no espao futuro de procura
encontre os mesmos conflitos j mapeados.
3.O backtracking no-cronolgico discutido em GRASP utilizado tambm nessa heurstica com o objetivo de
aprimorar o backtracking tradicional proposto por Davis-Putnam.
4.Aps abortar a execuo devido ao excesso de algum parmetro, reinicializaes (restarts) so presentes nesse
algoritmo. Esse processo evita que o algoritmo SAT se perca em partes no-relevantes do espao de procura. O
processo de aprendizagem afeta o conceito de reinicializaes em clusulas novas durante duas reinicializaes e
ento modifica o banco de dados das clusulas.

Principais Funes
As principais funes relacionadas a tal heurstica so:
1. decide-next-branch: Esta funo implementa a regra de poda. Cada varivel x mantm o contador de literais
(literal count) para contar o nmero de ocorrncias de x e de x em clusulas pertencentes ao banco de dados. So
mantidos tambm as contagens (scores) para cada x e x individualmente. Todas as variveis so mantidas em
ordem decrescente com a funo maxscore(x) = max(score(x),score(x)) usada para ordenar a relao. Diante da
aprendizagem de conflitos, o contador de literais pode ser aumentado e atualizaes sempre so realizadas. Seja x
varivel, scoreold(x),scoreold(x) so as atuais contagens e seja increase(x),increase(x) o incremento de x e x
desde a ltima atualizao. Logo a nova contagem realizada como:

scorenew(x) = scoreold(x)/2 + increase(x)


scorenew(x) = scoreold(x)/2 + increase(x)

Para uma nova ramificao de variveis e um novo assinalamento das variveis, a varivel x com o valor mximo
maxscore(x) selecionado e seu assinalamento x = 1 se score(x) score(x) e x = 0 se score(x) < score(x). J que a
contagem de literais somente aumentada quando uma clusula conflitante no banco de dados adicionada, essa
regra ocorre em clusulas conflitantes aprendidas. Alm disso, h contagem de variveis que nunca ocorrem ou
raramente ocorrem nas clusulas conflitantes se dividida por dois.
2. deduce: Essa funo incorpora a regra de propagao unitria (unit propagation rule) de uma maneira repetida e
chamada de BCP (boolean constraint propagation). A funo principal do deduce deduzir uma implicao de uma
fila de implicaes e checar todas as clusulas no-satisfeitas se elas so agora satisfeitas ou se tornaram clusulas
unitrias a partir dessa nova implicao. Alm disso, essa implicao e assinalada no nvel de deciso nomeada no
assinalamento anterior da deciso. Todos os assinalamentos de implicaes para um nvel de deciso so
armazenados numa lista de anexada. Se um conflito ocorre, ou seja, uma clusula identificada como no-resolvida,
todas as clusulas no-resolvidas so coletadas para permitir que a anlise de conflitos baseada em clusulas
no-resolvidas. A funo retorna NO-CONFLICT se nenhum conflito ocorre e retorna CONFLICT se ocorre
conflito.
3. analyze-conflicts: Essa funo ocorre dentro da funo deduce. Um conflito ocorre quando um assinalamento
contraditrio na varivel deduzido. Por exemplo, seja x uma varivel que j tenha sido assinalada com o valor x = 1
e a partir da funo deduce encontramos o valor x = 0 o que caracteriza um conflito. Se c = x temos que c uma
clusula conflitante. A partir do aprendizado atravs da clusula conflitante o nvel de backtracking computado.
4. backtrack: Depois da anlise de conflitos necessrio realizar um backtrack num certo nvel b de deciso (para
um melhor entendimento sobre o nvel de deciso, ver exemplo no final do artigo) computado pela funo
analyze-conflicts. Logo todas as implicaes e decises de assinalamentos com nvel de deciso r b so
Algoritmo Chaff 115

recompostas. Se dentro de uma clusula conflitante c somente um literal tiver seu nvel de deciso, este literal
diretamente implicado. Esta implicao pode disparar novas implicaes pela funo deduce.

Acima, as funes principais do zChaff.

Literais Observados
Um dos principais avanos propostos, primeiramente por Chaff, e posteriormente incorporado em zChaff o que
chamamos de literais observados (watched literals). Na prtica, para a maioria dos problemas SAT, mais que 90%
no tempo de execuo de um resolvedor responsvel pelo processo BCP. Logo um eficiente BCP de fundamental
importncia para a sua implementao, deseja-se achar uma forma rpida de visitar todas as clusulas que se
tornaram novas implicaes por uma simples adio ao conjunto de assinalamentos. A forma mais intuitiva
simplesmente olhar cada clusula no banco de dados que est assinalada para 0. Deve-se ter um contador para cada
clusula que tenha o valor 0 e modific-lo toda vez que um literal da clusula for mudado para 0. Com esse objetivo,
pode-se escolher dois literais no assinalados para 0 em cada clusula para observar a qualquer momento. Ento
pode-se garantir que at que um desses dois literais sejam assinalados para 0, no se pode ter mais que N 2 literais
que na clusula assinalados para 0 o que torna a clusula no implicada.
Ao se visitar uma clusula temos:
1. A clusula no implicada, ento pelo menos dois literais no esto assinalados para 0, incluindo o outro literal
observado corrente. Isto significa que pelo menos um literal no-observado no est assinalado para 0. Escolhe-se
ento este literal para substituir o que est assinalado para 0. Se mantm a propriedade que dois literais observados
no esto assinalados para 0.
2. A clusula implicada ento deve-se notar que a varivel implicada deve ser o outro literal observado, j que pela
definio, a clusula tem somente um literal no assinalado para 0, e um dos dois literais observados agora
assinalado para 0.
Podemos observar na Figura abaixo o funcionamento do BCP de zChaff atravs de dois literais observados.

Dois Literais Observados.


Algoritmo Chaff 116

A Figura acima mostra como os literais observados de zChaff para uma clusula simples muda de acordo com o
assinalamento de suas variveis. Observe que a escolha inicial dos literais observados arbitrria. O BCP em SATO
bem parecido com o apresentado em zChaff. A diferena bsica entre zChaff e SATO o fato de que em zChaff
no necessrio o deslocamento numa direo fixa para os literais observados. Em SATO o head s pode
movimentar-se em direo ao tail e vice-versa. Na Figura acima observamos que o os literais observados esto, a
princpio, apontados para o incio e fim da clusula (o que no necessrio em zChaff). Porm, medida que
executado o procedimento, no h mais direo fixa, como aconteceria em SATO.

Resolvente
O principal avano de zChaff a criao do que chamaremos resolvente com o intuito de prevenir erros no decorrer
da heurstica. Seja a FNC . Essa frmula equivalente a
(pode ser verificado utilizando tabela verdade). O resolvente - definido
como uma tautologia que podemos extrair de determinada frmula - da frmula ser
dado por j que temos a implicao .
Por exemplo, seja e se tomarmos no executado o
processo de deduo (j que na parte restante no se pode extrair nenhum
resolvente). Quando ocorre um conflito entre e . O resolvente ser dado por
o que evitar problemas futuros.
A verificao da veracidade dos resolventes se faz por meio do uso de tabelas verdades j que as frmulas descritas
em cada exemplo so equivalentes. Esta descoberta de equivalncia se que torna zChaff uma heurstica mais
poderosa que as anteriores.

Exemplo
zChaff incorporou os avanos da heurstica GRASP e SATO o que significa que a forma de se tratar conflitos
(usando Grafos de Implicao) e o uso do backtracking no-cronolgico so utilizados nesta heurstica alm da
idia de literais observados. A grande diferena que determinou uma melhoria em zChaff foi a utilizao dos
ponteiros que podem se mover livremente e, inicialmente, podem apontar para qualquer varivel da clusula. Seja a
seguinte clusula num nvel de deciso n qualquer (Figura abaixo, da estrutura de zChaff):

Sabemos que h dois ponteiros podendo apontar e para . Seja @ (<valor da varivel>@<nvel
de deciso>), logo os ponteiros no mudam de posio. Seja @ e @ ento um ponteiro
aponta para (em zChaff os ponteiros se movem livremente) e o outro no muda de posio. Seja @
implicando que assuma o valor 1, tornando a clusula satisfeita. Entretanto, suponha que no banco de dados das
variveis, gera um conflito, ento um backtracking executado ao nvel de deciso 1 (nvel inicial de acordo
com o exemplo), apagando todas as decises posteriores a este nvel. A configurao atual um ponteiro apontando
para e outro apontando para j que quando executado um backtracking em zChaff no necessrio refazer
o apontamento inicial dos ponteiros. Seja @ e @ , temos ento que a clusula assume o
valor 1 e no mais visitada. Em zChaff, encontrando uma atribuio que faz com que a clusula seja 1, os ponteiros
se movem tambm (diferentemente de SATO).
Algoritmo Chaff 117

Exemplo da estrutura principal de zChaff.

Ligaes externas
A pagina da web sobre a implementao do zChaff [1]
Pgina do algoritmo xChaff, feito por alunos da Universidade de Princeton, encontrado no Google Code Searh [2]

Referncias
Analise de Algoritmos SAT para Resoluo de Problemas Multivalorados - Jacques Fux [3]
SILVA, F. C. ; FINGER, M. ; MELO, A. C. V.. Lgica para Computao [4]. So Paulo:Thomson Learning,
2006. ISBN 8522105170

Referncias
[1] http:/ / www. princeton. edu/ ~chaff/ zchaff. html
[2] http:/ / www. google. com/ codesearch?hl=en& q=+ chaff+ algorithm+ show:yRz4tsP68Ig:7bEl8NJgHfc:vM8Yj_8jgyg& sa=N& cd=4&
ct=rc& cs_p=http:/ / ftp2. tw. freebsd. org/ pub/ FreeBSD/ distfiles/ cvcl-2. 5. 1. tar. gz& cs_f=cvcl-20060527/ src/ sat/ xchaff_solver. cpp#a0
[3] http:/ / www. dcc. ufmg. br/ pos/ cursos/ defesas/ 23M. PDF
[4] http:/ / www. thomsonlearning. com. br/ detalheLivro. do?id=104261
Visualg 118

Visualg
O Visualg (Visualizador de Algoritmo) um programa que edita, interpreta e executa algoritmos com uma
linguagem prxima do portugus estruturado como um programa normal de computador[1].

Descrio
Um bom recurso para quem est iniciando no aprendizado de algoritmos, no s para praticar a sua criao mas
tambm para melhor entender sua execuo, atravs do visualizador de variveis que funciona como um
depurador[2].
O Visualg atualmente encontra-se na verso 2.5 e possui recursos como simulao da "tela" do computador,
visualizao de variveis, "breakpoints", ajuda on-line, impresso dos fontes e outras caractersticas que auxiliam o
aprendizado das tcnicas de programao.
[1] * Manual do ambiente de programao do Visualg (http:/ / www. cefetsp. br/ edu/ adolfo/ disciplinas/ lpro/ materiais/ visualg. pdf)
[2] *. Tambm permite a criao de funes e procedimentos. Pgina oficial do Visualg (http:/ / www. apoioinformatica. inf. br/ visualg/
objetivos. htm)

Ligaes externas
Apostila PDF de introduo a algoritmos utilizando o Visual-G (http://hermes.ucs.br/carvi/cent/dpei/
haklauck/algoritmos/Linguagem_Visualg2.0.pdf)

Algoritmo Doomsday
O algoritmo Doomsday ou regra Doomsday (algoritmo do "dia do fim do mundo", em ingls), um algoritmo que
permite calcular em qual dia da semana cai um dia de um determinado ano. Seu nome provm do Doomsday, nome
em ingls do ltimo dia de fevereiro, data na que se baseiam os clculos deste algoritmo.

Introduo
Este algoritmo de clculo mental foi inventado pelo matemtico ingls John Conway. Tem a caracterstica de
proporcionar um calendrio perptuo (o calendrio gregoriano, pelo contrrio, funciona em ciclos de 400 anos, tras
os que precisa uma reviso). Parte do fato de que, no calendrio (juliano ou gregoriano) de qualquer ano, os dias 4 de
abril (4/4), 6 de junho (6/6), 8 de agosto (8/8), 10 de outubro (10/10) e 12 de dezembro (12/12) sempre caem no
mesmo dia da semana, sendo este o mesmo dia da semana no que cai o ltimo dia de fevereiro. Tem que ter em
conta que para o calendrio juliano o Doomsday de um ano caia num dia da semana que pode diferir do que lhe
corresponde no calendrio Gregoriano.
O algoritmo consta de trs passos: encontrar o da marcador para o sculo, encontrar o Doomsday do ano, e
encontrar o dia da semana da data que quermos buscar.
Algoritmo Doomsday 119

Clculo do Doomsday de um ano


Primeiro tomamos o dia marcador do sculo. Lembremos que, a todos os efeitos concernientes regra Doomsday,
cada sculo comea com um ano "00" e termina com um ano "99".

Sculo Marcador Mnemnico

1800-1899 Sexta-feira

1900-1999 Quarta-feira Em ingls, "We-in-dis-day"


aproximadamente "ns neste dia" e similar a pronuncia de Wednesday, Quarta-feira em ingls (a maioria de ns
nascimos neste sculo)

2000-2099 Tera-feira "Y-Tue-K"


(Y2K, o ano 2000, foi o incio deste sculo) Tue a abreviatura de Tuesday, Tera-feira em ingls)

2100-2199 Domingo

A continuao, encontramos o Doomsday correspondente ao ano. Para levar isto a cabo segundo Conway,
comeamos por dividir os dois ltimos dgitos do ano (chamamos isto de ) por 12 e ficamos com a parte inteira do
quociente ( que denominamos por ) e o resto (ao que chamamos ). Depois disso, dividimos ao resto por 4 e
pegamos a parte inteira do quociente ( ). Finalmente, determinamos a suma destes trs nmeros para obter o total
. ( possvel dividir por 7 e ficamos com o resto. Este nmero equivalente, e deve ser igual,
soma dos ltimos dois dgitos do ano mais a parte inteira destes dgitos dividido por 4)
Agora, contamos para diante o nmero especificado de dias ( ou o resto que fica ao divid-lo por 7) a partir do dia
marcador, e encontramos o Doomsday que corresponde ao nosso ano.

Por exemplo, para o ano 1966, no sculo XX, temos:

Por o que o Doomsday de 1966 caiu em segunda-feira.


Similarmente, o Doomsday de 2005 caiu tambm em segunda-feira, j que:

Clculo do dia da semana de uma data dada


O dia da semana de uma determinada data pode ser encontrado com facilidade a partir de um Doomsday.
Os dias seguintes sempre caem em Doomday correspondente para qualquer ano no calendrio Gregoriano ou
Juliano:
3 de janeiro 3 anos de cada 4, isto , os anos normais; 4 de janeiro os anos bissextos
O ltimo dia de Fevereiro - o 28 para os anos normais, ou o 29 para os anos bisiestos
"O 0 de Maro" (segundo a extenso que estava atras do calendrio, se corresponde com o ltimo dia de
Fevereiro.)
4 de abril
9 de maio
6 de junho
11 de julho
8 de agosto
5 de setembro
Algoritmo Doomsday 120

10 de outubro
7 de novembro
12 de dezembro
As datas listadas acima foram escolhidas por serem fceis de lembrar: as correspondentes aos meses pares so
simplemente dobros, 4/4, 6/6, 8/8, 10/10, 12/12, e as de quatro dos meses impares (5/9, 9/5, 7/11 e 11/7) podem ser
lembradas usandorecuerdan usando a memorizao "Trabalho de 9 a 5 no 11."
Para as datas em maro, o 7 de maro cai em Doomsday, mas a pseudodata "0 de maro" mais fcil de lembrar, ja
que necessariamente o mesmo que o ltimo dia de fevereiro.
O Doomsday de um ano est diretamente relacionado com os dias da semana para datas no periodo compreendido
entre maro e fevereiro do ano seguinte. Para as datas correspondentes a janeiro e fevereiro do ano atual, devemos
fazer uma distino entre anos normais e bissextos.

Lista de todos os Doomsdays


Janeiro (anos normais) 3, 10, 17, 24, e 31 1-5

Janeiro (anos bissextos) 4, 11, 18, e 25

Fevereiro (anos normais) 7, 14, 21, e 28 6-9

Fevereiro (anos bissextos) 1, 8, 15, 22, e 29

Maro 7, 14, 21, e 28 10-13

Abril 4, 11, 18, e 25 14-17

Maio 2, 9, 16, 23, e 30 18-22

Junho 6, 13, 20, e 27 23-26

Julho 4, 11, 18, e 25 27-30

Agosto 1, 8, 15, 22, e 29 31-35

Setembro 5, 12, 19, e 26 36-39

Outubro 3, 10, 17, 24, e 31 40-44

Novembro 7, 14, 21, e 28 45-48

Dezembro 5, 12, 19, e 26 49-52

Janeiro do ano seguinte 2, 9, 16, 23, e 30

Fevereiro do ano seguinte 6, 13, 20, e 27

Nos anos bissextos, o -simo Doomsday cai na -sima semana ISO. Nos anos normais, o dia depois do
-simo Doomsday cai na semana , assim, num ano normal o nmero da semana de um Doomsday um menor se
este domingo, isto , nos anos normais que comeam em sexta-feira.
Algoritmo Doomsday 121

Frmula para o Doomsday de um ano


As frmulas seguintes para o calculo do Doomsday de um ano so convenientes para o uso com ordenadores:
Para o calendrio Gregoriano:

Para o calendrio Juliano:

Estas frmulas tambm so aplicaveis para o calendrio gregoriano prolptivo e o calendrio Juliano prolptico.
Utilizam a funo parte inteira e a numerao anual astronmica para anos aC.

Algoritmo DPLL
O algoritmo DPLL/Davis-Putnam-Logemann-Loveland um completo algoritmo baseado em backtracking
(re-leitura ou voltar atrs) para decidir a satisfatibilidade das frmulas de lgica proposicional na forma normal
clausal, isto , para solucionar o problema SAT.
O algoritmo foi introduzido em 1962 por Martin Davis, Hilary Putnam, George Logemann e Donald W. Loveland,
sendo um refinamento do algoritmo de Davis-Putnam mais antigo, o qual baseado num processo de resoluo
desenvolvido por Davis e Putnam em 1960. Principalmente em publicaes antigas, o algoritmo de
Davis-Logemann-Loveland freqentemente referenciado como O Mtodo Davis-Putnam ou o Algoritmo DP.
Outros nomes comuns que mantm a distino so DLL e DPLL.
DPLL um procedimento altamente eficiente, e forma a base para os mais eficientes solucionadores SAT e outros
problemas NP-completos que podem ser reduzidos para o problema SAT, e tambm para muitos provadores de
teoremas para os fragmentos da lgica de primeira ordem.

O Algoritmo
A idia bsica do algoritmo a de construir uma valorao para uma frmula fornecida como um conjunto de
clusulas. O algoritmo funciona, inicialmente, selecionando um literal qualquer de uma das clusulas da frmula,
atribuindo-lhe um valor de verdade. Logo aps, simplifica-se a frmula e ento verifica recursivamente se a frmula
simplificada satisfatvel. Se este for o caso, a frmula original tambm satisfatvel; do contrrio, a mesma
verificao recursiva feita, assumindo agora o valor de verdade oposto. Isto conhecido como regra de
diviso(splitting rule), que divide o problema em dois sub-problemas mais simples. O passo de simplificao, em sua
essncia, remove todas as clusulas que se tornam verdade de acordo com a assinatura da frmula, ou seja, as
clusulas que se tornam verdade a partir da atribuio do valor verdade ao literal escolhido, neste passo, removem-se
tambm todos os literais opostos das clusulas remanescentes.
O algoritmo DPLL faz o uso das regras abaixo no passo de simplificao:
Propagao Unitria
Se uma clusula for uma clusula unitria, isto , contm somente um nico literal, esta clusula pode ser
satisfeita somente atribuindo o valor necessrio para fazer este literal se tornar verdadeiro. Na prtica, isto leva
atribuio do valor verdade a outras clusulas que tambm possuem este literal, diminuindo assim o espao
de busca.
Eliminao de Literais Puros
Algoritmo DPLL 122

Se um literal ocorrer somente com uma polaridade na frmula ele ser chamado literal puro. Os literais puros
podem sempre ser atribudos de modo que faa todas as clusulas que os contm se tornarem verdadeiras.
Assim, estas clusulas podem ser suprimidas na busca. Esta otimizao parte do algoritmo original de DPLL,
mas algumas implementaes omitem-na, ou porque o efeito em execues eficientes insignificante ou
devido ao custo para detectar um literal puro.
A insatisfatibilidade de uma atribuio parcial dada detectada quando uma clusula se torna vazia, ou seja, quando
uma clusula tem todos seus literais falsificados atravs da atribuio de valores verdade aos literais opostos. A
insatisfatibilidade completa da frmula somente pode ser detectada aps a busca exaustiva, ou seja, se todas as
atribuies parciais possveis forem insatisfatveis. A satisfatibilidade da frmula detectada quando todas suas
variveis so atribudas de forma que no gere nenhuma clusula vazia, em algumas implementaes modernas,
ocorre quando todas as clusulas forem satisfeitas.

Pseudocdigo
O algoritmo DPLL pode ser sumarizado no seguinte pseudocdigo, onde a frmula na FNC e uma atribuio
parcial de verdade que est inicialmente vazia:

funo DPLL(, )
se todas as clusulas de forem verdadeiras
ento retorne verdadeiro;
se alguma clusula de for falsa
ento retorne falso;
se ocorrer uma clusula unitria c em
ento retorne DPLL(atribuio(c,), c);
se ocorrer um literal puro c em
ento retorne DPLL(atribuio(c,), c);
c := escolha_literal();
retorne DPLL(atribuio(c,), c) ou DPLL(atribuio(c,), c);

No pseudocdigo acima, atribuio(c, ) uma funo que retorna uma frmula obtida pela substituio de
cada ocorrncia de c por verdadeiro, e cada ocorrncia do literal oposto por falso na frmula , e em
seguida, simplificando a frmula resultante. A funo DPLL do pseudocdigo retorna verdadeiro se a
atribuio final satisfaz a frmula ou falso se tal atribuio no satisfaz a frmula. Em uma implementao real, a
atribuio satisfatvel tambm retornada no caso de sucesso (esta foi omitida para maior clareza).

Outras Consideraes
O algoritmo de Davis-Logemann-Loveland depende da escolha do literal ramificado, que o literal considerado
na etapa de backtracking. Em conseqncia, este no exatamente um algoritmo, mas sim uma famlia de
algoritmos, um para cada maneira possvel de escolher o literal ramificado. A eficincia fortemente afetada pela
escolha do literal, existem exemplos no qual o tempo de execuo constante ou exponencial dependendo da
escolha dos literais ramificados.

Referncias
SILVA, F. C. ; FINGER, M. ; MELO, A. C. V.. Lgica para Computao [4]. So Paulo:Thomson Learning,
2006. ISBN 85-221-0517-0
Algoritmo Earley 123

Algoritmo Earley
O algoritmo de anlise gramatical Earley um tipo de programa que subdivide uma entrada (input) para que um
outro possa atuar sobre ela mais comumente usado em lingustica computacional, nomeado aps seu inventor, Jay
Earley. O algoritmo faz uso de programao dinmica.
Os analisadores gramaticais Earley so interessantes porque podem analisar todas as linguagens livre de contexto. O
algoritmo Earley tem tempo de execuo O(n) (onde n o comprimento da cadeia de caracteres analisada), no caso
geral, tempo quadrtico (O(n)) para gramticas no ambgua, e tempo linear para quase toda as gramticas LR(k)?.
Seu desempenho relativamente bom quando as regras so escritas de forma recursivamente.

Exemplos
Considerar a seguinte gramtica simples para expresses aritimticas:

P S # the start rule


S S + M
| M
M M * T
| T
T number

Com as entradas:

2 + 3 * 4

Esta a seqncia do estado conjuntos:

(state no.) Production (Origin) # Comment


---------------------------------
== S(0): 2 + 3 * 4 ==
(1) P S (0) # start rule
(2) S S + M (0) # predict from (1)
(3) S M (0) # predict from (1)
(4) M M * T (0) # predict from (3)
(5) M T (0) # predict from (3)
(6) T number (0) # predict from (5)

== S(1): 2 + 3 * 4 ==
(1) T number (0) # scan from S(0)(6)
(2) M T (0) # complete from S(0)(5)
(3) M M * T (0) # complete from S(0)(4)
(4) S M (0) # complete from S(0)(3)
(5) S S + M (0) # complete from S(0)(2)
(6) P S (0) # complete from S(0)(1)

== S(2): 2 + 3 * 4 ==
(1) S S + M (0) # scan from S(1)(5)
(2) M M * T (2) # predict from (1)
(3) M T (2) # predict from (1)
(4) T number (2) # predict from (3)
Algoritmo Earley 124

== S(3): 2 + 3 * 4 ==
(1) T number (2) # scan from S(2)(4)
(2) M T (2) # complete from S(2)(3)
(3) M M * T (2) # complete from S(2)(2)
(4) S S + M (0) # complete from S(2)(1)
(5) S S + M (0) # complete from S(0)(2)
(6) P S (0) # complete from S(0)(1)

== S(4): 2 + 3 * 4 ==
(1) M M * T (2) # scan from S(3)(3)
(2) T number (4) # predict from (1)

== S(5): 2 + 3 * 4 ==
(1) T number (4) # scan from S(4)(2)
(2) M M * T (2) # complete from S(4)(1)
(3) M M * T (2) # complete from S(2)(2)
(4) S S + M (0) # complete from S(2)(1)
(5) S S + M (0) # complete from S(0)(2)
(6) P S (0) # complete from S(0)(1)

O estado (P S , 0) representa um parse concludo. Este estado tambm aparece em S (3) e S (1), que so frases
completas.
Etapa 1: construo de D0: primeiro conjunto de produes
produes que partem de S (1)
produes que podem ser aplicadas (2)
em sucessivas derivaes mais esquerda (a partir de S)

D0 =
para toda S P (1)
faa D0 = D0 { S /0 }
repita para toda A B/0 D0 (2)
faa para toda B P
faa D0 = D0 { B /0 }
at que o cardinal de D0 no aumente

Etapa 2: construo dos demais conjuntos de produo


n = w conjuntos de produo a partir de D0
ao gerar ar, constri Dr: produes que podem gerar ar+1

para r variando de 1 at n (1)


faa Dr = ;
para toda A ar/s Dr-1 (2)
faa Dr = Dr { A ar/s };
repita
para toda A B/s Dr (3)
faa para toda B P
faa Dr = Dr { B /r }
para toda A /s de Dr (4)
Algoritmo Earley 125

faa para toda B A/k Ds


faa Dr = Dr { B A/k }
atque o cardinal de Dr no aumente

1. cada ciclo gera um conjunto de produes Dr


2. gera o smbolo ar
3. produes que podem derivar o prximo smbolo
4. uma subpalavra de w foi reduzida varivel A
inclui em Dr todas as produes de Ds que referenciaram A;
Etapa 3: condio de aceitao da entrada.
uma produo da forma S /0 pertence a Dn
w foi aceita
S /0 uma produo que
parte do smbolo inicial S
foi includa em D0 ("/0")
todo o lado direito da produo foi analisado com sucesso
("" est no final de )
Otimizao do Algoritmo de Early
ciclos repita-at
podem ser restritos exclusivamente s produes recentemente includas em Dr ou em D0 ainda no-analisadas.

Referncias
J. Aycock and R.N. Horspool. Practical Earley Parsing [1]. The Computer Journal, 45:6:620-630, 2002.

Referncias
[1] http:/ / www. cs. uvic. ca/ ~nigelh/ Publications/ PracticalEarleyParsing. pdf
Algoritmo Needleman-Wunsch 126

Algoritmo Needleman-Wunsch
O algoritmo NeedlemanWunsch tem por objetivo realizar o alinhamento de seqncias global de duas seqncias
(denominadas aqui de A e B). Este algoritmo frequentemente utilizado em Bioinformtica para alinhar seqncias
de protenas ou nucleotdeos. O algoritmo foi proposto na dcada de 1970 por Saul Needleman e Christian Wunsch.[]
Este algoritmo um exemplo de programao dinmica e foi a primeira aplicao desta tcnica a comparao de
sequncias biolgicas.
O primeiro elemento necessrio uma matriz de pesos (scores). Aqui, mede a similaridade entre os
caracteres i e j. Usa-se uma penalidade para espaos (gap penalty) linear d. Um exemplo de matriz seria:
- A G C T

A 10 -1 -3 -4

G -1 7 -5 -3

C -3 -5 9 0

T -4 -3 0 8

ento o alinhamento:

AGACTAGTTAC
CGA---GACGT

com gap penalty de -5, deveria ter o score:

Para encontrar o alinhamento com o maior score, uma matriz F alocada. H uma coluna para caractere da
sequncia A e uma linha para cada caractere da sequncia B.
medida que o algoritmo avana, a matriz preenchida com o score timo do alinhamento entre os i primeiros
caracteres de A e os j primeiros de B. O princpio de optimizao aplicado como segue:
Base:

Recurso, baseada no princpio de otimizao:

O pseudo-cdigo para o algoritmo que calcula F como segue (ndice 0 representa 1a posio):

for i=0 to length(A)-1


F(i,0) d*i
for j=0 to length(B)-1
F(0,j) d*j
for i=1 to length(A)
for j = 1 to length(B)
{
Choice1 F(i-1,j-1) + S(A(i-1), B(j-1))
Choice2 F(i-1, j) + d
Choice3 F(i, j-1) + d
F(i,j) max(Choice1, Choice2, Choice3)
Algoritmo Needleman-Wunsch 127

Quando a matriz F calculada, o elemento na posio do canto direito inferior da matriz o score mximo para
qualquer alinhamento. Para descobrir qual o alinhamento que de fato d este score, deve-se iniciar uma caminhada
da posio direita inferior e ir-se comparando este valor com as 3 possveis fontes (Choice1, Choice2, e Choice3
acima) para descobrir-se de onde este veio. Se veio de Choice1, ento A(i) e B(i) esto alinhados. Se veio de
Choice2 ento A(i) est alinhado com um gap, e se veio de Choice3 ento B(i) est alinhado com o gap.

AlignmentA ""
AlignmentB ""
i length(A)
j length(B)
while (i > 0 AND j > 0)
{
Score F(i,j)
ScoreDiag F(i - 1, j - 1)
ScoreUp F(i, j - 1)
ScoreLeft F(i - 1, j)
if (Score == ScoreDiag + S(A(i-1), B(j-1)))
{
AlignmentA A(i-1) + AlignmentA
AlignmentB B(j-1) + AlignmentB
i i - 1
j j - 1
}
else if (Score == ScoreLeft + d)
{
AlignmentA A(i-1) + AlignmentA
AlignmentB "-" + AlignmentB
i i - 1
}
otherwise (Score == ScoreUp + d)
{
AlignmentA "-" + AlignmentA
AlignmentB B(j-1) + AlignmentB
j j - 1
}
}
while (i > 0)
{
AlignmentA A(i-1) + AlignmentA
AlignmentB "-" + AlignmentB
i i - 1
}
while (j > 0)
{
AlignmentA "-" + AlignmentA
AlignmentB B(j-1) + AlignmentB
Algoritmo Needleman-Wunsch 128

j j - 1
}

Bibliografia
Korf, Ian;Yandell, Mark;Bedell, Joseph. Blast. Beijing:O'Reilly, 2003.339 p. ISBN 0-596-00299-8
Markel, Scott; Len, Darryl. Sequence Analysis. Beijing:O'Reilly, 2003.286 p. ISBN 0-596-00494-X
Setubal, Joo; Meidanis, Joo. Introduction to Computational Molecular Biology. Boston:PWS Publishing
Company, 1997.296 p. ISBN 0-534-95262-3

Ligaes externas
(http://www25.brinkster.com/denshade/NeedlemanWunsch.java.htm) Java Implementation of the
Needleman-Wunsch Algorithm.
Java Applet (http://jordaneg.googlepages.com/app.html)
(http://www.bigbold.com/snippets/posts/show/2199) Needleman-Wunsch Algorithm as Ruby Code.
Java Implementation of the Needleman-Wunsch Algorithm (JDK Version >= 1.4 Needed) (http://sedefcho.
icnhost.net/web/algorithms/needleman_wunsch.html) by Peter Petrov
(http://www.ludwig.edu.au/course/lectures2005/Likic.pdf) A clear explanation of NW and its applications to
sequence alignment

Algoritmo RANDU
RANDU um algoritmo gerador de nmeros aleatrios que foi muito usado nos mainframes das dcadas de 60 e 70.
Ele definido pela frmula:

com mpar.
Ele considerado um dos piores algoritmos geradores de nmeros pseudo-aleatrios j criado. Ele falha
notavelmentee no teste espectral para dimenses maiores que 2.
A razo que levou escolha destes valores em particular que as contas acima podiam ser feitas rapidamente em
computadores que representam os nmeros como valores de 32 bits. Para mostrar o problema que h com estes
valores, considere o seguinte clculo onde cada termo ter seu valor mod extrado. Podemos comear a escrever
a relao escrevendo:

que se torna, aps expandir o fator quadrtico:

o que nos permite ver a enorme correlao que existe entre os termos:

Por causa desta correlao, pontos gerados aleatoriamente em um espao tridimensional se concentram em um
pequeno nmero de planos (15). Outro defeito deste algoritmo que ele gera sempre nmeros mpares. Por causa do
freqente uso do RANDU, muitos resultados de clculos feitos por computadores na dcada de 60 e 70 devem ser
vistos com cautela.
Algoritmo RANDU 129

Exemplos do Algoritmo

Em C
unsigned int _seed;

void inicializa_randu(int i){ /*Inicializa a semente*/


_seed=i;
}

int randu(void){
_seed=(_seed*65539)%(2147483648); /*Clculo do valor*/
return _seed;
}

Referncias
Donald E. Knuth, The Art of Computer Programming, Volume 2: Seminumerical Algorithms, 3rd edition
(Addison-Wesley, Boston, 1998).
Press, William H., et al. (1992). Numerical Recipes in Fortran 77: The Art of Scientific Computing, 2nd edition.
ISBN 0-521-43064-X.

Algoritmo Yarrow
1. REDIRECIONAMENTO Algoritmo yarrow
Algoritmo astronmico 130

Algoritmo astronmico
Os algoritmos astronmicos so algoritmos que so utilizados para calcular efemrides, calendrios e posies
(como nos casos da navegao astronmica e do Sistema de Navegao Global por Satlite). Um exemplo de um
grande e complexo algoritmo o que utilizado para calcular a posio da Lua. Um exemplo simples o do clculo
do dia juliano.

Algoritmo das economias


O Algoritmo das economias realiza a progresso da uma configurao para outra segundo o critrio de minimizao
da funo objetivo, tambm chamado de saving (economia). Um dos problemas clssicos que o algoritmo das
economias pode resolver o Problema de Roteamento de Veculos (PRV).
Um PRV consiste basicamente em estabelecer e organizar rotas ou itinerrios eficientes para veculos realizarem
entregas de mercadorias. Em outras palavras, dispomos de uma frota de veculos idnticos ou no e desejamos
atender um conjunto de clientes, cada um com uma demanda especfica. Todos os veculos devem partir e
retornar a uma mesma origem (depsito) e cada cliente deve ser visitado uma nica vez. O objetivo geral ser
minimizar o "custo total" de transporte no atendimento aos clientes, isto , minimizar custos fixos, custos
operacionais e o nmero de veculos envolvidos no transporte.
Arcos de menor custo devem substituir arcos mais caros dentro da rota que vai sendo melhorada nesses termos. No
procedimento de economia e insero no existe a obrigatoriedade de que a rota seja vivel ao longo do processo de
melhoria. Se alguma soluo alcanada for vivel, ento caracteriza-se a obteno de um limite superior para o
problema.

O Algoritmo das Economias


Primeiramente, forma-se uma soluo inicial para pontos de entrega com rotas, todas contendo o depsito e
um ponto de entrega. Aps esta fase, tenta-se unir duas rotas em uma rota factvel a cada iterao. Sendo e dois
pontos de entrega, o critrio utilizado para eliminar o maior custo dado por:

onde a distncia entre o ponto de entrega e o depsito (aqui representado por ), a distncia entre o
depsito e o ponto de entrega e a distncia entre os dois pontos de entrega.
A cada iterao as rotas so organizadas em conjuntos de pares. Um ponto e um ponto podem formar o par
se:
os pontos de entrega e no esto na mesma rota;
a capacidade de carga do veculo no violada;
nem nem so pontos interiores em uma rota.
Um ponto interior em uma rota significa que seu ponto anterior e seu ponto sucessor no podem ser o depsito.
Algoritmo de Boor 131

Algoritmo de Boor
O algoritmo de Boor permite computar os pontos sobre uma curva B-spline sem conhecer as funes de base
B-Spline e utilizando somente interpolaes lineares sucessivamente a partir dos pontos de controle dessa curva. Ele
pode ser interpretado como uma generalizao do Algoritmo de De Casteljau que utilizado para encontrar os
pontos sobre uma curva de Bzier.

Este artigo sobre matemtica mnimo. Voc pode ajudar a Wikipdia expandindo-o [1].

Referncias
[1] http:/ / pt. wikipedia. org/ w/ index. php?title=Algoritmo_de_Boor& action=edit

Algoritmo de Strassen
Em matemtica, especificamente em lgebra linear, o algoritmo de Strassen, cujo nome uma referncia ao
matemtico Volker Strassen, seu criador, um algoritmo utilizado para realizar a multiplicao de matrizes. Ele
assintoticamente mais rpido que o algoritmo tradicional, e til na prtica ao lidar com matrizes grandes. Todavia
ele mais lento que o algoritmo mais veloz conhecido para a multiplicao de matrizes extremamente grandes.
[carecede fontes?]

Histria
Volker Strassen publicou o algoritmo de Strassen em 1969. Apesar de seu algoritmo ser apenas um pouco mais
rpido do que o mtodo padro para a multiplicao de matrizes, ele foi o primeiro a observar que a abordagem usual
no tima. Seu artigo iniciou a busca por algoritmos ainda mais rpidos tais como o algoritmo de
Coppersmith-Winograd, que mais complexo e foi publicado em 1987.

Algoritmo
Sejam A e B matrizes quadradas sobre um anel R e seja C o produto dessas matrizes, isto ,

Para calcular esse produto, caso as matrizes A e B no sejam de ordem 2n x 2n, deve-se preencher com zeros as linhas
e colunas restantes.
Particiona-se A, B e C em matrizes em blocos de mesmo tamanho

com

Ento

Com essa construo, no houve qualquer reduo no nmero de multiplicaes. Continuam sendo necessrias 8
multiplicaes para calcular as matrizes Ci,j, que a mesma quantidade necessria para realizar a multiplicao de
Algoritmo de Strassen 132

matrizes da forma usual.


Definem-se ento as matrizes

que sero ento usadas para expressar os Ci,j em termos dos Mk. Devido a definio dos Mk pode-se eliminar uma
multiplicao de matrizes e reduzir para 7 a sua quantidade (uma multiplicao para cada Mk) e expressar os Ci,j
como

Faz-se a iterao deste processo de diviso n vezes at que as submatrizes se reduzam a nmeros (elementos do anel
R).
Em implementaes prticas do mtodo de Strassen, a multiplicao das submatrizes suficientemente pequenas
feita da forma usual, pois nesses casos ela mais eficiente.[1] O ponto exato em que o algoritmo de Strassen passa a
ser mais eficiente depende da implementao especfica e do hardware utilizado.

Complexidade assinttica
A multiplicao usual de matrizes exige aproximadamente 2N3 (em que N=2n) operaes aritmticas (adies e
multiplicaes), de modo que sua complexidade assinttica O(N3).
No caso do algoritmo de Strassen, o nmero de adies e multiplicaes necessrias pode ser calculado como segue:
seja f(n) o nmero de operaes para uma matriz 2n2n. Ento, por meio de uma aplicao recursiva do algoritmo
de Strassen algorithm, resulta que f(n)=7f(n-1)+l4n, para alguma constante l que depende do nmero de adies
executadas a cada aplicao do algoritmo. Assim, f(n)=(7+o(1))n, ou seja, a complexidade assinttica da
multiplicao de matrizes de tamanho N=2n por meio do mtodo de Strassen

.[2]
No entanto, a reduo no nmero de operaes aritmticas vem ao preo de uma estabilidade numrica um pouco
reduzida.

Notas
[1] Golub (1996), .
[2] Golub (1996), .

Referncias
Golub, Gene Howard. Matrix computations (em ingls). 3ed. [S.l.]:JHU Press, 1996.3133 p. ISBN
9780801854149
Algoritmo de Wagner-Whitin 133

Algoritmo de Wagner-Whitin
O algoritmo de Wagner-Whitin, criado por Harvey M. Wagner e Thomson M. Whitin em 1958, uma tcnica
matemtica complexa para o dimensionamento de lotes e que faz uma avaliao das vrias formas possveis de se
efectuar uma encomenda de maneira a satisfazer as exigncias em cada perodo do horizonte de planeamento
(Dicionrio, 2008).
Este algoritmo apenas se aplica a produtos com procura determinstica discreta, utilizando a programao dinmica
para minimizao dos custos associados gesto dos stocks e para se obter as quantidades ptimas de encomenda
(Gesto, 2008).
Existem duas propriedades que a soluo ptima deste algoritmo tem de satisfazer (Gonalves, 2000, p. 32):
1. Uma encomenda s chega quando o nvel de stocks atinge o zero.
2. Existe um limite superior para o nmero de perodos para os quais uma encomenda durar.
O algoritmo de Wagner-Whitin, normalmente utilizado como benchmark para avaliao de modelos alternativos,
pois conduz a solues ptimas. No entanto, frequente que se adoptem modelos mais simples para a resoluo
deste tipo de problemas devido sua complexidade (Gesto, 2008).

Formulao de Gonalves
Para este algoritmo utilizam-se as seguintes variveis:
= custo do conjunto de encomendas desde o incio do perodo at ao incio do perodo .
e o incio de um perodo corresponde ao fim do perodo anterior.
= custo de uma encomenda que chega no perodo e que satisfaz a procura at ao incio do perodo .
Equao:

, , 2, 1;

O custo da soluo ptima dado por . Este algoritmo tem incio no ltimo perodo N e repete-se at ao
perodo 1 (Gonalves, 2000, p. 33).
Para a segunda propriedade, que se justifica pelo facto de um aumento do nmero de perodos aumentar os custos de
posse de tal maneira que melhor fazer uma nova encomenda, utiliza-se a seguinte expresso (Gonalves, 2000, p.
33, 38):

Esta propriedade diz que, quando o custo de posse da quantidade maior que o custo de encomenda, ,
ento a soluo ptima dever ter uma encomenda que chegue no perodo (Gonalves, 2000, p. 38).

Formulao de Tersine
Tersine utiliza uma nomenclatura diferente da de Gonalves (Tersine, 1988, p. 165):
= custo de uma encomenda
= fraco do custo de posse por perodo
= custo unitrio

= procura no perodo
Segundo Tersine (1988, p. 165) este algoritmo resolve-se em trs etapas:
Algoritmo de Wagner-Whitin 134

1. Para todas as alternativas possveis de encomendas, para um horizonte de tempo de perodos, calcular a matriz
dos custos variveis totais. Definir como o custo varivel total nos perodos a , de fazer uma encomenda
no perodo que satisfaz as necessidades dos perodos a

2. Definir como o mnimo custo possvel nos perodos 1 a . O algoritmo comea com e calcula
, por esta ordem. O valor de calculado usando a frmula:
= 1, 2, ,

3. De maneira a traduzir a soluo ptima , obtida pelo algoritmo, em quantidades a encomendar, aplicar o
seguinte:
A encomenda final ocorre no perodo e suficiente para satisfazer a procura nos perodos a .

A penltima encomenda ocorre no perodo e suficiente para satisfazer a procura nos perodos a .

A primeira encomenda ocorre no perodo 1 e suficiente para satisfazer a procura nos perodos 1 at .

Exemplo da aplicao deste algoritmo (Tersine, 1988, p. 166):


Um artigo tem um custo unitrio de 50 UM, custo de encomenda de 100 UM e uma fraco do custo de posse por
perodo de 0,02. Suponha-se que o nvel das existncias, no incio do perodo 1, zero e as procuras so as seguintes:

Perodo 1 2 3 4 5 6

Procura 75 0 33 28 0 10

A matriz dos custos variveis totais calculada da seguinte maneira:


= 100 + 1(75 75) = 100
= 100 + 1[(75 75) + (75 75)] = 100
= 100 + 1[(108 75) + (108 75) + (108 108)] = 166
= 100 + 1[(136 75) + (136 75) + (136 108) + (136 136)] = 250
= 100 + 1[(136 75) + (136 75) + (136 108) + (136 136) + (136 136)] = 250
= 100 + 1[(146 75) + (146 75) + (146 108) + (146 136) + (146 136) + (146 146)] = 300
= 100 + 1(0 0) = 100
= 100 + 1[(33 0) + (33 33)] = 133
= 100 + 1[(61 0) + (61 33) + (61 61)] = 189
= 100 + 1[(61 0) + (61 33) + (61 61) + (61 61)] = 189
= 100 + 1[(71 0) + (71 33) + (71 61) + (71 61) + (71 71)] = 229
= 100 + 1(33 33) = 100
= 100 + 1[(61 33) + (61 61)] = 128
= 100 + 1[(61 33) + (61 61) + (61 61)] = 128
= 100 + 1[(71 33) + (71 61) + (71 61) + (71 71)] = 158
Algoritmo de Wagner-Whitin 135

= 100 + 1(28 28) = 100


= 100 + 1[(28 28) + (28 28)] = 100
= 100 + 1[(38 28) + (38 628) + (38 38)] = 120
= 100 + 1(0 0) = 100
= 100 + 1[(10 0) + (10 10)] = 110
= 100 + 1(10 10) = 100

Matriz dos custos variveis totais

O mnimo custo possvel nos perodos 1 a determinado da seguinte maneira (Tersine, 1988, p. 167):

= (100 + 0) = 100
= 100
= 166
=
228
=
228
=
258
Algoritmo de Wagner-Whitin 136

Alternativas dos custos variveis totais

Neste exemplo, a combinao de e , deste modo a ltima encomenda efectuada no perodo 3


e vai satisfazer as necessidades dos perodos 3 a 6; a combinao de e , deste modo a encomenda
feita no perodo 1 e vai satisfazer as necessidades dos perodos 1 a 2. A programao ptima das encomendas e os
custos variveis cumulativos so os seguintes (Tersine, 1988, p. 168):

Referncias
Dicionrio de logstica GS1 Brasil [Em linha]. [S.l.]: GS1 Brasil, 2008 [Consult. 14 Maio 2008]. Disponvel em
WWW:
<URL:http://www.gs1brasil.org.br/lumis/portal/file/fileDownload.jsp?fileId=480F89A81371A66C01137233CA831C57>
Gesto de aprovisionamentos [Em linha]. [S.l.: s.n.], 2008. [Consult. 5 Maio 2008]. Algoritmo de
Wagner-Whitin. Disponvel em
WWW:<URL:http://gestor.no.sapo.pt/5sem/ga/gestao_de_aprovisionamento_teoria.htm>
GONALVES, Jos Fernando Gesto de aprovisionamentos. Ed. rev. Porto: Publindstria, 2000. ISBN
978-972-95794-9-3
TERSINE, Richard J. Principles of inventory and materials management. 3 ed. New York: Elsevier
Science Publishing, 1988. ISBN 978-0-444-01162-6
Algoritmo de Wagner-Whitin 137

Bibliografia
BRAMEL, Julien; SIMCHI-LEVI, David The Logic of Logistics. New York: Springer-Verlag, 1997. ISBN
978-0-387-94921-5
GREEN, James H. - Production & Inventory Control Handbook [Em linha]. 3 ed. USA: McGraw-Hill, 1997.
[Consult. 3 Jun. 2008]. Disponvel em WWW:<URL: http://www.google.pt/books?id=YVW02D29n_8C&
printsec=frontcover&hl=en&source=gbs_summary_r&cad=0 ISBN 978-0-07-024428-3
ORLICKY, Joseph; PLOSSL George W. - Orlicky's Material Requirements Planning [Em linha]. 2 ed. New
York: McGraw-Hill, 1994. [Consult. 6 Jun. 2008]. Disponvel em WWW:<URL: http://books.google.com/
books?id=AUZ-cbdNegkC&printsec=frontcover&hl=pt-BR&source=gbs_summary_r&cad=0 ISBN
978-0-07-050459-2

Ligaes externas
Page flakes [1]

Referncias
[1] http:/ / www. pageflakes. com/ vam/ 8919028

Algoritmo de chave simtrica


Os algoritmos de chave simtrica (tambm chamados de Sistemas de Chave Simtrica, criptografia de chave
nica, ou criptografia de chave secreta) so uma classe de algoritmos para a criptografia, que usam chaves
criptogrficas relacionadas para as operaes de cifragem e decifragem. A operao de chave simtrica mais
simples, pois pode existir uma nica chave entre as operaes. A chave, na prtica, representa um segredo, partilhado
entre duas ou mais partes, que podem ser usadas para manter um canal confidencial de informao. Usa-se uma
nica chave, partilhada por ambos os interlocutores, na premissa de que esta conhecida apenas por eles.[]
Outros termos para criptografia de chave simtrica so: criptografia de chave secreta, de chave nica, de chave
compartilhada, de uma chave e de chave privada. O uso do ltimo termo pode s vezes se confundir com o
componente chave privada da criptografia de chave pblica. A criptografia de chave simtrica para ser separada de
criptografia de chave assimtrica.

Tipos de algoritmos de chave simtrica


Os algoritmos de chave simtrica podem ser divididos em cifras de fluxo (ou contnuas) e em cifras por bloco.
As cifras de fluxo cifram os bits da mensagem um a um, enquanto que as cifras por bloco pegam um nmero de
bits e cifram como uma nica unidade.
Os blocos cifrados aceitam um nmero de bits e cifram em unidades. Um bloco de 64 bits comum. O algoritmo
AES aprovado pelo NIST em dezembro de 2001 usa blocos de 128 bits.
Algoritmo de chave simtrica 138

Implementaes
Exemplos de algoritmos simtricos populares e bem reputados incluem Twofish, Serpent, AES, Blowfish, CAST5,
RC4, 3DES, e IDEA.

Velocidade
Os algoritmos de chave simtrica so geralmente menos custosos computacionalmente do que os algoritmos de
chave assimtrica. Na prtica, isto significa que um algoritmo de chave assimtrica de qualidade pode ser centenas
ou milhares de vezes mais lento do que um algoritmo de chave simtrica de qualidade equivalente.

Segurana
Este sistema tanto ou mais seguro quanto o for (1) a prpria chave e (2) o meio em que ela foi dada a conhecer a
ambos interlocutores comum a chave estar guardada num local que se pensa ser seguro.

Limitaes
A desvantagem dos algoritmos de chave simtrica a exigncia de uma chave secreta compartilhada, com uma cpia
em cada extremidade. As chaves esto sujeitas descoberta potencial por um adversrio criptogrfico, por isso
necessitam ser mudadas freqentemente e mantidas seguras durante a distribuio e no servio. Essa exigncia de
escolher, distribuir e armazenar chaves sem erro e sem perda, conhecida como gerenciamento de chave.

A fim de garantir a comunicao segura entre toda uma populao de pessoas, um total de chaves so

necessrias. Freqentemente os algoritmos assimtricos so muito mais lentos, so usados no incio de uma sesso
para distribuir chaves simtricas, ento os algoritmos de chave simtrica mais elevados aumentam sua velocidade.
Os mesmos problemas de distribuio de chave de confiana existem ainda no nvel assimtrico, mas so um tanto
mais tratveis. Entretanto, a chave simtrica gerada quase sempre em tempo real. Os algoritmos de chave simtrica
no podem ser usados para finalidades de autenticao. Para finalidades de autenticao, geralmente so usadas
funes de hash, por exemplo MD5.

Reversibilidade
As Funes de Criptografia devem, por definio, ser reversveis desde que voc precise estar apto ambas cifras e
(providenciado que voc tenha a chave certa) mensagens decifradas. Vrios mtodos foram usados historicamente
para controlar isto. Houve as cifras do livro, em que a chave compartilhada relacionada a algum ndice em um
livro, as cifras da autochave em que a chave derivada parcialmente do plaintext (arquivo de texto), as cifras de
grade (supostamente inventadas primeiramente pelo matemtico italiano Gerolamo Cardano) em que cada partido
tem partes de papel idnticas com os furos cortados para colocar sobre a mensagem baixa a fim extrair a mensagem
codificada, etc. Em pocas modernas, depois que os computadores se tornaram disponveis, a maioria de cifras
simtricas foram baseadas em rounds repetidos. Um esquema muito simples para cada round usado geralmente
repetidamente como no seguinte exemplo genrico. Este mtodo geral atribudo geralmente a Horst Feistel. Os bits
a serem codificados so divididos em duas pores de P1 e P2. P1 inalterado, P2 adicionado a uma funo
misturada de sentido nico f (variado por uma chave) de P1. Os dois resultados ento so trocados. Isto chamado
de um round. Isto onde a chave p1 e a chave p2, so vetores do bit; , um operador da concatenao e f uma
funo tanto que:
Desde que a sada do round ainda tenha o acesso ao valor P1, e a adio uma operao
reversvel, ento esta operao pode ser desfeita, para toda funo f de um nico sentido. Ao mesmo tempo em que
um nico round inseguro, p1 inalterado, repetindo a operao mais do que uma vez, freqentemente com
Algoritmo de chave simtrica 139

diferente funes e chaves rounds, melhora a fora consideravelmente. Para decifrar rounds mltiplos,
conseqentemente cada round desfeito na ordem inversa, para a decodificao, as chaves so aplicadas em ordens
inversas. Aps diversos rounds (tipicamente entre 8 e 64) de processamento, a sada torna-se assim encriptada que,
no exemplo de cifras bem projetadas, nada mais rpido do que a busca da chave de fora brutal praticvel. Com
uma chave suficientemente longa, um ataque de fora brutal pode ser tornado impraticvel.

Ligaes externas
Criptografia - Tipos de Algoritmos (http://www.lsi.usp.br/~elima/seguranca_cripto.html)
Criptografia - Tipos de Criptografias (http://www.gta.ufrj.br/grad/01_2/tls/toc2.htm)

Algoritmo de multiplicao de Booth


O algoritmo de multiplicao de Booth um algoritmo de multiplicao para nmeros binrios com sinal na
notao complemento de dois. O algoritmo foi inventado por Andrew D. Booth em 1951 enquanto fazia pesquisas
sobre Cristalografia no Colgio Birkbeck em Bloomsbury, Londres. Booth usava calculadoras que eram mais rpidas
em deslocar do que em somar e criou o algoritmo para aumentar sua velocidade. O algoritmo de Booth interessante
para o estudo de arquitetura de computadores.

Processo
Se x a representao binria em complemento de dois do multiplicando e y a do multiplicador :
Desenhe uma grade com 3 linhas, com x + y + 1 colunas e um espao para cada bit. Chame as linhas de A
(adio), S (subtrao), e P (produto).
Preencha os primeiros x bits de cada linha com:
o A: o multiplicando
o S: o negativo do multiplicando
o P: zeros
Preencha os prximos y bits de cada linha com :
o A: zeros
o S: zeros
o P: o multiplicador
Coloque zero no ltimo bit de cada linha.
Repita o procedimento abaixo 'nmero de bits de y' vezes:
1. Se os dois ltimos bits do produto so:
o 00 ou 11: no faa nada.
o 01: P = P + A. Ignore qualquer estouro.
o 10: P = P + S. Ignore qualquer estouro.
2. Desloque P para a direita um bit. Neste passo, o sinal de P deve ser preservado, isto , se o bit mais
significativo for 1, ento aps o deslocamento o novo bit mais significativo tambm deve ser 1. Caso o bit mais
significativo for 0, aps o deslocamento o novo bit mais significativo deve tambm ser 0.
Descarte o primeiro (ns contamos da direita para esquerda quando lidamos com bits) bit do produto para o
resultado final.
Algoritmo de multiplicao de Booth 140

Exemplo
Encontre 3 (-4):
A = 0011 0000 0
S = 1101 0000 0
P = 0000 1100 0
Execute o loop quatro vezes :
1. P = 0000 1100 0. Os ltimos dois bits so 00.
P = 0000 0110 0. Um deslocamento a direita.
2. P = 0000 0110 0. Os ltimos dois bits so 00.
P = 0000 0011 0. Um deslocamento a direita.
3. P = 0000 0011 0. Os ltimos dois bits so 10.
P = 1101 0011 0. P = P + S.
P = 1110 1001 1. Um deslocamento a direita.
4. P = 1110 1001 1. Os ltimos dois bits so 11.
P = 1111 0100 1. Um deslocamento a direita.
O produto 1111 0100, que representa -12.
A tcnica mencionada acima inadequada quando o multiplicando um nmero negativo mais comprido que o que
pode ser representado (i.e. se o multiplicando tem 8 bits ento esse valor -128). Uma correo possvel para esse
problema adicionar mais um bit a esquerda de A, S e P. Abaixo, ns demonstramos a tcnica melhorada
multiplicando -8 por 2 usando 4 bits para o multiplicando e o multiplicador:
A = 1 1000 0000 0
S = 0 1000 0000 0
P = 0 0000 0010 0
Faa o loop quatro vezes:
1. P = 0 0000 0010 0. Os ltimos dois bits so 00.
P = 0 0000 0001 0. Deslocar a direita.
2. P = 0 0000 0001 0. Os ltimos dois bits so 10.
P = 0 1000 0001 0. P = P + S.
P = 0 0100 0000 1. Deslocar a direita.
3. P = 0 0100 0000 1. Os ltimos dois bits so 01.
P = 1 1100 0000 1. P = P + A.
P = 1 1110 0000 0. Deslocar a direita.
4. P = 1 1110 0000 0. Os ltimos dois bits so 00.
P = 1 1111 0000 0. Deslocar a direita.
O produto 11110000 (depois de descartar o primeiro e o ltimo bit) que -16.
Algoritmo de multiplicao de Booth 141

Como funciona
Considere um multiplicador positivo consistindo de um bloco de 1s rodeados por 0s. Por exemplo, 00111110. O
produto dado por :

onde M o multiplicando. O nmero de operaes podem ser reduzidas a duas, reescrevendo a mesma como

De fato, pode ser mostrado que qualquer seqncia de 1's em um nmero binrio pode ser quebrada na diferena de
dois nmeros binrios:

Da, podemos efetivamente substituir a multiplicao por uma string de 1s no nmero original por operaes mais
simples, adicionando o multiplicador, deslocando o produto parcial assim formado por lugares apropriados e ento,
finalmente, subtraindo o multuiplicador. Isso faz uso do fato de que no se deve fazer nada alm de deslocar
enquanto lidamos com 0s no multiplicador binrio, e similar a usar propriedade matemtica que
enquanto multiplicamos por 99.
Este esquema pode ser estendido para qualquer nmero de blocos de 1s no multiplicador (incluindo o caso de um
nico 1 em um bloco). Assim,

O algoritmo de Booth segue esse esquema por executar uma adio quando encontra o primeiro dgito de um bloco
de 1s (0 1) e uma subtrao quando encontra o final de um bloco (1 0). Isso funciona tambm para nmerios
negativos. Quando os 1s no multiplicador so agrupados em blocos longos, o algoritmo de Booth executa menos
adies e subtraes que o algoritmo normal de multiplicao.

Ligaes externas
Radix-4 Booth Encoding [1]
Radix-8 Booth Encoding [2] in A Formal Theory of RTL and Computer Arithmatic [3]

Referncias
1. Collin, Andrew. Andrew Booth's Computers at Birkbeck College [4]. Resurrection, Issue 5, Spring 1993. London:
Computer Conservation Society.
2. Patterson, David and John Hennessy. Computer Organization and Design: The Hardware/Software Interface,
Second Edition. ISBN 1-55860-428-6. San Francisco, California: Morgan Kaufmann Publishers. 1998.
3. Stallings, William. Computer Organization and Architecture: Designing for performance, Fifth Edition. ISBN
0-13-081294-3. New Jersey: Prentice-Hall, Inc.. 2000.
Algoritmo de multiplicao de Booth 142

Referncias
[1] http:/ / www. geoffknagge. com/ fyp/ booth. shtml
[2] http:/ / www. russinoff. com/ libman/ text/ node38. html
[3] http:/ / www. russinoff. com/ libman/
[4] http:/ / www. cs. man. ac. uk. / CCS/ res/ res05. htm#e

Algoritmo de pesquisa
Costuma-se chamar de "Algoritmo de Pesquisa", tanto em artes e cincias, de forma acadmica, ou para discusso
filosfica universal, em termos de estudos em Universidades, a toda a simplificao ou tentativa de visualizao para
anlise e sntese-terica(para submeter-se ou s teorias), sejam atravs de frmulas matemticas-quantitativas, ou
esquemticas tericas, visando racionalizao-cientfica ou artstica. O chamado "esbucho-artstico", em um
quadro ou planilha de arquitetura, exemplo de algoritmo de pesquisa.
Na rea de cincia-poltica, os planos ou programas de governo, com suas metas, so exemplos, tambm, como
outros chamados tambm, de forma geral, de "modelos", "projetos", e outros nomes, que sempre deve identificar
algo passvel de ser estudado ou desenvolvido.

Algoritmo do Avestruz
1. REDIRECIONAMENTO Algoritmo do avestruz

Algoritmo do Banqueiro
1. REDIRECIONAMENTO Algoritmo do banqueiro
Algoritmo do Castor 143

Algoritmo do Castor
1. REDIRECIONAMENTO Algoritmo do castor

Algoritmo embrulho para presente


O algoritmo de embrulho para presente ou do
embrulho de presentes (gift wrapping) um algoritmo
que serve para encontrar o fecho convexo de um
conjunto de pontos em dimenses arbitrrias. Trata-se
de uma generalizao do algoritmo de Jarvis,
desenvolvida por Chand e Kapur.

Este artigo sobre matemtica mnimo. Voc pode


ajudar a Wikipdia expandindo-o [1].

Ilustrao do algoritmo do embrulho de presentes

Referncias
[1] http:/ / pt. wikipedia. org/ w/ index. php?title=Algoritmo_embrulho_para_presente& action=edit
Algoritmo para extrao da raiz quadrada 144

Algoritmo para extrao da raiz quadrada


Em matemtica, uma raiz quadrada de um nmero x um nmero que, quando multiplicado por si prprio, iguala
x.[1] A raiz quadrada positiva de um nmero real no negativo x simbolizada por Por exemplo: porque
4 4 = 16, e As razes quadradas so importantes para a resoluo de equaes quadrticas (equaes
do 2 grau). A extenso da funo raiz quadrada a nmeros negativos leva criao dos nmeros imaginrios e ao
corpo dos nmeros complexos.
O primeiro uso do smbolo da raiz quadrada remonta ao sculo XVI. Pensa-se que a sua origem est na letra r
minscula, primeira letra de radix (em latim, lado). Pode tambm ser uma operao geomtrica - a partir de um
segmento de recta dado determinar um outro cujo comprimento seja igual raz quadrada do inicial[2].

Propriedades
As seguintes propriedades da funo raiz quadrada so vlidas para todos os nmeros reais positivos x e y:

sempre que x y

para todo o nmero real x (ver valor absoluto)

A aplicao da funo raiz quadrada a um nmero racional d em geral origem a um nmero algbrico;
racional se e somente se x puder ser representado por uma razo entre dois quadrados perfeitos. Por exemplo,
irracional (ver artigo raiz quadrada de dois).
Geometricamente, a funo raiz quadrada transforma a rea de um quadrado no comprimento do seu lado.
Admita-se que x e a so reais, e que x = a, e que se quer determinar x. Um erro frequente aplicar a funo raiz
quadrada e concluir que x = Tal no verdade uma vez que a raiz quadrada de x no x, mas sim o seu valor
absoluto |x| (uma das propriedades acima mencionadas). Portanto, apenas se pode concluir que |x| = ou, de outra
forma, que
Quando se pretende provar que a funo raiz quadrada contnua ou diferencivel, ou no clculo de certos limites, a
seguinte propriedade de grande utilidade:

Tal vlido para quaisquer x e y no negativos, sendo pelo menos um deles diferente de zero.
A funo tem o seguinte grfico:
A funo contnua para todo o x no negativo, e diferencivel para todo o x positivo. (no diferencivel para x = 0
uma vez que o declive da tangente curva nesse ponto +. A sua derivada dada por

As sries de Taylor para x = 1 podem ser encontradas usando o teorema binomial:

para |x| < 1.


Algoritmo para extrao da raiz quadrada 145

Meios de calcular a Raiz quadrada


As dificuldades de computar razes quadradas usando-se nmeros romanos e a notao romana para fraes levou
Vitrvio a a declarar que extrair a raiz quadrada de 200 no pode ser feito por nmeros [3].

Calculadoras
As calculadoras portteis tipicamente implementam boas rotinas, tais como o mtodo de Newton (frequentemente
com uma estimativa inicial igual a 1), para computar a raiz quadrada de um nmero real positivo.[4][5] Ao computar
razes quadradas com tbuas de logaritmos ou rguas de clculo, pode-se explorar a identidade

Mtodo babilnio
Um algoritmo frequentemente usado para aproximar conhecido como "mtodo babilnio" (porque,
especula-se, este era o mtodo usado na Mesopotmia para calcular a raiz quadrada[6], e o mesmo obtido ao
aplicar-se o Mtodo de Newton equao Para se encontrar a raiz quadrada de um nmero real n,
processa-se como a seguir:
1. Inicie com um nmero positivo arbitrrio r (preferencialmente prximo da raiz);
2. Substitua r pela mdia de r e
3. Repita o segundo passo para obter uma aproximao melhor.
Este algoritmo quadraticamente convergente, que significa que o nmero de dgitos corretos de r dobra a cada
repetio.
Ele, entretanto, no d a raiz exata, mas d uma tima aproximao. Abaixo, um exemplo do mtodo para melhor
compreenso

Mtodo Babilnio (exemplificado)


O mtodo babilnio um mtodo que d uma aproximao da raiz quadrada. Ou seja no um mtodo perfeito,
apresenta uma margem de erro (muito pequena, desprezvel para clculos que no necessitam muita preciso. De
fato, dependendo da aproximao todas as casas decimais estaro corretas). Mas se for para clculos simples, bom,
pois no necessrio tanto rigor.
Digamos que se queira extrair a raiz quadrada de 66.
1. Ache o quadrado perfeito que mais se aproxima com o nmero.
5=25
6=36
7=49
8=64
9=81
Nesse caso o quadrado que mais se aproxima 64. Nota: Usa-se sempre o quadrado menor que o nmero procurado,
mesmo que o quadrado maior seja mais prximo.
1. Extraia a raiz quadrada do quadrado que mais se aproximou. A raiz quadrada de 64 8. Nesse exemplo
chamaremos 8 como A.
2. Divida o nmero original por A, at que se tenha o dobro de casas decimais que A.
66:8 = 8,2
Nesse exemplo chamaremos 8,2 como B
1. Somamos A com B e dividimos por 2. Esse nmero chamaremos de C.
Algoritmo para extrao da raiz quadrada 146

8 + 8,2 = 16,2
16,2 : 2 = 8,1
1. Agora dividimos o nmero original (nesse caso 66) por C at que se tenha o dobro de casas decimais de C. O
resultado chamaremos de D.
66 : 8,1 = 8,148
1. Somamos C e D e dividimos por 2.Esse nmero chamaremos de E.
8.1 + 8.148 = 16.248
16.248 : 2 = 8,124
Essa seria a raiz quadrada de 66. Poderamos dividir o 66 por E e continuar esse mesmo processo, s que isso
acabaria por dar algumas imprecises. E como geralmente no se necessita uma raiz quadrada precisssima, ento
podemos dizer que desnecessrio prosseguir. Mas caso queira continuar, o algoritmo continua o mesmo e voc
pode tentar chegar 10 ou 12 casas decimais. Mas o resultado seria um pouco impreciso.
Ento podemos dizer que a raiz quadrada de 66 aproximadamente 8,124. Ao testarmos numa calculadora:
8,124038405... Ou seja esse mtodo bom para achar a raiz quadrada.

Um algoritmo exato semelhante ao da diviso longa


Este mtodo, apesar de muito mais lento que o mtodo Babilnio, tem a vantagem de ser exato: dado um nmero que
tem uma raz quadrada cuja representao decimal termina, ento o algoritmo termina e produz a raiz quadrada
correta aps um nmero finito de passos. Ele pode ser usado, portanto, para checar se um dado nmero um
quadrado perfeito.
Escreva o nmero em decimal e divida-o em pares de digitos, comeando do ponto. Os nmeros so colocados de
uma maneira similar ao algoritmo de diviso longa e a raz quadrada final aparecer acima do nmero original.
Para cada iterao: Traga para baixo o par o mais significativo dos dgitos ainda no usados e adicione-os a todo o
restante. Este o valor atual consultado em etapas 2 e 3. Se r denotar a parte do resultado encontrado assim distante,
determine o maior digito x que no faz y = x(20r + x) para exceder o valor atual. Coloque o dgito novo x na linha do
quociente. Subtraia y do valor atual para dar forma a um restante novo. Se o restante for zero e no houver mais
dgito para trazer para baixo o algoritmo terminou. Se no continue com etapa 1. Exemplo: Que a raiz quadrada de
152,2756?

____1__2._3__4_
| 01 52.27 56 1
x 01 1*1=1 1
____ __
00 52 22
2x 00 44 22*2=44 2
_______ ___
08 27 243
24x 07 29 243*3=729 3
_______ ____
98 56 2464
246x 98 56 2464*4=9856 4
_______
00 00 O algoritmo termina: a resposta 12,34

Embora demonstrado aqui para nmeros da base 10, o procedimento trabalha para algumas bases, incluindo a base 2.
Na descrio acima, 20 meios dobram a base de nmero usada, no exemplo de binrio isto seriam realmente 100 .
Algoritmo para extrao da raiz quadrada 147

que o algoritmo est no fato muito mais fcil de executar na base 2, como em cada etapa somente os dois dgitos 0 e
1 tm que ser testados.

Equao de Pell
A equao de Pell permite encontrar a parte inteira de uma raiz quadrada simplesmente subtraindo inteiros mpares.
Por exemplo, para calcular a parte inteira da raiz quadrada de 19, calcula-se a sequncia:
1. 19 1 = 18

2. 18 3 = 15

3. 15 5 = 10

4. 10 7 = 3

5. Como 3 menor que 9, a sequncia para aqui. Como 4 subtraes foram efetuadas, ento a resposta 4.

Ou seja, para calcular a parte inteira da raiz quadrada n de um nmero inteiro positivo m, pode ser usado o seguinte
trecho de programa:

n = 0
i = 1
while (m >= i){
m = m i;
i = i + 2;
n = n + 1;
}

Observe-se que se n a raiz exata, o valor final de m zero.

Encontrando razes quadradas usando aritmtica mental


Baseado na Equao de Pell's este um mtodo para obter a raiz quadrada simplesmente subtraindo nmeros
mpares.
Ex: Para obter ns comeamos com a seguinte sequncia:
1.
2.
3.
4.
5.
5 passos foram tomados e isso nos leva que a parte inteira da raiz quadrada de 27 5.
Efetua-se: resultado do ltimo passo * 100 e nmero de passos da sequncia anterior * 20 + 1
e
1.
O prximo nmero 1.
Em seguida efetua-se: resultado do ltimo passo * 100 e ((nmero de passos da primeira sequncia * 10) + (nmero
de passos da segunda sequncia)) * 20 + 1
e
1.
2.
3.
4.
Algoritmo para extrao da raiz quadrada 148

5.
6.
7.
8.
9.
O prximo nmero 9.
O resultado nos d 5.19 com uma aproximao da raiz quadrada de 27.

Mtodo das Fraes Continuadas


Irracionais Quadrticos, que so os nmeros envolvendo razes quadradas na forma (a+b)/c, so compostos por
perodos de fraes continuadas. Isto faz com que elas sejam fceis de serem calculadas recursivamente, dado o
perodo. Por exemplo, para calcular 2, ns temos que usar o fato de que 2-1 = [0;2,2,2,2,2,...], e usar a relao
recursiva: an+1=1/(2+an) com a0=0 para obter 2-1 dada uma preciso especificada por n nveis de recursividade, e
adicionar 1 ao resultado para obter 2.

Raiz quadrada de nmeros complexos


Para todo nmero complexo z no-nulo existem exatamente dois nmeros w tais que w = z. A definio usual de z
como segue: se z = r exp(i) representado em coordenadas polares com - < , ento fazemos z = r
exp(i/2). Isto definido, a funo raz quadrada holomrfica em todo ponto exceto nos nmeros no-positivos reais
(onde ela no nem contnua). A srie de Taylor acima para (1+x) continua vlida para nmeros complexos x com
|x| < 1.
Quando o nmero complexo est na forma retangular, a seguinte frmula pode ser usada:

onde o sinal da parte imaginria da raiz o mesmo que o sinal da parte imaginria do nmero original.
Perceba que, por causa da natureza descontnua da funo raiz quadrada no plano complexo, a regra
em geral falsa. Se for tomada erroneamente como verdadeira, esta regra pode levar a numerosas "provas" erradas,
como por exemplo a seguinte prova real que mostra que -1 = 1:

A terceira igualdade no pode ser justificada.


Porm, a regra pode estar errada apenas at um fator -1, verdadeiro para ambos tanto + como -
(mas no ambos ao mesmo tempo). Perceba que portanto e finalmente com o
uso de = e

Razes quadradas de matrizes e operadores


Se A uma matriz positiva definida (ou um operador positivo definido), ento existe exatamente uma matriz positiva
definida (idem para operador) B tal que B = A; definimos
Mais genericamente, para cada matriz ou operador normal A existem operadores normais B tais que B = A. Em
geral, h vrios operadores B para cada A e a funo raiz quadrada no pode ser definida para operadores normais de
uma maneira satisfatria.
Algoritmo para extrao da raiz quadrada 149

Raiz quadrada dos 20 primeiros nmeros naturais


1=1
2 1,4142135623 7309504880 1688724209 6980785696 7187537694 8073176679 7379907324 78462
3 1,7320508075 6887729352 7446341505 8723669428 0525381038 0628055806 9794519330 16909
4=2
5 2,2360679774 9978969640 9173668731 2762354406 1835961152 5724270897 2454105209 25638
6 2,4494897427 8317809819 7284074705 8913919659 4748065667 0128432692 5672509603 77457
7 2,6457513110 6459059050 1615753639 2604257102 5918308245 0180368334 4592010688 23230
8 2,8284271247 4619009760 3377448419 3961571393 4375075389 6146353359 4759814649 56924
9=3
10 3,1622776601 6837933199 8893544432 7185337195 5513932521 6826857504 8527925944 38639
11 3,3166247903 5539984911 4932736670 6866839270 8854558935 3597058682 1461164846 42609
12 3,4641016151 3775458705 4892683011 7447338856 1050762076 1256111613 9589038660 33818
13 3,6055512754 6398929311 9221267470 4959462512 9657384524 6212710453 0562271669 48293
14 3,7416573867 7394138558 3748732316 5493017560 1980777872 6946303745 4673200351 56307
15 3,8729833462 0741688517 9265399782 3996108329 2170529159 0826587573 7661134830 91937
16 = 4
17 4,1231056256 1766054982 1409855974 0770251471 9922537362 0434398633 5730949543 46338
18 4,2426406871 1928514640 5066172629 0942357090 1562613084 4219530039 2139721974 35386
19 4,3588989435 4067355223 6981983859 6156591370 0392523244 4936890344 1381595573 28203
20 4,4721359549 9957939281 8347337462 5524708812 3671922305 1448541794 4908210418 51276

Ligaes externas
Extrao da raiz quadrada [7]
Alegria Matemtica: Extrao da raiz quadrada de um nmero [8]
Delphi Software para aprender a calcular a raiz quadrada [9]

Referncias
[1] Joo Jos Luiz Vianna, Elementos de Arithmetica, Captulo II. Texto disponvel no Wikisource
[2] Construes geomtricas rigorosas (http:/ / mat. absolutamente. net/ cg_o_r. html)
[3] Vitrvio, Sobre Arquitetura, Livro IX, Introduo, 4 UNIQ-nowiki-0-0c3c8feebedd2af8-QINU (http:/ / penelope. uchicago. edu/ Thayer/ E/
Roman/ Texts/ Vitruvius/ 9*. html)
[6] )
[7] http:/ / www. cefetsp. br/ edu/ sinergia/ 4p53c. html
[8] http:/ / pessoal. sercomtel. com. br/ matematica/ alegria/ raizquad/ raizquad. htm
[9] http:/ / www. raizcuadrada. es:8888
Algoritmo probabilstico 150

Algoritmo probabilstico
Um algoritmo probabilstico um algoritmo que utiliza a probabilidade como parte de sua lgica. Na prtica, isso
significa que a mquina que implementa o algoritmo deve acessar um gerador de nmeros pseudo-aleatrios. O
algoritmo utiliza bits aleatrios como um guia para o seu comportamento. Diferente dos algoritmos convencionais,
um algoritmo probabilstico, dada uma mesma sequncia de entrada, no necessariamente leva a um mesmo estado
final.

Definio
Para demonstrar os exemplos a seguir deve-se assumir um modelo. Um computador inicia seu trabalho sempre num
estado inicial e, dado uma seqncia de smbolos de entrada, esta mquina passar a outros estados. Numa
mquina clssica no-probabilstica (determinista), as transies dependem apenas da seqncia de smbolos, ou
seja, dado um estado , a transio deste para um outro estado sempre a mesma dado o recebimento do mesmo
smbolo.
Em um algoritmo probabilstico, uma mesma seqncia de entrada no leva sempre a um mesmo estado final de
computao. Isso acontece porque as transies entre estados dependem alm do estado atual e do smbolo recebido,
tambm de uma escolha aleatria. Imagine, num caso simplificado que, alm de ler um smbolo para decidir o
prximo passo de computao, a mquina ainda "lance uma moeda" para decidir se passa ou no ao prximo estado.

Motivao
O estudo de algoritmos computacionais geralmente busca solues baseadas nos resultados do pior caso. Isso
significa que uma soluo classificada dado o seu desempenho na execuo de uma tarefa no seu pior caso. Mas
em vrios outros problemas, o estudo do desempenho no caso mdio j o suficiente. Ou seja, quando um algoritmo
geralmente resolve um problema melhor que qualquer outro. Estas solues podem at mesmo ter uma probabilidade
pequena de retornar respostas erradas. Para esses casos os algoritmos probabilsticos podem ser bastante teis.
Para ilustrar esta motivao pode-se usar o exemplo de uma busca. Dado um vetor de tamanho preenchido
uniformemente com os elementos , o problema consiste em encontrar um dentro do mesmo. A forma
mais bvia de executar tal busca verificar cada uma das posies do vetor. Usando este algoritmo verificaremos, no
pior caso da entrada (vetor ordenado), posies. A verdade que nenhum algoritmo determinstico termina esta
tarefa mais rpido que isso para todos os casos de entrada.
Neste mesmo problema, pode-se fazer uso de um algoritmo probabilstico muito simples para melhorar este
resultado. Caso pesquisemos aleatoriamente as posies do vetor, teremos uma alta probabilidade de encontrar
rapidamente o valor desejado para qualquer que seja a entrada. Resta apenas uma pequena probabilidade de que a o
fator aleatrio demore para terminar a busca, mas isso independe da entrada.
Algoritmo probabilstico 151

Programao
Uma mquina probabilstica pode ser vista como uma particularidade das mquinas no determinsticas. O
no-determinismo implica que a mquina pode seguir vrios caminhos dados o par: estado e smbolo de entrada
. A diferena deste modelo para o da mquina probabilstica que este ltimo escolhe aleatoriamente o caminho
a seguir, enquanto aquele, ao menos teoricamente, busca o melhor caminho dentro de todas as possibilidades.
Para a implementao de algoritmos probabilsticos uma importante definio a instruo de atribuio aleatria,
. Esta instruo diz respeito a escolha aleatria de um elemento do conjunto para a
atribuio da varivel .

Modelos

Autmatos finitos probabilsticos


No existe apenas uma representao para a teoria de autmato finito. Uma delas apresenta um modelo baseado em
matrizes que particularmente interessante, neste caso, pois a evoluo da representao de autmatos finitos para
autmatos finitos probabilsticos muito clara. Seguem as trs principais caractersticas:
Para cada smbolo do alfabeto existe uma matriz de transio que expressa as probabilidades de transio
entre estados dado a leitura do smbolo ;
Os estados so representados atravs de vetores coluna;
Pode-se calcular a aceitabilidade de uma palavra xyz com a seguinte frmula:
.
Os autmatos finitos so um caso particular dos autmatos finitos probabilsticos para transies com probabilidade
0 (para transio no possvel) ou 1 (para transio possvel). Ou seja, a deciso executada com 100% de certeza.
Vejamos um exemplo:
No caso do autmato finito
Um autmato que reconhece as palavras binrias com o formato 00*11*00* pode ser escrito assim:

Os estados:

As matrizes de transio:

Um exemplo de aceitao e rejeio:


ACEITAO:

REJEIO:

No caso do autmato finito probabilstico


Algoritmo probabilstico 152

O mesmo modelo acima pode ser modificado para um autmato finito probabilstico mudando apenas as matrizes de
possibilidades para que seja de probabilidades. Com isso ao invs de receber apenas os valores 0 e 1, podem existir
valores no intervalo [0,1] desde que as linhas somem sempre 1, ou seja, as probabilidades de execuo em um dado
estado e recebido um smbolo sempre 1.
Podemos modificar as matrizes de transio da seguinte forma:

Os exemplo de aceitao e rejeio passam a no ser mais exatos, mas sim, a retornar uma probabilidade de
aceitao:
PROBABILIDADE DE ACEITAO:

PROBABILIDADE DE ACEITAO:

E agora passamos a ter uma possibilidade de erro na aceitao da linguagem inicialmente descrita 00*11*00*

Mquinas de Turing probabilsticas


Uma Mquina de Turing Probabilstica um tipo de Mquina de Turing no-determinstica que possui passos de
transio chamados de lanamento-de-moeda, dando a mquina duas possibilidades a cada transio.
Se na computao de uma entrada gerado o caminho de execuo (ramificao) , e neste, foram dados
lanamentos de moeda, ento a probabilidade do caminho dada por: . J a probabilidade de
aceitao da entrada dada por: , ou seja, a soma de todos os caminhos de
execuo que aceitam a palavra . Adicionalmente, temos que: .
A mquina continua reconhecendo linguagens apenas quando aceita todas as palavras da mesma e rejeita no
caso contrrio. Mas a uma Mquina de Turing Probabilstica permitido uma pequena probabilidade de erro:
. Desta forma, diz-se que reconhece uma linguagem com probabilidade de erro se:

Ganhos (complexidade)
BPP
Classe das linguagens que so reconhecidas por uma mquina de Turing probabilstica (em tempo polinomial) com
um erro no interval [0, 0.5). Este erro pode ser diminudo exponencialmente utilizando o lema da aplicaficao. Este
lema diz que para toda mquina de Turing probabilstica (em tempo polinomial = ) que opera com
erro , existe uma mquina equivalente que opera com uma probabilidade de erro de . Isto pode
ser provado dado que pode simular a mquina , execut-la um nmero polinomial de vezes e fazer uma
escolha majoritria entre as respostas computadas. Existe um algoritmo probabilstico para teste de primalidade
pertencente a BPP.
Algoritmo probabilstico 153

RP
Classe das linguagens que so reconhecidas por uma mquina de Turing probabilstica (em tempo polinomial) no
qual as entradas pertencentes a linguagem so aceitas com probabilidade de no mnimo 0.5 e entradas no
pertencentes a linguagem so rejeitadas com probabilidade 1. Este tipo de erro, denominado erro de um nico lado,
muito comum nos algoritmos probabilsticos. Nesta classe tambm possvel a reduo exponencial do erro
cometido.
ZPP
Engloba os problemas que possuem algoritmos que resolvem em tempo polinomial (no caso mdio) e do sempre
uma resposta correta, mesmo que possam no parar em alguns casos.

Aplicaes
Sistemas
Redes Neurais
Algoritmos Genticos
Problemas
Aprendizagem computacional
Reconhecimento de padres

Referncias
David Deutsch e Artur Ekert (19 de novembro de 1999). " Machine, Logic and Quantum Physics [1]" (PDF).
Acessado em 6 de fevereiro de 2007.
Eitan Gurari. An Introduction to the Theory of Computation. [S.l.]:Computer Science Press, 1989. ISBN
0-7167-8182-4
Michael Sipser. Introduction to the Theory of Computation. 2ed. [S.l.]:Course Technology, 2005.416 p. ISBN
978-0534947286

Referncias
[1] http:/ / arxiv. org/ PS_cache/ math/ pdf/ 9911/ 9911150. pdf
Algortmica 154

Algortmica
Algortmica consiste na partio de espaos em algoritmos igualmente divididos em subgrafos geradores.

Este artigo sobre matemtica mnimo. Voc pode ajudar a Wikipdia expandindo-o [1].

Referncias
[1] http:/ / pt. wikipedia. org/ w/ index. php?title=Algor%C3%ADtmica& action=edit

Amostragem de Gibbs
Em matemtica e fsica, a amostragem de Gibbs ou amostrador de Gibbs um algoritmo para gerar uma
sequncia de amostras da distribuio conjunta de probabilidades de duas ou mais variveis aleatrias. Opropsito de
tal sequncia aproximar a distribuio conjunta, ou computar uma integral (tal como um valor esperado). A
amostragem de Gibbs um caso especial do algoritmo de Metropolis-Hastings, e ento um exemplo de um algoritmo
Markov chain Monte Carlo. O algoritmo nomeado em relao ao fsico J. W. Gibbs, em referncia a uma analogia
entre o algoritmo de amostragem e fsica estatstica. O algoritmo foi planejado pelos irmos Stuart e Donald Geman,
cerca de oito dcadas aps Gibbs.[1]

Referncias

Analisador sinttico LL
Um analisador sinttico LL um algoritmo de anlise sinttica para um sub-conjunto de gramticas livre de
contexto. Ele dito um analisador sinttico descendente (top-down) pois tenta deduzir as produes da gramtica a
partir do n raz. Ele l a entrada de texto da esquerda para a direita, e produz uma derivao mais esquerda (por
isso LL, do termo em ingls left-left, diferente do analisador sinttico LR). As gramticas que podem ser analisadas
sintaticamente usando esse tipo de analisador so chamadas gramticas LL.
Outro termo usado analisador sinttico LL(x), no qual refere-se quantidade de tokens posteriores ao smbolo
atual (ainda no consumidos da entrada) que so usados para tomar decises na anlise. Se tal analisador sinttico
existe para uma dada gramtica, e ele pode analisar sentenas nessa gramtica sem o uso de backtracking, ento essa
gramtica chamada gramtica LL(x). Dessas gramticas com anlise posterior, as gramticas LL(1) so as mais
populares, pela necessidade de verificar somente o token posterior para a anlise. Linguagens mal desenvolvidas
tipicamente possuem gramticas com um valor alto de , e necessitam de bastante esforo computacional para
serem analisadas.
Analisador sinttico LL 155

Arquitetura

Caso geral
O analisador sinttico trabalha em cadeias de texto de uma determinada gramtica formal, e consiste de:
um buffer de entrada;
uma pilha na qual so armazenados os smbolos da gramtica ainda no analisados;
uma tabela anlise que indica se qual regra gramatical a ser aplicada dados os smbolos no topo da pilha e o
prximo token de entrada.
Quando o analisador iniciado, a pilha j contm dois smbolos:

[ S, $ ]

no qual $ um terminador especial para indicar o fim da pilha e o fim da entrada de dados, e S o smbolo de
entrada da gramtica. O analisador sinttico ir tentar reescrever o contedo da pilha para o que ele interpreta da
entrada de texto. Entretanto, ele somente mantm na pilha o que ainda deve ser reescrito.

Exemplo
A gramtica abaixo ser usada para o exemplo a seguir. Ela trata expresses matemticas, no qual so aceitas somas
entre uns:
(1) S F
(2) S ( S + F )
(3) F 1
deve-se analisar sintaticamente a seguinte entrada:
(1+1)

Tabela de anlise

( ) 1 + $

S 2 - 1 - -

F - - 3 - -

Procedimento de anlise
O analisador sinttico primeiro l o terminal ( da entrada de texto, e o S da pilha. Da tabela indicado que deve-se
aplicar a regra 2, isto , reescrever S para ( S + F ) na pilha e escrever o nmero dessa regra na sada de dados. No
prximo passo removido o ( da entrada de dados e da pilha. Agora o analisador verifica o terminal 1 na entrada de
texto ento aplica a regra 1 e ento a regra 3 da gramtica, e escreve seus nmeros na sada de dados.
Nos prximos dois passos o analisador sinttico l o 1 e o + da entrada de dados e os compara aos valores da pilha.
Como so iguais, eles so removidos da pilha. Nos prximos trs passos o F ser substitudo da pilha por 1, e o
nmero 3 (a regra gramatical) ser escrita na sada de dados. Ento o 1 e o ) so removidos da pilha e da entrada de
dados. Por fim, o analisador termina com $ tanto na pilha quanto na entrada de dados. Nesse caso ser retornado que
a cadeia de caracteres de entrada foi aceita, e na sada de dados est a lista de regras usadas na anlise.
Como pode ser visto no exemplo, o analisador sinttico LL realiza trs tipos de passos dependendo do contedo do
topo da pilha, seja no-terminal, terminal ou $:
Se o topo no terminal ento ele verifica a tabela de anlise, com base do valor no terminal e o smbolo na
entrada de dados, qual regra da gramtica deve ser usada. O nmero da regra escrito na sada de dados. Se a
Analisador sinttico LL 156

tabela de anlise indica que no h regra programada, retornado um erro.


Se o topo terminal ento ele compara o smbolo na entrada com o smbolo do topo da pilha, e se so iguais
ambos so removidos. Se eles no so iguais retornado um erro de sintaxe.
Se o topo $ e na entrada de dados tambm existe um $ ento ele retorna sucesso de anlise, seno erro de
sintaxe. Parecido com o tratamento para um topo terminal, note que nesse caso o algoritmo terminado em ambos
os casos.
Esses trs passos so repetidos at o algoritmo parar, seja com sucesso ou com erro.

Analisador sinttico LR
Um analisador sinttico LR (tambm chamado parser LR) um algoritmo de anlise sinttica para gramticas
livres de contexto. Ele l a entrada de texto da esquerda para a direita e produz uma derivao mais direita (por isso
LR, do termo em ingls left-right, diferente do analisador sinttico LL). Outro termo usado analisador sinttico
LR(x), no qual refere-se quantidade de smbolos posteriores ao smbolo atual (ainda no consumidos da
entrada) que so usados para tomar decises na anlise. Geralmente esse valor 1, sendo omitido. Uma gramtica
livre de contexto chamada LR(x) se existe uma analisador sinttico LR(x) para ela.
Um analisador sinttico LR dito um analisador sinttico de ascendente (bottom-up) pois ele tenta deduzir as
produes da gramtica a partir dos ns folha da rvore. Vrias linguagens de programao so descritas por uma
gramtica LR(1), ou pelo menos parecida, e por isso os analisadores sintticos LR so geralmente usados por
compiladores para realizar a anlise sinttica do cdigo fonte. Uma exceo notvel a linguagem de programao
C++.
Os analisadores sintticos LR podem ser implementados muito eficientemente, o que muito til para compiladores,
por exemplo. Raramente so produzidos manualmente, sendo geralmente construdos por um gerador de anlise
sinttica ou um compilador de compiladores. Dependendo da forma como a tabela de anlise sinttica gerada, o
analisador chamado SLR (simples), LALR (quando h anlise de smbolos posteriores) e cannico (ou LR(1)). Os
analisadores LALR podem lidar com mais tipos de gramticas que o SLR; o cannico pode lidar com mais tipos de
gramticas que o LALR.

Arquitetura

Caso geral
O analisador sinttico uma mquina de estado finito que consiste de:
um buffer de entrada;
uma pilha no qual armazenada uma lista de estados anteriores;
uma tabela de prximo estado que indica para onde o novo estado deve se mover;
uma tabela de ao que indica uma regra gramatical a aplicar no estado e smbolo atual na entrada de dados.
Analisador sinttico LR 157

Algoritmo
O algoritmo do analisador sinttico LR definido como:
1. A pilha inicializada com [0]. O estado atual ser sempre o estado no topo da pilha.
2. Dado o estado atual e o smbolo atual na entrada, uma ao procurada na tabela de ao:
uma mudana de estado sn:
o smbolo terminal atual removido da entrada
o estado n inserido na pilha (tornando-se o estado atual)
uma reduo rm:
o nmero m escrito no fluxo de sada
para cada smbolo direita da regra m, um estado removido da pilha
dado o ento estado atual no topo da pilha e a regra m, um novo estado procurado na tabela de prximo
estado, tornando-se o estado atual ao ser inserido na pilha
uma aceitao: a cadeia de caracteres aceita
sem ao: um erro de sintaxe retornado
3. O passo 2 repetido at que a haja uma aceitao ou um erro de sintaxe.

Exemplo
A gramtica abaixo ser usada para o exemplo a seguir. Ela trata expresses matemticas, no qual aceito somas e
multiplicaes entre uns e zeros.
(1) E E * B
(2) E E + B
(3) E B
(4) B 0
(5) B 1
deve-se analisar sintaticamente a seguinte entrada:
1+1

Tabelas de ao e prximo estado

ao prximo estado

estado * + 0 1 $ E B

0 s1 s2 3 4

1 r4 r4 r4 r4 r4

2 r5 r5 r5 r5 r5

3 s5 s6 acc

4 r3 r3 r3 r3 r3

5 s1 s2 7

6 s1 s2 8

7 r1 r1 r1 r1 r1

8 r2 r2 r2 r2 r2

A tabela de ao classificada por um estado do analisador sinttico e um smbolo terminal (incluindo o terminal
especial $ que indica o final da entrada de dados) e contm trs tipos de aes:
Analisador sinttico LR 158

mudana de estado (shift), escrito sn e indicando que o prximo estado n


reduo (reduce), escrito rm e indicado que a reduo com a regra gramatical m deve ser feita
aceitao (accept), escrito acc e indicando que o analisador sinttico aceita a entrada de dados
A tabela de prximo passo classificada por um estado do analisador sinttico e por um smbolo no terminal. Ela
indica qual o prximo estado do analisado se um smbolo no-terminal foi reconhecido.

Procedimento de anlise
A tabela abaixo ilustra cada passo do processo. Aqui o estado refere-se ao elemento no todo da pilha (mais direita),
e a prxima ao determinada referindo-se tabela de ao acima. Notar que um $ adicionado no final da entrada
de dados para indicar o fim do texto.

Estado Entrada de dados Sada de dados Pilha Prxima ao

0 1+1$ [0] mudana de estado para 2

2 +1$ [0,2] reduz 5

4 +1$ 5 [0,4] reduz 3

3 +1$ 5,3 [0,3] mudana de estado para 6

6 1$ 5,3 [0,3,6] mudana de estado para 2

2 $ 5,3 [0,3,6,2] reduz 5

8 $ 5,3,5 [0,3,6,8] reduz 2

3 $ 5,3,5,2 [0 3] aceita

O estado inicial do analisador sempre 0, armazenado na pilha. O primeiro valor terminal encontrado pelo parser
1, e de acordo com a tabela de ao deve haver uma mudana de estado para 2. No estado 2 a tabela de ao indica
que qualquer terminal que aparea, deve-se realizar uma reduo com a regra gramatical 5. Por isso escreve-se 5 da
sada de dados, retira-se um estado da pilha e adiciona-se na pilha o estado da tabela de prximo estado (que no caso
4).
Apesar disso a tabela de ao do estado 4 indica que deve-se realizar uma reduo com a regra 3. Ento escreve-se 3
na sada de dados, retira-se um estado da pilha, encontra-se um novo estado na tabela de prximo estado (que no
caso 3).
O prximo terminal no parser +, e de acordo com a tabela de ao deve-se ir para o estado 6. O prximo terminal
1, significando que deve-se realizar uma mudana para o estado 2. Assim como o 1 anterior, feita uma reduo
para B, indo-se para o estado 8. Nesse estado sempre feita uma reduo pela regra 2.
Finalmente lido o terminal $ da entrada de dados, o que significa que, de acordo com a tabela de ao (o estado
atual 3), o analisador sinttico aceita a entrada de dados.
Analisador sinttico descendente recursivo 159

Analisador sinttico descendente recursivo


Um analisador sinttico descendente recursivo um analisador sinttico descendente construdo a partir de
subrotinas mutualmente recursivas (ou qualquer equivalncia no recursiva como uma pilha) em que cada subrotina
geralmente implementa uma das regras de produo da gramtica. Cada subrotina fica associada a um elemento
no-terminal da gramtica. Consequentemente, a estrutura do programa resultante se assemelha bastante gramtica
que ele reconhece.
Um analisador sinttico preditivo (ou analisador sinttico preditor) um analisador sinttico descendente
recursivo que no requer backtracking. Ele s possvel para a classe de gramticas LL(k), que so gramticas livres
de contexto para as quais existem algum inteiro positivo k que permite um analisador sinttico descendente recursivo
para decidir qual produo usar analisando somente os k tokens seguintes na entrada de dados. (Portanto, as
gramticas LL(k) excluem todas as gramticas ambguas, assim como todas as gramticas que contm recursividade
esquerda. O algoritmo entraria em lao infinito. Qualquer gramtica livre de contexto pode ser transformada numa
gramtica equivalente que no possui recursividade esquerda, mas a remoo da recursividade a esquerda nem
sempre resulta numa gramtica LL(k).) Um analisador sinttico preditivo possui complexidade linear.
Um analisador sinttico descendente com cpia determina qual produo usar por tentativa e erro (por exemplo,
diferentes regras com mesmo lado esquerdo, A ::= aB | aC | cD). O algoritmo s retorna ao consumir toda a
entrada (sucesso) ou ao esgotar todas as possibilidades de produo (falha). Ele no limitado s gramticas LL(k),
mas o trmino no garantido a menos que a gramtica seja LL(k). Mesmo que termine, essa tcnica pode levar a
complexidade exponencial, e geralmente consome muita memria, o que a torna praticamente inutilizada atualmente.
Apesar dos analisadores sintticos preditivos serem bastante usados, os programadores geralmente preferem criar
analisador LR ou LALR atravs de geradores de analisador sintticos sem a transformao da gramtica numa forma
LL(k).
Geradores de analisadores sintticos descendentes recursivos incluem JavaCC (para Java), Coco/R (C#, Java),
ANTLR (C, C++, Java, Python, C#, Objective-C), pyparsing (Python) e Spirit (C++, parte da biblioteca Boost).

Referncias
Pedro Sergio Nicolletti. Anlise Sinttica Parte 2 [1]. Material de Aula de Compiladores. Universidade Federal de
Campina Grande. Pgina visitada em 21 de julho de 2008.
Compilers: Principles, Techniques, and Tools, 1 ed., Alfred V Aho, Ravi Sethi e Jeffrey D Ullman. Seo 4.4.
Modern Compiler Implementation in Java, Second Edition, Andrew Appel, 2002, ISBN 0-521-82060-X.
Recursive Programming Techniques, W.H. Burge, 1975, ISBN 0-201-14450-6
Crafting a Compiler with C, Charles N Fischer and Richard J LeBlanc, Jr, 1991, ISBN 0-8053-2166-7.
Compiling with C# and Java, Pat Terry, 2005, ISBN 0-321-26360-X, 624
Algorithms + Data Structures = Programs, Niklaus Wirth, 1975, ISBN 0-13-022418-9
Compiler Construction, Jonatan Rugarn, 1996, ISBN 0-201-40353-6

Referncias
[1] http:/ / www. dsc. ufcg. edu. br/ ~peter/ cursos/ cc/ material/ p3-sintatico-2p. pdf
Anlise de algoritmos 160

Anlise de algoritmos
Em cincia da computao, a anlise de algoritmos tem como funo determinar os recursos necessrios para
executar um dado algoritmo. A maior parte dos algoritmos so pensados para trabalhar com entradas (inputs) de
tamanho arbitrrio. Em geral, a eficincia ou complexidade de um algoritmo funo do tamanho do problema, do
nmero de passos necessrio (complexidade temporal) e da complexidade espacial ou de memria do sistema usado
para executar o algoritmo. Esta disciplina faz parte da mais vasta teoria da complexidade computacional, que permite
fazer estimativas quanto aos recursos necessrios para que um algoritmo resolva um determinado problema
computacional.
Assim, o objetivo final no apenas fazer cdigos que funcionem, mas que sejam tambm eficientes. Para isso,
deve-se estudar alguns tipos de problemas que podem ser resolvidos computacionalmente. Em seguida, deve ser
visto como a abordagem adotada para resolver pode influenciar, levando a um algoritmo mais ou menos eficiente.
"Ao verificar que um dado programa est muito lento, uma pessoa prtica pede uma mquina mais rpida ao seu
chefe. Mas o ganho potencial que uma mquina mais rpida pode proporcionar tipicamente limitado por um fator
de 10, por razes tcnicas ou econmicas. Para obter um ganho maior, preciso buscar melhores algoritmos. Um
bom algoritmo, mesmo rodando em uma mquina lenta, sempre acaba derrotando (para instncias grandes do
problema) um algoritmo ruim rodando em uma mquina rpida. Sempre."

Referncias bibliogrficas
S. S. Skiena, The Algorithm Design Manual [1] - ISBN 0387948600

Referncias
[1] http:/ / books. google. com/ books?id=TrXd-gxPhVYC& printsec=frontcover& dq=%22Skiena%22+ %22The+ Algorithm+ Design+
Manual%22+ & sig=c60b6kTmuL9Xsm0GzZnefwt3Cdo
Algoritmos de Berkeley 161

Algoritmos de Berkeley
Nesse algoritmo, o servidor de tempo ativo e consulta periodicamente cada uma das mquinas sobre os valores de
seus relgios. Ento calcula uma mdia das leituras realizadas e informa cada mquina para que se ajuste, adiantando
ou atrasando seu relgio. Essa mdia pode ser simples ou ajustada, desprezando-se valores extremos, o que permite
contornar eventuais falhas em alguns relgios. Tambm possvel considerar o tempo de comunicao entre as
mquinas. Nesse algoritmo, no h necessidade de que o servidor de tempo consulte um servio de hora atmica.

Ver Tambm
Algoritmo
lgebra
Relgios
Tempo

CRC
CRC, do ingls Cyclic redundancy check, ou verificao de redundncia cclica um cdigo detector de erros, um
tipo de funo hash que gera um valor expresso em poucos bits em funo de um bloco maior de dados, como um
pacote de dados, ou um ficheiro, por forma a detectar erros de transmisso ou armazenamento.
O CRC calculado e anexado informao a transmitir (ou armazenar) e verificada aps a recepo ou acesso, para
confirmar se no ocorreram alteraes. O CRC popular por ser simples de implementar em hardware binrio,
simples de ser analisado matematicamente, e pela eficincia em detectar erros tpicos causados por rudo em canais
de transmisso.

Propriedades
A utilidade do CRC advm das seguintes propriedades:
1. Como todos os bits so usados no clculo do CRC, a mudana em apenas um bit provoca uma mudana no CRC.
2. Mesmo mudanas pequenas nos dados levam a CRCs muito diferentes. Experincias com o CRC-32 (usando
polinmios de 32 bits) mostram que muito raro que a introduo de erros nos dados no seja detectado pelo
CRC.
3. A probabilidade de qualquer dos 232 valores possveis para o CRC praticamente uniforme.

Clculo
O CRC calculado atravs das operaes da aritmtica mdulo 2. Com efeito, o resto da diviso polinomial entre
os dados a enviar, e um polinmio gerador adequadamente escolhido. Para efetuar esta diviso , cada posio dos
bits no bloco de dados ou arquivo considerado como uma potncia de x no polinmio, e o valor do bit o
coeficiente correspondente (0 ou 1). Por exemplo, a seqencia de bits 1001101100110100 deve ser considerada
como sendo o polinmio:

ou seja:

O polinmio composto por todos os bits do arquivo dividido usando-se aritmtica mdulo 2 [1] pelo polinmio
gerador. O resto da diviso dos polinmios gera sempre um polinmio cujo grau sempre menor que o grau do
CRC 162

polinmio gerador, ento se usamos um polinmio de grau 32, temos como resto um polinmio de grau 31 ou menos
que podemos representar com 32 bits, um para cada coeficiente (o primeiro coeficiente o de x0, por isso temos um
coeficiente a mais que o grau).
Existem alguns polinmios geradores padronizados para serem usados no clculo de CRC que foram testados para
garantir as propriedades listadas acima. Os mais comuns so:
CRC-32 que usa o polinmio gerador
ou
100000100110000010001110110110111 em notao binria.
CRC-16 que usa o polinmio gerador ou 11000000000000101 em
notao binria.
CRC-12 que usa o polinmio gerador ou 1000000001011 em
notao binria.
CRC-8 que usa o polinmio gerador ou 100000111 em notao binria.
CRC-1 que usa o polinmio gerador ou 1 em notao binria. Este tipo de cdificao
usualmente designada por cdigo de paridade, a qual adiciona um bit 1 ou 0 direita do conjunto de digitos
binrios a codificar.
de salientar que o CRC , contudo, intil para validar a integridade dos dados - pelas suas caractersticas,
possvel alterar os dados sem que o CRC reflita a alterao. Nestes casos pode-se utilizar as funes de hash
criptogrficas.

Notas e referncias
[1] A aritmtica mdulo 2 uma forma de aritmtica binria onde a soma e subtrao no propagam dgitos para a prxima casa, facilitando
assim os clculos. Em termos computacionais, tanto a soma como a subtrao so representados pela operao de ou exclusivo nessa
aritmtica. Ver tambm Aritmtica modular

Bibliografia
(em ingls) SALOMON, David. Data Compression: The Complete Reference. 2ed. Nova Iorque:Springer, 2000.
ISBN 0-387-95045-1
Algoritmo CYK 163

Algoritmo CYK
O algoritmo Cocke-Younger-Kasami (CYK) determina se uma cadeia de caracteres pode ser gerada por uma
determinada gramtica livre de contexto e, se ela puder, como ela pode ser gerada. Esse processo conhecido como
a anlise sinttica da cadeia, no caso, ascendente.
A verso padro do algoritmo opera em gramticas livres de contexto expressadas atravs da Forma Normal de
Chomsky (CNF). No pior caso, o algoritmo possui complexidade , em que o comprimento da cadeia de
caracteres. Isso o torna um dos algoritmos mais eficientes no reconhecimento geral de linguagens livres de contexto.
Entretanto, algoritmos mais rpidos e especializados existem para certos subconjuntos de linguagens livres de
contexto.

Definio
Segue abaixo uma definio do algoritmo em pseudocdigo:

ROTINA CYK(
, -- cadeia de caracteres a ser testada
, -- gramtica contendo smbolos terminais e no-terminais
, -- smbolos de incio da gramtica
-- vetor de booleanos inicializado em
)
PARA CADA i DE 1 A n FAA
PARA CADA FAA

PARA CADA i DE 2 A n FAA


PARA CADA j DE 1 A n-i+1 FAA
PARA CADA k DE 1 A i-1 FAA
PARA CADA Produo( ) FAA
SE ENTO

PARA CADA x EM FAA


SE ENTO
RETORNE "membro da linguagem"
SENO
RETORNE "no-membro da linguagem"
Extenses
trivial estender o algoritmo para determinar no somente se uma sentena pertence a uma linguagem, mas tambm
a rvore de anlise sinttica, armazenando-se os ns como elementos do vetor ao invs de somente valores
booleanos.Como o reconhecimento das gramticas pode ser ambguo, necessrio armazenar uma lista de ns,
resultando numa floresta de rvores possveis. Tambm possvel estender o algoritmo para lidar com algumas
linguagens livres de contexto que no so escritas em CNF.
Comb sort 164

Comb sort

Comb sort
classe Algoritmo de ordenao

estrutura de dados Array, Listas ligadas

complexidade pior caso


complexidade de espaos pior
caso
Algoritmos

O algoritmo Comb sort (ou Combo sort ou ainda algoritmo do pente[1]) um algoritmo de ordenao
relativamente simples, e faz parte da famlia de algoritmos de ordenao por troca. Foi desenvolvido em 1980 por
Wlodzimierz Dobosiewicz. Mais tarde, foi redescoberto e popularizado por Stephen Lacey e Richard Box em um
artigo publicado na revista Byte em Abril de 1991. O Comb sort melhora o Bubble sort, e rivaliza com algoritmos
como o Quicksort. A idia bsica eliminar as tartarugas ou pequenos valores prximos do final da lista, j que em
um bubble sort estes retardam a classificao tremendamente. (Coelhos, grandes valores em torno do incio da lista,
no representam um problema no bubble sort).
O Algoritmo repetidamente reordena diferentes pares de itens, separados por um salto, que calculado a cada
passagem. Mtodo semelhante ao Bubble Sort, porm mais eficiente.
Na Bubble sort, quando quaisquer dois elementos so comparados, eles sempre tm um gap (distncia um do outro)
de 1. A idia bsica do Comb sort que a diferena pode ser muito mais do que um. (O Shell sort tambm baseado
nesta idia, mas uma modificao do insertion sort em vez do bubble sort).
O gap (intervalo) comea como o comprimento da lista a ser ordenada dividida pelo fator de encolhimento (em geral
1,3; veja abaixo), e a lista ordenada com este valor (arredondado para um inteiro se for necessrio) para o gap.
Ento, a diferena dividida pelo fator de encolhimento novamente, a lista ordenada com este novo gap, e o
processo se repete at que a diferena seja de 1. Neste ponto, o Comb sort continua usando um espao de 1 at que a
lista esteja totalmente ordenada. A fase final da classificao , portanto, equivalente a um bubble sort, mas desta vez
a maioria dos elementos "tartarugas" j foram tratados, assim o bubble sort ser eficiente.

Fator de encolhimento
O fator de encolhimento tem um grande efeito sobre a eficincia do Comb sort. No artigo original, os autores
sugeriram 1,3 depois de tentar algumas listas aleatrias e encontrando-se, geralmente as mais eficazes. Um valor
muito pequeno retarda o algoritmo porque mais comparaes devem ser feitas, ao passo que um valor muito grande
no pode tratar um nmero suficiente de "tartarugas" para ser prtico.

O texto descreve uma melhoria no comb sort usando o valor base como

fator de encolhimento. Ele tambm contm uma implementao em pseudocdigo com uma tabela de gaps
pr-definidos.
Comb sort 165

Variaes

Combsort11
Com um fator de encolhimento de cerca de 1,3, s existem trs caminhos possveis para a lista de gaps terminar: (9,
6, 4, 3, 2, 1), (10, 7, 5, 3, 2, 1), ou (11, 8, 6, 4, 3, 2, 1). Experimentos mostram que melhorias significativas de
velocidade podem ser feitas se o gap for definido como 11, sempre que, caso contrrio, tornar-se 9 ou 10. Esta
variao chamada Combsort11.
Se uma das sequncias que comeam com 9 ou 10, forem utilizadas, o passo final, com um intervalo de 1 tem menor
probabilidade de ordenar os dados sendo necessrio ento outro passo com gap de 1. Os dados so ordenados quando
no ocorrem mais trocas durante uma passagem com gap= 1.
Tambm possvel usar uma tabela pr-definida, para escolher quais gaps a utilizar em cada passo.

Combsort com diferentes finais


Como muitos outros algoritmos eficientes de ordenao (como o quick sort ou merge sort), o comb sort mais eficaz
em suas passagens anteriores do que durante o passo final, quando ele se assemelha a um bubble sort. O Comb sort
pode ser mais eficaz se o mtodo de classificao mudado uma vez que os gaps cheguem a um nmero pequeno o
suficiente. Por exemplo, uma vez que a diferena chegue a um tamanho de cerca de 10 ou menor, parando o comb
sort e fazendo um simples gnome sort ou cocktail sort, ou, melhor ainda, um insertion sort, se aumentar a eficincia
global da ordenao.
Outra vantagem deste mtodo que no h necessidade de manter o controle das operaes de troca durante os
passos da classificao para saber se a ordenao deve parar ou no.

Implementaes

Pseudocdigo
function combsort(array input)

gap := input.size //initialize gap size

loop until gap = 1 and swaps = 0


//update the gap value for a next comb. Below is an example
gap := int(gap / 1.247330950103979)
if gap < 1
//minimum gap is 1
gap := 1
end if

i := 0
swaps := 0 //see bubblesort for an explanation

//a single "comb" over the input list


loop until i + gap >= input.size //see shellsort for similar idea
if input[i] > input[i+gap]
swap(input[i], input[i+gap])
swaps := 1 // Flag a swap has occurred, so the
// list is not guaranteed sorted
end if
Comb sort 166

i := i + 1
end loop

end loop
end function

C++
Esta uma implementao no estilo STL. Ele ir classificar qualquer intervalo entre a primeira e a ltima. Isso
funciona com quaisquer iteradores posteriores, mas mais eficaz com iteradores de acesso aleatrio ou ponteiros.

template<class ForwardIterator>
void combsort ( ForwardIterator first, ForwardIterator last )
{
static const double shrink_factor = 1.247330950103979;
typedef typename std::iterator_traits<ForwardIterator>::difference_type
difference_type;
difference_type gap = std::distance(first, last);
bool swaps = true;

while ( (gap > 1) || (swaps == true) ){


if (gap > 1)
gap = static_cast<difference_type>(gap/shrink_factor);

swaps = false;
ForwardIterator itLeft(first);
ForwardIterator itRight(first); std::advance(itRight, gap);

for ( ; itRight!=last; ++itLeft, ++itRight ){


if ( (*itRight) < (*itLeft) ){
std::iter_swap(itLeft, itRight);
swaps = true;
}
}
}
}

Java
public static <E extends Comparable<? super E>> void sort(E[] input) {
int gap = input.length;
boolean swapped = true;
while (gap > 1 || swapped) {
if (gap > 1)
gap = (int) (gap / 1.247330950103979);

int i = 0;
swapped = false;
while (i + gap < input.length) {
if (input[i].compareTo(input[i + gap]) > 0) {
Comb sort 167

E t = input[i];
input[i] = input[i + gap];
input[i + gap] = t;
swapped = true;
}
i++;
}
}
}

C
void combsort(int *arr, int size) {
float shrink_factor = 1.247330950103979;
int gap = size, swapped = 1, swap, i;

while ((gap > 1) || swapped) {


if (gap > 1)
gap = gap / shrink_factor;

swapped = 0;
i = 0;

while ((gap + i) < size) {


if (arr[i] - arr[i + gap] > 0) {
swap = arr[i];
arr[i] = arr[i + gap];
arr[i + gap] = swap;
swapped = 1;
}
++i;
}
}
}

Ruby
def comb_sort(list)
shrink_factor = 1.247330950103979
gap = list.size
swapped = true

until (gap == 1) && !swapped


gap = gap / shrink_factor

gap = 1 if gap < 1

i = 0
swapped = false
Comb sort 168

until (i + gap) >= list.size


if list[i] > list[i + gap]
list[i], list[i + gap] = list[i + gap], list[i]
swapped = true
end
i = i + 1
end
end

list
end

Ligaes externas
.NET Implementao do Comb sort e vrios outros algoritmos (http://www.sharpdeveloper.net/content/
archive/2007/08/14/dot-net-data-structures-and-algorithms.aspx)

Congruncia de Zeller
Congruncia de Zeller um algoritmo criado por Christian Zeller para calcular o dia da semana de qualquer data
nos calendrios juliano ou gregoriano.

Frmula
Para um calendrio gregoriano, a congruncia de Zeller

J para o calendrio juliano, ela

em que
h o dia da semana (0 = sbado, 1 = domingo, 2 = segunda, )
q o dia do ms
m o ms (3 = maro, 4 = abril, 5 = maio, )
K o ano do sculo ( )
J o sculo ( ) (por exemplo, para 1995 o sculo seria 19, ainda que na realidade o sculo seria
XX)
Nota 1: neste algoritmo, janeiro e fevereiro so contados como os meses 13 e 14 do ano anterior.
Nota 2: para o dia do ms em ISO (1 = segunda, ), use
Congruncia de Zeller 169

Implementao em software
As frmulas anteriores requerem a definio matemtica da operao mdulo, que significa que
. Entretanto, a maioria das linguagens de programao implementam a funo de resto, de
forma que . Portanto, para implementar a congruncia de Zeller em um computador, as
frmulas devem ser alteradas para assegurar um numerador positivo. A forma mais simples de se fazer isso
substituir por e por . Assim, as frmulas se tornam:

para o calendrio gregoriano e

para o calendrio juliano.


Zeller usava aritmtica decimal, e achou conveniente usar & para representar o ano. Mas usando um
computador mais simples lidar com o ano modificado Y usando Y, Y div 4, e para o calendrio gregoriano
tambm Y div 100 & Y div 400.

Algoritmo de Cristian
Algoritmo de Cristian ou Algoritmo de Christian um algoritmo que pressupe que uma das mquinas do sistema
distribudo acessa um servio de informaes da hora atmica e ajustando-se, passa a ser um servidor de tempo
para as demais mquinas do sistema, que periodicamente a consultam para ajustar seus relgios.
Entretanto, h dois problemas a resolver. O principal a distoro relativa de cada mquina em relao ao servidor
de tempo, j que os mecanismos de avano de tempo, tanto de uma como de outra mquina no so absolutamente
precisos.
Outro problema que a comunicao entre essas mquinas tambm exige um certo tempo, decorrente de fatores das
prprias mquinas e dos meios que as interligam. Assim, o algoritmo prope a adoo de certos ajustes, que levam
em considerao a diferena de tempo verificada entre as mquinas, depois de decorrido um certo perodo do ltimo
ajuste entre elas.
No processo peridico de sincronizao tambm utilizada a mdia ajustada (devido aos reflexos de possveis
momentos de congestionamento da rede) dos tempos necessrios comunicao entre as mquinas.
Crivo de Atkin 170

Crivo de Atkin
Crivo de Atkin um algoritmo matemtico usado para encontrar nmeros primos at determinado valor mximo.
Ele uma verso aprimorada do Crivo de Eratstenes, criada por A. O. L. Atkin e Daniel J. Bernstein.[1]
[1] A.O.L. Atkin, D.J. Bernstein, Crivos de nmeros primos usando formas quadrticas binrias (Prime sieves using binary quadratic forms)
(http:/ / www. ams. org/ mcom/ 2004-73-246/ S0025-5718-03-01501-1/ S0025-5718-03-01501-1. pdf), Math. Comp. 73 (2004), 1023-1030.
(http:/ / cr. yp. to/ papers/ primesieves. pdf)

Deteco e correco de erros


1. REDIRECIONAMENTO Deteco e correo de erros

Dgito verificador
Dgito verificador ou algarismo de controle um mecanismo de autenticao utilizado para verificar a validade e a
autenticidade de um valor numrico, evitando dessa forma fraudes ou erros de transmisso ou digitao.
Consiste em um ou mais algarismos acrescentados ao valor original e calculados a partir deste atravs de um
determinado algoritmo. Nmeros de documentos de identificao, de matrcula, cartes de crdito e quaisquer outros
cdigos numricos que necessitem de maior segurana utilizam dgitos verificadores.

Utilizao
usado normalmente em representaes numricas que exijam integridade, como por exemplo:
Documentos de identificao
brasileiros como CPF, CNPJ, RG etc.
portugueses como NIF, BI, etc.
Cdigos de Barras como EAN [1], UPC [2] e ITF [3].
Cdigos de pagamentos: Nmero de boleto de cobrana, cdigo de concessionria pblica etc.
Cdigos em geral: Agncia bancria, conta corrente, nmero de matrcula etc.

Exemplos
O mtodo de clculo desses dgitos varia conforme o caso, porm muitos deles se baseiam em duas rotinas
tradicionais: Mdulo 11 e Mdulo 10.
Abaixo temos uma explicao do clculo dessas duas rotinas:

Mdulo 11
Conforme o esquema abaixo, para calcular o primeiro dgito verificador, cada dgito do nmero, comeando da
direita para a esquerda (do dgito menos significativo para o dgito mais significativo) multiplicado, na ordem, por
2, depois 3, depois 4 e assim sucessivamente, at o primeiro dgito do nmero. O somatrio dessas multiplicaes
dividido por 11. O resto desta diviso (mdulo 11) subtraido da base (11), o resultado o dgito verificador. Para
calcular o prximo dgito, considera-se o dgito anterior como parte do nmero e efetua-se o mesmo processo. No
exemplo, foi considerado o nmero 261533:

+---+---+---+---+---+---+ +---+
| 2 | 6 | 1 | 5 | 3 | 3 | - | 6 |
Dgito verificador 171

+---+---+---+---+---+---+ +---+
| | | | | |
x7 x6 x5 x4 x3 x2
| | | | | |
=14 =36 =5 =20 =9 =6 soma = 90
+---+---+---+---+---+-> = (90 / 11) = 8,1818 , resto 2 => DV = (11 - 2) = 9

Considerando o nmero 2615336, onde o 6 o dgito verificador e a validao atravs do "mdulo 11". No seria
considerado um nmero vlido, pois o nmero correto 2615339, onde 9 o dgito verificador gerado pelo mdulo
11.
O CPF utiliza o mdulo 11 duas vezes seguidas (conforme o exemplo), obtendo dois dgitos verificadores.
Observao: para o cdigo de barras, sempre que o resto for 0, 1 ou 10, dever ser utilizado o dgito 1.
Clculos variantes poderiam ocorrer, tal como substituir por uma letra, quando o clculo do dgito final der 10 ou
outro nmero escolhido. Exemplos so os casos da utilizao do dgito verificador pelo Banco do Brasil, quando o
clculo resulta em 10, o dgito verificador utilizado o X e do Bradesco, que quando o clculo resulta em 10, o
digito verificador utilizado o 0 (ou P para poupanas).

Mdulo 10
Conforme o esquema abaixo, cada dgito do nmero, comeando da direita para a esquerda (menos significativo para
o mais significativo) multiplicado, na ordem, por 2, depois 1, depois 2, depois 1 e assim sucessivamente.
Nmero exemplo: 261533-4

+---+---+---+---+---+---+ +---+
| 2 | 6 | 1 | 5 | 3 | 3 | - | 4 |
+---+---+---+---+---+---+ +---+
| | | | | |
x1 x2 x1 x2 x1 x2
| | | | | |
=2 =12 =1 =10 =3 =6
+---+---+---+---+---+-> = (16 / 10) = 1, resto 6 => DV = (10 - 6) = 4

Em vez de ser feito o somatrio das multiplicaes, ser feito o somatrio dos dgitos das multiplicaes (se uma
multiplicao der 12, por exemplo, ser somado 1 + 2 = 3).
O somatrio ser dividido por 10 e se o resto (mdulo 10) for diferente de zero, o dgito ser 10 menos este valor.

Algoritmos
Entre os algoritmos notveis para o clculo de dgitos verificadores esto os seguintes:
Algoritmo de Luhn (1954)
Algoritmo de Verhoeff (1969)

Ligaes externas
Dgito Verificador EAN, UPC e ITF. [4]
Teste de Luhn para nmeros de cartes de crdito [5] no Rosetta Code
SEDOL [6] no Rosetta Code, com implementaes em diversas linguagens de programao
Dgito verificador 172

Referncias
[1] http:/ / www. codigodebarrasean. com/ codigo-de-barras-vendido-fuera-de-usa. html
[2] http:/ / www. codigodebarrasupc. com/ codigo-de-barras-norteamerica. html
[3] http:/ / www. codigodebarrasean. com/ codigo-de-barras-containers-de-carga. html#01
[4] http:/ / www. codigodebarrasean. com/ calculadora_do_digito_verificador. php
[5] http:/ / rosettacode. org/ wiki/ Luhn_test_of_credit_card_numbers
[6] http:/ / rosettacode. org/ wiki/ SEDOL

Dgito verificador GS1


Dgito verificador um mecanismo de autenticao utilizado para verificar a validade e a autenticidade de um valor
numrico, evitando dessa forma fraudes ou erros de transmisso ou digitao. Consiste em um ou mais dgitos
acrescentados ao valor original e calculados a partir deste atravs de um algoritmo. Nmeros de documentos de
identificao, de matrcula, cartes de crdito e quaisquer outros cdigos numricos que necessitem de maior
segurana utilizam dgitos verificadores.
Dgito Verificador GS1: Padro de clculo do dgito verificador para as estruturas de dados GS1.[1][2] Este
algoritmo idntico para todas as estruturas de dados GS1 de comprimento fixo que requerem dgito verificador.

Posio dos Dgitos

GTIN-8 N1 N2 N3 N4 N5 N6 N7 N8

GTIN-12 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12

GTIN-13 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13

GTIN-14 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14

17 digitos N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 N16 N17

18 digitos N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 N16 N17 N18

Multiplique o valor de cada posio por

x3 X1 x3 x1 x3 x1 x3 x1 x3 x1 x3 x1 x3 x1 x3 x1 x3

Some o resultado das multiplicaes = (X)

Subtraia (X) por um mltiplo de 10 superior mais prximo a ele = Dgito Verificador

Exemplo do clculo do dgito verificador para uma estrutura de 18 dgitos

Posies N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 N16 N17 N18

Numero sem o dgito verificador 3 7 6 1 0 4 2 5 0 0 2 1 2 3 4 5 6

Passo 1: multiplicar X X X X X X X X X X X X X X X X X

por 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 1 3

Passo 2: somar = = = = = = = = = = = = = = = = =

Resultado das somas 9 7 18 1 0 4 6 5 0 0 6 1 6 3 12 5 18 = 101

Passo 3: Subtrair o resultado da soma por um mltiplo de 10 superior mais prximo (110) = Dgito Verificador (9)

Numero com o Dgito Verificador 3 7 6 1 0 4 2 5 0 0 2 1 2 3 4 5 6 9

[1] Como calcular o dgito verificador para GTIN-8, GTIN-13... (http:/ / www. gs1brasil. org. br/ main.
jsp?lumPageId=FF8080810CC51BE1010CD4E940101BEA& lumDS=faqs& itemId=9131878B25974FDEAE59C80D672DF689)
[2] Como calcular o dgito de controlo (http:/ / www. gs1pt. org/ produtos_solucoes/ identificadores_chave/ calculo_check_digit. htm#how)
Algoritmo de discagem predictiva 173

Algoritmo de discagem predictiva


Algoritmo de discagem predictiva um termo tcnico relacionado a Central de Atendimento Telefnico.
Algoritmo o resultado de um clculo aproximado obtido pelos relatrios da utilizao do sistemas de discagem
preditiva, com a inteno de obter o equilbrio entre o nmero de agentes em atividades em um determinado
momento e a quantidade de chamadas a serem geradas, no PABX.
O clculo realizado levando em considerao fatores, tais como: a durao mdia de uma chamada, o trfego em
diferentes horrios, a agilidade dos operadores no atendimento de chamadas e a taxa de acerto (nmero de chamadas
atendidas versus o nmero de chamadas no completadas, podendo ser chamadas ocupadas ou interrompidas por
problemas na linha). O algoritmo da discagem preditiva a base para o sistema de discagem preditiva.
Em Alguns sistemas se gera um alarme para os supervisores, quando os agentes (operadores de call center) quando
as ligaes dos mesmos ultrapassam um limite de tempo padro previamente definido que varia de campanha para
campanha.

Algoritmo de disperso
Em criptografia, um algoritmo de hashing ou disperso um mtodo de cifrar dados de forma a manter a sua
integridade.
A funo de hash, a partir de uma cadeia de caracteres (string) de qualquer tamanho, cria uma string de tamanho
fixo.
A criptografia ou cifra consiste na aplicao de um algoritmo aos dados por forma a que eles se tornem ilegveis,
para recuperar os dados originais ser necessrio conhecer o algoritmo de desencriptao ou decifragem.
Distncia Levenshtein 174

Distncia Levenshtein
Em teoria da informao, a distncia Levenshtein ou distncia de edio entre dois "strings" (duas sequncias de
caracteres) dada pelo nmero mnimo de operaes necessrias para transformar um string no outro. Entendemos
por "operaes" a insero, deleo ou substituio de um carcter. O nome advm do cientista russo Vladimir
Levenshtein, que considerou esta distncia j em 1965. muito til para aplicaes que precisam determinar quo
semelhantes dois strings so, como por exemplo o caso com os verificadores ortogrficos.

Exemplo
Por exemplo, a distncia Levenshtein entre as palavras inglesas "kitten" (gato) e "sitting" (sentando-se) 3, j que
com apenas 3 edies conseguimos transformar uma palavra na outra, e no h maneira de o fazer com menos de trs
edies:
1. kitten
2. sitten (substituio de 'k' por 's')
3. sittin (substituio de 'e' por 'i')
4. sitting (insero de 'g' no final)
A distncia de Levenshtein pode ser considerada como uma generalizao da Distncia de Hamming, usada para
strings com o mesmo tamanho, a qual s considera edies por substituio. H tambm outras generalizaes da
distncia Levenshtein que consideram, por exemplo, a troca de dois caracteres como uma aplicao.

O algoritmo
Um algoritmo bottom-up de programao dinmica usado frequentemente para calcular a distncia Levenshtein usa
uma matriz (n + 1) (m + 1), na qual n e m so o nmero de caracteres dos dois strings. Aqui um pseudocdigo
para uma funo LevenshteinDistance que usa dois strings, str1 de comprimento lenStr1, e str2 de comprimento
lenStr2, e calcula a distncia Levenshtein entre eles:
Funo LevenshteinDistance(Caracter : str1[1..lenStr1], Caracter : str2[1..lenStr2]) : INTEIRO

Incio

// tab uma tabela com lenStr1+1 linhas e lenStr2+1 colunas

Inteiro: tab[0..lenStr1, 0..lenStr2]

// X e Y so usados para iterar str1 e str2

Inteiro: X, Y, cost

Para X de 0 at lenStr1

tab[X, 0] X

Para Y de 0 at lenStr2

tab[0, Y] Y

Para X de 1 at lenStr1

Para Y de 1 at lenStr2

Se str1[X] = str2[Y] Ento cost 0

Se-No cost 2 // Custo da substituio deve ser 2, deleo e insero

tab[X, Y] := menor(

tab[X-1, Y ] + 1, // Deletar

tab[X , Y-1] + 1, // Inserir

tab[X-1, Y-1] + cost // Substituir


Distncia Levenshtein 175

LevenshteinDistance tab[lenStr1, lenStr2]

Fim

A constante mantida ao longo do algoritmo que podemos transformar o segmento inicial str1[1..X] em
str2[1..Y] usando um mnimo de operaes tab[X,Y]. No final, o elemento no fundo ao lado direito do array
contm a resposta.

Melhoramentos possveis
Melhoramentos possveis para este algoritmo poderiam ser por exemplo:
Podemos adaptar o algoritmo para usar menos espao, O(m) em vez de O(mn), j que ele apenas requer que a
linha anterior e a linha actual sejam armazenadas ao mesmo tempo.
Podemos armazenar o nmero de inseres, delees e substituies separadamente, ou mesmo as posies em
que elas ocorrem, que so sempre Y.
Podemos dar diferentes penalidades de custo insero, deleo e substituio.
A inicializao do tab[i,0] pode passar para dentro do grande loop principal exterior.
Este algoritmo paraleliza de uma forma pouco eficiente, devido a grande nmero de dependncias de dados. No
entanto, todo o custo pode ser calculado em paralelo, e o algoritmo pode ser adaptado para perfazer a funo
mnimo em fases para eliminar dependncias.

Prova de sucesso
Como foi mencionado, a constante que podemos transformar o segmento inicial s[1..X] em t[1..Y] usando
um mnimo de tab[X,Y] operaes. Esta constante verdadeira j que:
inicialmente verdadeira na linha e colunas 0 porque s[1..X] pode ser transformado num string vazio
t[1..0] por simplesmente apagando todos os X caracteres. Do mesmo modo, podemos transformar
s[1..0] em t[1..Y] ao simplesmente adicionando todos os caracteres Y.
O mnimo tomado em trs distncias, sendo em qualquer das quais possvel que:
Se podemos transformar s[1..X] a t[1..Y-1] em k operaes, ento ns podemos simplesmente
adicionar t[Y] depois para obter t[1..Y] em k+1 operaes.
Se podemos transformar s[1..X-1] a t[1..Y] em k operaes, ento ns podemos fazer as mesmas
operaes em s[1..X] e depois remover o s[X] original ao fim de k+1 operaes.
Se podemos transformar s[1..X-1] a t[1..Y-1] em k operaes, ento podemos fazer o mesmo com
s[1..X] e depois fazer uma substituio de t[Y] pelas s[X] originais no final, se necessrio, requerindo
k+cost operaes.
As operaes requiridas para transformar s[1..n] em t[1..m] o nmero necessrio para transformar
todos os s em todos os t, e logo tab[n,m] contm o nosso resultado desejado.
Esta prova no confirma que o nmero colocado em tab[X,Y] seja de facto o mnimo; isso mais difcil de
provar e exige um argumento Reductio ad absurdum no qual assumimos que tab[X,Y] menor que o mnimo
dos trs, e usamos isto para mostrar que um dos trs no mnimo.
Distncia Levenshtein 176

Limites superior e inferior


A distncia Levenshtein tem vrios limites superior e inferior simples que so teis em aplicaes que calculam
vrios deles e os comparam. Estes incluem:
sempre pelo menos igual diferena dos tamanhos dos dois strings.
no mximo igual ao tamanho do string mais longo.
zero se e s se os strings so idnticos.
Se os strings tm o mesmo tamanho, a distncia de Hamming um limite superior da distncia Levenshtein.
Se os strings so chamados s e t, o nmero de caracteres (no contando os duplicados) que encontramos em s
mas no em t um limite inferior.

Links (em portugus, ingls e alemo)


Levenshtein distance - Rosetta Code [1] - Implementaes do algoritmo em diversas linguagens de programao
O fantstico mundo da distncia de edio (um survey em formato PDF sobre distncia de edio) [2]
Levenshtein Distance, in Three Flavors, by Michael Gilleland [3]
NIST's Dictionary of Algorithms and Data Structures: Levenshtein Distance [4]
CSE 590BI, Winter 1996 Algorithms in Molecular Biology [5] The algorithms from lectures 2, 3 and 4 are based
on the Levenshtein distance but implement a different scoring function. The Haskell example was based on these
notes.
Levenshtein Distance - visualized [6]
Distance between strings - Levenshtein and Hamming [7]
Another Edit Distance Visualization (very fast) [8]
Wie funktioniert der Levenshtein-Algorithmus? [9]

Referncias
[1] http:/ / rosettacode. org/ wiki/ Levenshtein_distance
[2] http:/ / www. dcc. ufmg. br/ ~nivio/ cursos/ pa03/ seminarios/ seminario4/ seminario4. pdf
[3] http:/ / www. merriampark. com/ ld. htm
[4] http:/ / www. nist. gov/ dads/ HTML/ Levenshtein. html
[5] http:/ / www. cs. washington. edu/ education/ courses/ 590bi/ 96wi/
[6] http:/ / www-igm. univ-mlv. fr/ ~lecroq/ seqcomp/ node2. html
[7] http:/ / www. cut-the-knot. org/ do_you_know/ Strings. shtml
[8] http:/ / www. cs. unm. edu/ ~luger/ ai-final/ demos. html
[9] http:/ / www. levenshtein. de/
Diviso polinomial 177

Diviso polinomial
Em lgebra a diviso polinomial um algoritmo para dividir um polinmio por outro polinmio de menor ou igual
grau, ou seja, uma verso generalizada da tcnica aritmtica de diviso. facilmente realizvel mo, porque separa
um processo complicado de diviso em divises mais simples.
Considerando os polinmios f(x) e g(x), em que o grau de f(x) maior ou igual ao grau de g(x), existe um nico par
de polinmios q(x) e r(x) de forma que

tendo r(x) um menor grau do que g(x).


A diviso sinttica, permite obter o quociente q(x) e o resto r(x) dado um dividendo f(x) e um divisor g(x). O
problema escrito como um problema de diviso no algbrica.
;
Todos os termos com expoentes inferiores ao maior, devem ser escritos explicitamente, mesmo que os seus
coeficientes sejam zero.

Eleio de lder
Eleio de lder um problema da rea de sistemas distribudos que busca selecionar de forma consensual um
processo num conjunto de processos tendo como objetivo selecionar um lder para uma determinada tarefa. A eleio
torna-se necessria quando o sistema distribudo est sendo iniciado pela primeira vez ou o lder anterior no
consegue se comunicar com os demais processos pela ocorrncia alguma falha. H vrios algoritmos que realizam a
eleio do lder, cada um especfico a alguma situao.

Algoritmo em anel
O algoritmo em anel ou LCR, iniciais de Le Lann, Chang e Roberts, serve para eleger um lder se os processos
estiverem dispostos em um anel. Cada processo deve conhecer seu vizinho direita e esquerda e deve ter um
identificador numrico, nico, fixo e atribudo antes do incio da eleio. Originalmente este algoritmo visava a
recuperao de um token perdido em uma rede com topologia em forma de anel, elegendo um n da rede que
servisse como ponto de partida para o novo token.
A execuo do algoritmo busca eleger o processo de maior identificador e fazer com que todos os membros do anel
reconheam o novo lder. Este o seu pseudocdigo:
Se um dos ns identifica a perda do token, inicia a eleio enviando uma mensagem de eleio com o seu nmero
de n ao vizinho da direita.
Se o n que recebe a mensagem de eleio tem um identificador maior que o informado na mensagem que
recebeu, passa uma mensagem de eleio para seu vizinho da direita com seu prprio identificador. Caso
contrrio aceita que o n que tem o identificador contido na mensagem ser o lder e repassa ao seu vizinho da
direita.
Se o n recebe uma mensagem com o identificador idntico ao seu, ele se declara lder. Este evento s ocorre
quando a mensagem contendo o maior identificador circulou por todo o anel tornando todos os seus membros
cientes do resultado.
Eleio de lder 178

Algoritmo de bully
O algoritmo de bully serve para eleger um lder entre processos identificados por um identificador numrico, nico,
fixo e atribudo antes do incio da eleio. Entretanto neste caso a topologia no limitada a um anel e cada um dos
processos pode se comunicar com qualquer outro no sistema. Novamente a execuo do algoritmo busca eleger o
processo de maior identificador e fazer com que todos reconheam o novo lder. Este o seu pseudocdigo:
Se um dos processos identifica a perda de contato com o lder, inicia uma nova eleio enviando a todos os outros
uma mensagem contendo seu identificador.
Todos os ns respondem ao processo que iniciou a eleio com os seus prprios identificadores.
Se o processo que iniciou a eleio verifica possui o maior identificador entre todos os outros, proclama-se lder e
avisa todos os outros. Seno aguarda que o processo de maior identificador inicie uma eleio e se torne lder.
Este algoritmo possui este nome justamente por seu comportamento de bully. O processo de maior identificador
predomina sobre os de menor nmero e mesmo que um destes ganhe uma eleio, rapidamente toma o posto do
eleito propondo uma nova eleio.

Encapsulao
Encapsulao nada mais do que esconder detalhes da implementao revelando somente uma pequena interface de
uso.

Escalonamento garantido
Escalonamento garantido um dos tipos de algoritmos escalonadores. Ele garante aos processos sua execuo,
dando a todos eles a mesma quantidade de tempo de execuo utilizando a CPU.
Se acontecer de um processo utilizar menos tempo de execuo do que poderia, sua prioridade de execuo
aumentada. Se outro processo utilizou mais do que deveria, sua prioridade diminuida.
Uma abordagem completamente diferente para agendamento fazer promessas realistas aos usurios sobre o
desempenho e, ento, conviver com elas. Uma promessa que realista e fcil de cumprir : se houver N usurios
conectados no momento em que voc estiver trabalhando, voc receber aproximadamente 1/N do poder da CPU. De
maneira semelhante, em um sistema monousurio com N processos executando, todas as coisas sendo iguais, cada
uma deve receber 1/N dos ciclos da CPU.
Para cumprir essa promessa, o sistema deve monitorar quanto da CPU cada processo teve, desde sua criao. Ento,
ele calcula o quanto da CPU atribudo a cada um, isto , o tempo desde a criao dividido por N. Como a
quantidade de tempo de CPU que cada processo realmente teve tambm conhecida, simples calcular a proporo
entre o tempo real da CPU e o tempo da CPU atribudo. Uma proporo de 0,5 significa que um processo s teve a
metade do que deveria ter tido e uma proporo de 2,0 significa que um processo teve o dobro de tempo que lhe foi
atribudo. O algoritmo, ento, executar o processo com a proporo mais baixa at que sua proporo tenho subido
acima do seu competidor mais prximo
Exemplo: 3 processos querem executar, o algoritmo fornece a cada um deles 3 segundos de execuo para utilizar
CPU. O 1 processo executa 3 segundos e pra, ento entra o 2 executa 3 segundos e pra, 3 executa 3 segundos
pra e o 1 executa novamente 3 segundos e assim por diante at eles terminarem sua execuo.
Funciona de forma diferente dos demais escalonadores porque este sistema garante que cada usurio ter uma frao
da CPU independente da quantidade de processos alocados.
Esta forma de escalonamento normalmente usada em sistemas de tempo real.
Escalonamento garantido 179

- O SO faz promessas e deve mant-las.

- O escalonador sabe exatamente o tempo necessrio para realizar cada operao do sistema operacional.

- Cada operao deve ter um tempo mximo de execuo garantido.

O escalonamento garantido altera a prioridade dinamicamente, garantindo o mesmo tempo de execuo.

- A Frmula que a CPU usa para determinar o tempo que cada programa : (e.g. 1/n CPU).

Exame de Graham
O Exame de Graham, cuja a denominao vem de Ronald Graham, uma tcnica de computao usada para
determinar o envoltria convexa de um dado conjunto de pontos no plano como complexidade de tempo O(n log n).

O Algoritmo

Como se pode notar, A para B e B para C so no sentido horrio, mas C de D no . Este algoritmo detecta esta situao e
descarta segmentos escolhidos anteriormente at que se orientem no sentido horrio (B para D neste caso.)

O primeiro passo neste algoritmo encontrar o ponto com a menor coordenada y. Se houver um empate, o ponto
com menor coordenada x deve servir como critrio de desempate. Chamaremos esta ponto de P . Este passo da
ordem O (n), onde n o nmero de pontos em questo.
Depois, o conjunto de pontos deve ser ordenado em ordem crescente do ngulo que ele com o ponto P formam com
o eixo X. Qualquer algoritmo ordenao de uso geral apropriado para isto, por exemplo, o heapsort (o qual da
ordem de O(n log n)). De forma a acelerar os clculos, no necessrio calcular os ngulos que estes pontos formam
com o eixo x; ao invs disto suficiente calcular a tangente deste ngulo, que pode ser feito com simples aritmtica.
O algoritmo processa considerando que cada ponto que cada ponto do array ordenado em seqncia. Para cada
ponto, determinado movendo-se de dois pontos antes para este ponto uma "curva para esquerda" ou uma "curva
para direita". Se uma "curva para direita", isto significa que o ponto de partida no faz parte do envoltrio convexo
e deve ser removido da pesquisa. Este processo continua ao longo do conjunto at que o conjunto dos trs ltimos
pontos seja uma curva para direita. To logo uma "curva a esquerda" encontrada, o algoritmo salta para o prximo
ponto do array ordenado. ( Se em qualquer etapa trs pontos so colineares, indiferente se o ponto do meio
removido ou no. Removendo-o obteremos um envoltrio convexo mnimo, mas o mantendo isto no o invlida).
Exame de Graham 180

Novamente, para determinar se trs pontos constituem uma "curva a esquerda" ou "curva a direita" no necessrio
calcular o ngulo existente entre os dois segmentos de retas, isto pode ser obtido simplesmente por aritmtica inteira.
Dado trs pontos , e , simplesmente calculando o produto vetorial
dos dois vetores definidos definidos pelos pontos ,
e , . Se o resultado for Zero, os trs pontos so colineares, se for positivo, os trs
pontos constituem uma "curva para esquerda", caso contrario uma "curva para direita".
Este processo ir eventualmente retornar ao ponto de incio, neste ponto o algoritmo estar concludo e o array agora
contm os pontos do envoltrio convexo no sentido anti-horrio.

Pseudocdigo
Este algoritmo resultar no envoltrio convexo mnimo. O resultado estar armazenado na Pilha.

Find pivot P;
Sort Points by angle (resolve ties in favor of point farther from P);

# Points[1] is the pivot


Stack.push(Points[1]);
Stack.push(Points[2]);
FOR i = 3 TO Points.length
o <- Cross_product(Stack.second, Stack.top, Points[i]);
IF o == 0 THEN
Stack.pop;
Stack.push(Points[i]);
ELSEIF o > 0 THEN
Stack.push(Points[i]);
ELSE
WHILE o <= 0 and Stack.length > 2
Stack.pop;
o <- Cross_product(Stack.second, Stack.top, Points[i]);
ENDWHILE
Stack.push(Points[i]);
ENDIF
NEXT i

FUNCTION Cross_product(p1, p2, p3)


RETURN (p2.x - p1.x)*(p3.y - p1.y) - (p3.x - p1.x)*(p2.y - p1.y);
ENDFUNCTION
Exame de Graham 181

Referncias
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms,
Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Pages 949955 of section 33.3:
Finding the convex hull.

Ligaes externas
C++ and Object Pascal Graham Scan Implementations [1]

Referncias
[1] http:/ / www. partow. net/ projects/ fastgeo/ index. html

FIFO (escalonamento)
O algoritmo de escalonamento FIFO uma estrutura de dados que apresenta o seguinte critrio: O primeiro elemento
a ser retirado o primeiro que tiver sido inserido (First In First Out O primeiro a entrar o primeiro a sair (PEPS) )
conhecido popularmento por Algoritmo de Fila Simples que tambm conhecido como FCFS (First Come First
Served O primeiro a chegar o primeiro a ser servido) um algoritmo de escalonamento no preemptivo que
entrega a CPU os processos pela ordem de chegada. Ele executa o processo como um todo do inicio ao fim no
interrompendo o processo executado at ser finalizado, ento quando um novo processo chega e existe um ainda em
execuo ele vai para uma fila de espera. Esta fila de espera nada mais do que uma fila que organiza os processos
que chegam at eles serem atendidos pela CPU.
Neste escalonamento todos os processos tendem a serem atendidos (por isso evita o fenmeno do starvation) ao
menos que um processo possua um erro ou loop infinito. O loop infinito ir parar a mquina, pois com o FIFO no
ter como dar continuidade a execuo dos processos que esto aguardando na fila de espera.
O algoritmo FIFO no garante um tempo de resposta rpido pois extremamente sensvel a ordem de chegada de
cada processo e dos antecessores (se existirem) e se processos que tendem a demorar mais tempo chegarem primeiro
o tempo mdio de espera e o turnaround acabam sendo aumentados.
FIFO (escalonamento) 182

Vantagens
O mais simples entre os processos de escalonamento
Todos os processos tendem a serem atendidos

Desvantagens
Muito sensvel a ordem de chegada.
Se processos maiores chegarem primeiro aumentaro o tempo mdio de espera.
No garante um tempo de resposta rpido.
No eficiente em sistemas de tempo compartilhado
No eficiente em sistemas em tempo real

Referncias
Tanenbaum, Andrew S., Sistemas Operacionais Modernos, Ed. Campus, 1995
Fluxograma 183

Fluxograma
Fluxograma um tipo de diagrama, e pode ser
entendido como uma representao esquemtica de um
processo, muitas vezes feito atravs de grficos que
ilustram de forma descomplicada a transio de
informaes entre os elementos que o compem, ou
seja, fluxograma um grfico que demonstra a
seqncia operacional do desenvolvimento de um
processo, o qual caracteriza: o trabalho que est sendo
realizado, o tempo necessrio para sua realizao, a
distncia percorrida pelos documentos, quem est
realizando o trabalho e como ele flui entre os
participantes deste processo.

O Diagrama de fluxo de dados (DFD) utiliza do


Fluxograma para modelagem e documentao de
sistemas computacionais.
O termo Fluxograma designa uma representao
grfica de um determinado processo ou fluxo de
trabalho, efetuado geralmente com recurso a figuras
geomtricas normalizadas e as setas unindo essas
figuras geomtricas. Atravs desta representao
grfica possvel compreender de forma rpida e fcil Um fluxograma simples mostrando como lidar com uma lmpada
a transio de informaes ou documentos entre os que no funciona.

elementos que participam no processo em causa.


O fluxograma pode ser definido tambm como o grfico em que se representa o percurso ou caminho percorrido por
certo elemento (por exemplo, um determinado documento), atravs dos vrios departamentos da organizao, bem
como o tratamento que cada um vai lhe dando.
A existncia de fluxogramas para cada um dos processos fundamental para a simplificao e racionalizao do
trabalho, permitindo a compreenso e posterior optimizao dos processos desenvolvidos em cada departamento ou
rea da organizao.

Ligaes externas
Como fazer um fluxograma [1] (em portugus)
Exemplos de cartas de fluxo [2] (em espanhol)
Editor e intrprete do fluxograma GPL [3] (em portugus)

Referncias
[1] http:/ / www. oficinadanet. com. br/ artigo/ desenvolvimento/ como_fazer_um_fluxograma
[2] http:/ / www. mis-algoritmos. com/ diagramas-flujo. html
[3] http:/ / wiki. freaks-unidos. net/ freedfd/ index-pt
Fora bruta 184

Fora bruta
Em cincia da computao, fora bruta (ou busca exaustiva) um algoritmo trivial mas de uso muito geral que
consiste em enumerar todos os possveis candidatos de uma soluo e verificar se cada um satisfaz o problema.
Por exemplo, um algoritmo para encontrar os divisores de um nmero natural enumerar todos os inteiros de 1 a
, e verificar para cada um se ele dividido por resulta em resto 0.
Esse algoritmo possui uma implementao muito simples, e sempre encontrar uma soluo se ela existir.
Entretanto, seu custo computacional proporcional ao nmero de candidatos a soluo, que, em problemas reais,
tende a crescer exponencialmente. Portanto, a fora bruta tipicamente usada em problemas cujo tamanho
limitado, ou quando h uma heurstica usada para reduzir o conjunto de candidatos para uma espao aceitvel.
Tambm pode ser usado quando a simplicidade da implementao mais importante que a velocidade de execuo,
como nos casos de aplicaes crticas em que os erros de algoritmo possuem em srias consequncias.

Aplicao na ordenao
Um exemplo clssico de aplicao de algoritmos da classe da fora bruta a ordenao, que pode ser aplicada nos
mais diferentes tipos de dados.
Por exemplo, uma das formas de resolver o problema consiste em procurar o menor elemento e coloc-lo na primeira
posio, operando sucessivamente com os demais elementos da lista a ser classificada at finalizar a operao, um
mtodo conhecido como ordenao por insero.
Outro exemplo a busca de padres. Dada uma cadeia de caracteres de tamanho (o "texto") e outra cadeia com
tamanho menor ou igual chamada "padro". realizada uma procura no "texto" pelo "padro", verificando-se
todo o texto em busca de mltiplas ocorrncias. O funcionamento da busca de padro simples: se o primeiro
caractere idntico um referente no texto, todos os sucessores devem ser idnticos tambm, at finalizar o padro.
Caso ocorra que um caractere no seja igual, desloca-se o padro em um caractere at chegar ao fim do texto ou
encontrar o padro.

rotina BuscaPadrao(texto[0 ... n-1], padrao[0 ... m-1])


para i 0 at n m faa
j 0
enquanto j < m e padrao[j] = texto[i + j] faa
j j + 1
se j = m ento
retorne i
retorne -1

Note que o algoritmo desloca-se aps a comparao do primeiro caractere, porm nem sempre assim. O pior caso
"muito pior": o algoritmo tem que comparar todos os caracteres antes de se deslocar, e isso pode ocorrer para
cada uma das tentativas. Portanto, o pior caso para este algoritmo est em . Para textos de
linguagem natural, o caso mdio melhor (pois ocorre nas primeiras comparaes). At em textos aleatrios, o
comportamento se mostra linear, .
Fora bruta 185

Aplicao em problemas avanados


Um exemplo o problema do par mais prximo, que consiste em achar os dois pontos mais prximos em um
conjunto de pontos. Para o exemplo a seguir, por simplicidade se assume o plano cartesiano, de forma que a
distncia calculada pela distncia euclidiana. O algoritmo de fora bruta percorrer o conjunto, e selecionar o par
com menor distncia, ignorando pontos na mesma posio.

rotina ParProximo(P)
dmin
para i 1 at n 1 faa
para j i + 1 at n faa
d raiz((xi - xj) + (yi yj))
se d < dmin
dmin d
ind1 i
ind2 j
retorne ind1, ind2

Exemplo de ataque
O grupo que gerencia o programa 7-Zip criou um exemplo de quanto tempo demoraria para um atacante burlar um
sistema atravs de fora bruta, segue abaixo a traduo do problema:[1]
Ataque de acordo com o nmero de caractere da senha
Isto uma estimativa de tempo requerido para um exaustivo ataque de senha (fora bruta), sendo que a senha uma
seqencia aleatria de letras minsculas latinas.
Vamos supor que um usurio possa controlar 10 senhas por segundo e que uma organizao com um oramento de
$1 bilho (mil milhes) de dlares possa controlar 1 bilho de senhas por segundo. Tambm supomos que o
processador em uso duplica seu desempenho a cada dois anos, assim, cada letra latina que acrescentarmos ser
adicionada 9 anos de um exaustivo ataque de senha.
O resultado esta estimativa de tempo para ter sucesso num ataque:

Tamanho da senha Ataque de um usurio comum Ataque da organizao

1 letra minscula latina 2 segundos 1 segundo

2 1 minuto 1s

3 30 min 1s

4 12 horas 1s

5 14 dias 1s

6 1 ano 1s

7 10 anos 1s

8 19 anos 20s

9 26 anos 9 min

10 37 anos 4 horas

11 46 anos 4 dias

12 55 anos 4 meses

13 64 anos 4 anos

14 73 anos 13 anos
Fora bruta 186

15 82 anos 22 anos

16 91 anos 31 anos

17 100 anos 40 anos

Observao: O exemplo abrange apenas uma senha com letras latinas minsculas, ou seja, uma senha que
possua apenas letras de " a - f ". Ao colocar a possibilidade de existir letras maisculas e smbolos especiais
aumentar ainda mais o tempo para se realizar todas as possibilidades de um ataque.
[1] O contedo original pode ser encontrado na seo "7z format" da "General Information" do arquivo de ajuda do programa "7-Zip" na verso
"4.58", sendo que o mesmo se encontra sob a licena GNU LGPL, tendo assim a permisso para a copia e modificao do texto sem aviso
prvio do grupo compositor do mesmo.

Gerador de nmeros pseudoaleatrios


Um gerador de nmero pseudo-aleatrio um algoritmo que gera uma seqncia de nmeros, os quais so
aproximadamente independentes um dos outros.
A sada da maioria dos geradores de nmeros aleatrios no verdadeiramente aleatria; ela somente aproxima
algumas das propriedades dos nmeros aleatrios. John von Neumann enfatiza com este comentrio "Qualquer um
que considere mtodos aritmticos para produzir dgitos est, certamente, cometendo um pecado". Enquanto
nmeros verdadeiramente aleatrios podem ser gerados usando hardware para gerao de nmero aleatrio, nmero
pseudo-aleatrios so uma parte crtica da computao moderna, da criptografia at o mtodo de Monte Carlo
passando por sistemas de simulao. Uma cuidadosa anlise matemtica necessria para assegurar que a gerao
dos nmeros seja suficientemente "aleatria".

Heurstica (computao)
Em Cincia da Computao, normalmente existem duas propriedades principais na criao e elaborao de
algoritmos:
1. fazer o algoritmo ter um tempo de execuo sempre aceitvel e
2. ser a soluo tima ou provavelmente boa para o problema em todos os casos.
No entanto, um algoritmo heurstico no cumpre uma dessas propriedades, podendo ser ou um algoritmo que
encontra boas solues a maioria das vezes, mas no tem garantias de que sempre encontrar ou um algoritmo que
tem processamento rpido, mas no tem provas de que ser rpido para todas as situaes.
A pesquisa por heursticas uma pesquisa realizada por meio da quantificao de proximidade a um determinado
objectivo. Diz-se que se tem uma boa (ou alta) heurstica se o objecto de avaliao est muito prximo do objectivo;
diz-se de m (ou baixa) heurstica se o objecto avaliado estiver muito longe do objectivo. Etimologicamente a
palavra heurstica vem da palavra grega Heuriskein, que significa descobrir (e que deu origem tambm ao termo
Eureca).
Um algoritmo aproximativo (ou algoritmo de aproximao) heurstico, ou seja, utiliza informao e intuio a
respeito da instncia do problema e da sua estrutura para resolv-lo de forma rpida.
Entretanto, nem todo algoritmo heurstico aproximativo, ou seja, nem toda heurstica tem uma razo de qualidade
comprovada matematicamente ou prova formal de convergncia. Por este motivo, em vrias referncias
bibliogrficas distingue-se os termos algoritmo aproximativo e heurstica:
aproximativo a denominao do algoritmo que fornece solues dentro de um limite de qualidade absoluto ou
assinttico, assim como um limite assinttico polinomial de complexidade (pior caso) comprovado
Heurstica (computao) 187

matematicamente;
heurstica e mtodo heurstico so denominaes para o algoritmo que fornece solues sem um limite formal
de qualidade, tipicamente avaliado empiricamente em termos de complexidade (mdia) e qualidade das solues.
A heurstica um conjunto de regras e mtodos que conduzem descoberta, inveno e resoluo de problemas.
Tambm uma cincia auxiliar da Histria que estuda a pesquisa das fontes.

Classificao das heursticas


Mtodos heursticos geralmente se enquadram dentro dos seguintes grupos:
heursticas de construo, tais como o mtodo guloso, que so aquelas onde uma ou mais solues so construdas
elemento a elemento, seguindo algum critrio heurstico de otimizao, at que se tenha uma soluo vivel;
heursticas de busca em vizinhana, como a busca local, as quais necessariamente partem de uma soluo inicial
vivel (em alguns casos podendo ser somente uma soluo possvel qualquer), tentando melhorar esta soluo
atravs de operaes de troca, remoo ou insero, at que no seja mais possvel a melhoria ou algum outro
critrio de parada seja satisfeito;
heursticas sistemticas, tais como a Busca com Discrepncia Limitada ou Backtracking Controlado, onde a
rvore de espao de solues percorrida utilizando critrios de ramificao e corte da rvore;
heursticas hbridas, resultantes da combinao de duas ou mais heursticas com estratgias diferentes;
metaheursticas, que so heursticas genricas mais sofisticadas, onde uma heurstica mais simples gerenciada
por um procedimento que visa explorar inteligentemente a instncia do problema e o seu espao de solues.
Ainda existem outros tipos de heurstica, tais como as tcnicas de relaxao por exemplo. Entretanto, tais tcnicas
so especficas para problemas formulados como problemas de programao inteira ou constraint problems, os quais
pertencem a um tipo particular de problema de otimizao combinatorial.

Ver Tambm
Heurstica de Clarke e Wright
Intratabilidade 188

Intratabilidade
Intratabilidade, no contexto da cincia da computao, um conceito que se refere a determinadas classes de
problemas, para os quais no existem algoritmos substancialmente melhores que a execuo de uma busca exaustiva.
Estes problemas so chamados "inerentemente intratveis". Provar essa intratabilidade inerente pode ser to difcil
quanto encontrar um algoritmo eficiente para resolver o problema.

Jaro-Winkler
1. REDIRECIONAMENTO Distncia de Jaro-Winkler

Juno hash
Juno hash (do ingls hash join) em cincia da computao um algoritmo de juno usado nas implementaes
de sistemas de gerncia de bancos de dados relacionais. O objetivo deste algoritmo encontrar o conjunto de tuplas
que devem estar na relao resultante da operao de juno, contendo cada um dos valores distintos do atributo
sobre o qual realizada a operao.
Dadas duas relaes que passaro pela operao de juno, para a menor relao o algoritmo gera uma tabela hash
sobre os valores assumidos pelo atributo da juno que serve como ndice para tornar o acesso mais rpido. Ento a
relao maior percorrida e para encontrar os valores de atributos cujo hash esteja presente no ndice criado.[1]
[1] Artigo Implementation techniques for main memory database systems (http:/ / portal. acm. org/ citation. cfm?id=602261) de David J DeWitt,
Randy H Katz, Frank Olken, Leonard D Shapiro, Michael R Stonebraker e David Wood, 1984
Algoritmo de Kruskal 189

Algoritmo de Kruskal
O algoritmo de Kruskal um algoritmo em teoria dos grafos que busca uma rvore geradora mnima para um grafo
conexo com pesos. Isto significa que ele encontra um subconjunto das arestas que forma uma rvore que inclui todos
os vrtices, onde o peso total, dado pela soma dos pesos das arestas da rvore, minimizado. Se o grafo no for
conexo, ento ele encontra uma floresta geradora mnima (uma rvore geradora mnima para cada componente
conexo do grafo). O algoritmo de Kruskal um exemplo de um algoritmo guloso (tambm conhecido como
ganancioso ou greedy).
Seu funcionamento mostrado a seguir:
crie uma floresta F (um conjunto de rvores), onde cada vrtice no grafo uma rvore separada
crie um conjunto S contendo todas as arestas do grafo
enquanto S for no-vazio, faa:
remova uma aresta com peso mnimo de S
se essa aresta conecta duas rvores diferentes, adicione-a floresta, combinando duas rvores numa nica
rvore parcial
do contrrio, descarte a aresta
Ao fim do algoritmo, a floresta tem apenas um componente e forma uma rvore geradora mnima do grafo.
Com o uso de uma estrutura de dados aceitvel, o algoritmo de Kruskal pode ser demonstrado que executa em tempo
O (m log n), onde m o nmero de arestas e n o nmero de vrtices.

Exemplo
Grafo original a ser computado o algoritmo de Kruskal. Os nmeros representam o peso nas arestas, e no
momento no existe aresta selecionada.

As arestas AD e CE so as mais leves do grafo e ambas podem ser selecionadas. escolhido ao acaso AD.

Agora a aresta CE a mais leve. J que ele no forma um lao com AD ela selecionada.

A prxima aresta a DF com peso 6. Ela no forma um lao com as arestas j selecionadas ento ela
selecionada.
Algoritmo de Kruskal 190

Agora duas arestas com peso 7 podem ser selecionadas e uma escolhida ao acaso. A aresta BD marcada
pois forma um lao com as outras arestas j selecionadas.

Agora a outra aresta de peso 7 selecionada pois cobre todos os requisitos de seleo. Similarmente ao
passo anterior, outras arestas so marcadas para no serem selecionadas, pois resultariam em um lao.

Para finalizar selecionada a aresta EG com peso 9. FG marcada. J que agora todas as arestas
disponveis formariam um lao, chega-se ao final do algoritmo e a rvore geradora mnima encontrada.

Lamport ordering
Lamport ordering so algoritmos de sistemas distribudos.
Atravs de observaes de como os processos distribudos deveram se comportar, verificou-se que no importa que
um processo que no tem interao com outro, estejam sincronizados, pois o desempenho de um deles no ir afetar
o resultado de outro.
Tambm no necessrio que todos tenham o clock perfeitamente sincronizados, desde que todos eles concordem
com a ordem que os eventos devem acontecer. Este clock chamado de clock lgico.
Exemplo: um processo encarregado de realizar a compilao de um determinado arquivo-fonte, outro responsvel
por execut-lo, no importa o tempo que o primeiro ir compilar o arquivo, desde que o segundo processo s execute
depois que o arquivo j esteja compilado.
Leaky Bucket 191

Leaky Bucket
O algoritmo de Leaky Bucket permite controlar a taxa de transmisso de pacotes pela rede, transparecendo que todo
o trfego transmitido a uma taxa constante.
Este algoritmo resume-se a um "balde" que representa o buffer do receptor com capacidade para b bytes no qual os
pacotes que chegam so armazenados e numa taxa de transmisso constante x(t) e so enviados para resproduo a
uma taxa d. Seguem-se algumas opes do uso do leaky-bucket :
1. A taxa de chegada dos pacotes para o buffer igual a taxa de reproduo, ou seja, x(t) = d. Nesse caso a
reproduo no sofrer problemas, pois nem haver falta dados para reproduo e nem haver sobrecarga do buffer
(overflow). 2. A taxa de chegada dos pacotes para o buffer superior a taxa de reproduo, ou seja x(t) > d. Com isto
o buffer acabar por ser sobrecarregado (sofrer overflow) e comear a descartar pacotes. Essa perda de pacotes
prejudicar a reproduo do video/audio o qual reproduzir com falta de dados. 3. A taxa de chegada dos pacotes
para o buffer inferior a taxa de reproduo, ou seja x(t) < d. Nesse caso, ocorrer uma situao oposta ao caso
anterior, ou seja a reproduo parar de mostrar novos dados de video/audio pois o buffer estar vazio, numa
situao conhecida como inanio.

Notas

Mtodo de Monte Carlo


O mtodo de Monte Carlo (MMC) um
mtodo estatstico utilizado em simulaes
estocsticas com diversas aplicaes em
reas como a fsica, matemtica e
biologia[1]. O mtodo de Monte Carlo tem
sido utilizado h bastante tempo como
forma de obter aproximaes numricas de
funes complexas. Este mtodo
tipicamente envolve a gerao de
observaes de alguma distribuio de
Aplicao do mtodo de Monte Carlo para determinar a rea de um lago.
probabilidades e o uso da amostra obtida
para aproximar a funo de interesse. As
aplicaes mais comuns so em computao numrica para avaliar integrais. A ideia do mtodo escrever a integral
que se deseja calcular como um valor esperado.

De acordo com (HAMMERSELEY,1964) o nome "Monte Carlo" surgiu durante o projeto Manhattan na Segunda
Guerra Mundial. No projeto de construo da bomba atmica, Ulam, von Neumann e Fermi consideraram a
possibilidade de utilizar o mtodo, que envolvia a simulao direta de problemas de natureza probabilstica
relacionados com o coeficiente de difuso do neutron em certos materiais. Apesar de ter despertado a ateno desses
cientistas em 1948, a lgica do mtodo j era conhecida h bastante tempo. Por exemplo, existe um registro de um
artigo escrito por Lord Kelvin dezenas de anos antes, que j utilizava tcnicas de Monte Carlo em uma discusso das
equaes de Boltzmann. (Fonte Mundo PM)
Existem trs classes de algoritmos Monte Carlo: Erro-Unilateral, Erro-Bilateral e Erro-No-Limitado.
Mtodo de Monte Carlo 192

Monte Carlo de Erro-Unilateral


Seja P um problema e A um algoritmo aleatrio, A um algoritmo Monte Carlo de Erro-Unilateral que resolve P se

i) para toda configurao x que soluo de P, ,e

ii) para toda configurao x que no soluo de P, prob(A(x = NO)) = 1.


Ou seja, sempre que a resposta NO, o algoritmo garante a certeza da resposta.
Contudo, se a resposta for SIM, o algoritmo no garante que a resposta est correta.

Monte Carlo de Erro-Bilateral


Um algoritmo aleatrio A um algoritmo de Monte Carlo de Erro-Bilateral que computa o problema F se existe um
nmero real positivo , tal que para toda instncia x de F

Monte Carlo de Erro-No-Limitado


Os algoritmos Monte Carlo de Erro-No-Limitado so comumente chamados de Algoritmos Monte Carlo.
Um algoritmo aleatrio A um algoritmo de Monte Carlo se para qualquer entrada x do problema F

Algoritmo de Metropolis
O algoritmo de Metropolis, tambm conhecido por Algoritmo de Metropolis-Hastings, apresentado inicialmente em
1953 num artigo [2] de Nicholas Metropolis, Arianna Rosenbluth, Marshall Rosenbluth, Augusta Teller e Edward
Teller, e generalizado em 1970 por W. K. Hastings [3], provavelmente o mtodo Monte Carlo mais utilizado na
Fsica, e tem como objetivo determinar valores esperados de propriedades do sistema simulado, atravs de uma
mdia sobre uma amostra. O algoritmo concebido de modo a se obter uma amostra que siga a distribuio de
Boltzmann.
Para se determinar a probabilidade de uma dada configurao, seria necessrio conhecer a chance de ocorrncia de
todas as outras configuraes. No caso de variveis contnuas, seria necessrio uma integrao da densidade de
probabilidade sobre todo o espao de configuraes, mas esse procedimento fica muito custoso quando se utiliza um
nmero de variveis da ordem de centenas.
A eficincia do algoritmo de Metropolis est diretamente ligada ao fato de no levar em conta a probabilidade das
configuraes em si, mas sim a razo entre elas, pois a razo entre as probabilidades de duas dadas configuraes
pode ser determinada independentemente das outras. Dadas duas configuraes m e n quaisquer, a razo entre a
probabilidade da configurao m, P_m, e a probabilidade da configurao n, P_n, pode ser escrita como

A partir dessa igualdade, o algoritmo de Metropolis pode ser implementado atravs do seguinte conjunto de regras:
(a) Gerao de uma configurao inicial aleatria, ou seja, com valores aleatrios para todos os graus de liberdade do
sistema, respeitando as suas restries. Vamos atribuir o ndice m a essa configurao, que aceita para a amostra.
(b) Gerao de uma nova configurao-tentativa de ndice n, resultado de pequenas alteraes nas coordenadas da
configurao m.
Mtodo de Monte Carlo 193

(c) Se a energia da configurao n for menor que a da configurao m, inclui-se a configurao n na nossa amostra, e
se atribui a ela o ndice m a partir desse momento. Caso contrrio, realizam-se os passos descritos nos subitems (c1)
e (c2) abaixo:
(c1) Gera-se um nmero aleatrio entre 0 e 1;

(c2) Se esse nmero aleatrio for menor que , aceita-se na amostra a configurao n, e se atribui a ela o ndice

m. Caso contrrio, o ndice m permanece designando a configurao original.


(d) Repete-se os passos (b) e (c) at que algum critrio de parada seja satisfeito. Cada uma dessas repeties dita
um passo Monte Carlo (MC).

Referncias
[1] J. Hromkovic, Algorithms for hard
problems: introduction to combinatorial
optimization, randomization, approximation,
and heuristics. [S.l.]: Springer-Verlag,
London - Berlin - Heidelberg - New York,
2001.
[2] N. Metropolis, A. Rosenbluth, M.
Rosenbluth, A. Teller, E. Teller, Equation of
State Calculations by Fast Computing
Machines, Journal of Chemical Physics 21,
1087 (1953).
[3] W. K. Hastings, Monte Carlo Sampling
Methods Using Markov Chains and Their
Applications, Biometrika 57 (1), 97 (1970).

Fluxograma para o algoritmo de Metropolis. Fonte: Wikimedia, criador: Leonardo Castro.


Mtodo de Newton 194

Mtodo de Newton
Em anlise numrica, o mtodo de Newton (ou mtodo de
Newton-Raphson) tem o objetivo de estimar as razes de uma funo.
Para isso, toma-se um ponto qualquer do domnio da funo, calcula-se
a equao da tangente (derivada) da funo nesse ponto, calcula-se o
intercepto da tangente ao eixo das abcissas a fim de encontrar um novo
ponto do domnio da funo e repete-se o processo, que deve tender a
uma das razes da funo rapidamente, ou no tender a nada, deixando
isso claro logo. Em notao matemtica representa-se desta forma:

onde n indica a n-sima iterao do algoritmo e a derivada


da funo f em xn.
Para que se obtenha sucesso na iterao deve-se primeiramente
delimitar um intervalo, a fim de escolher um valor estimado inicial
adequado, para que a convergncia de (xn) seja propcia. Para tanto As trs primeiras iteraes do mtodo de Newton.
existem apenas quatro condies a serem satisfeitas:
O intervalo delimitado deve conter a raiz de f;
A funo f deve ser diferencivel em todo o intervalo;
A primeira derivada no intervalo no deve trocar de sinal;
A segunda derivada no intervalo no deve trocar de sinal.
Uma vez delimitado um intervalo que cumpra tais exigncias, escolhe-se para o valor-inicial o ponto mais esquerda
se o produto da primeira pela segunda derivada for negativo, ou escolhe-se o ponto mais direita se ocorrer o
contrrio, se o produto for positivo.
Este considerado por muitos autores o melhor mtodo para encontrar sucessivas melhores aproximaes de raizes
(ou zeros) de uma determinada funo real. A convergncia frequentemente rpida, em especial se a estimativa
inicial (ou chute inicial) est "suficientemente prximo" da raiz da funo. O mtodo atribuido a Sir Isaac Newton
(1643-1727) e Joseph Raphson (1648-1715).
Em 1984, Allan J. Macleod num artigo da International Journal of Mathematical Education in Science and
Technology, mostrou que o mtodo iterativo de Newton-Raphson para equaes no lineares pode ser considerado
um membro da famlia geral de um parmetro de mtodos de segunda ordem [1].

Ligaes externas
Roots of a function - Rosetta Code (http://rosettacode.org/wiki/Roots_of_a_function) - implementaes em
diversas linguagens de programao
Mtodo das secantes 195

Mtodo das secantes


Em anlise numrica, o mtodo das secantes um algoritmo de busca de razes que usa uma sequncia de razes de
linhas secantes para aproximar cada vez melhor a raiz de uma funo f.

O mtodo
O mtodo das secantes definido pela
relao de recorrncia

Como pode ser visto da relao de


recorrncia, o mtodo das secantes requer
dois valores iniciais, x0 e x1, que devem ser
preferencialmente escolhidos prximos da
raiz.

Derivao do mtodo
Dados xn1 e xn, construmos uma reta
passando pelos pontos (xn1, f(xn1)) e (xn,
f(xn)), como ilustrado na figura direita.
Note que essa reta uma secante ou corda
do grfico da funo f. Na forma
As duas primeiras iteraes do mtodo das secantes. A curva vermelha mostra a
ponto-declividade, ela pode ser definida
funo f e as linhas azuis so as secantes.
como

Agora escolhemos xn+1 como zero dessa reta, ento xn+1 escolhido de modo que

Resolvendo essa equao, obtm-se a relao de recorrncia para o mtodo das secantes.

Convergncia
As iteraes xn do mtodo das secantes convergem para uma raiz de f, se os valores iniciais x0 e x1 estiverem
suficientemente prximas da raiz. A ordem de convergncia do mtodo , onde

a razo urea. Em particular, a convergncia superlinear.


Esse resultado s vale sob certas condies tcnicas; a saber, f deve ser duas vezes continuamente diferencivel e a
raiz em questo deve ser simples (isto , no deve ser uma raiz mltipla).
Se os valores iniciais no estiverem prximos da raiz, no se pode garantir que o mtodo das secantes convirja.
Mltiplas filas 196

Mltiplas filas
Mltiplas Filas um tipo de algoritmo de escalonamento, no qual so usadas filas de processos. Cada fila tem um
determinado nvel de prioridade. Sendo um dos mais antigos agendadores de prioridade, estava presente no CTSS
(Compatible Time-Sharing System - Sistema Compatvel de Diviso por Tempo).
No algoritmo de Mltiplas Filas, tambm pode ser aplicado particularmente, em cada fila, diferentes algoritmos
como por exemplo, o algoritmo Round-robin ou FCFS (First-come, first-served).

Distribuio de Prioridades
O Sistema Operacional atende inicialmente as filas de prioridade mais alta, ento apenas quando uma fila
esvaziada que o escalonador passa para a prxima fila.
Outros mtodos de escalonamento podem ser combinados com mltiplas filas, sendo aplicado por exemplo, um em
cada fila:

Escalonamento por Mltiplas Filas traz alguns benefcios, entre eles esto:
Aumentar a utilizao da CPU: Com isto as chances da CPU ficar ociosa diminuem, aproveitando possveis
tempos de espera para a execuo de outro processo.
Maximizar o throughput: Mais processos sero executados num determinado tempo.
Minimizar o turnaround: Nesse caso o tempo total dos processos na CPU ser menor.
Minimizar o tempo de espera: O tempo de I/O dos processos ser menor.
Minimizar o tempo de resposta: O tempo em que os processos esperam para receber a CPU pela "primeira vez"
ser menor.
Diminuir o uso de recursos: Menos recursos sero usados pelos processos, evitanto Deadlock.
Priorizar processos que segurem recursos chave: Processos que necessitam de certos recursos com mais
frequncia do que outros, tero prioridade elevada para faz-los com mais facilidade.
No degradar o sistema: Assim, mais formas de escalonamento ocorrero fazendo com que o mximo de
processos receba a CPU, aplicando-se prioridades dinmicas e formando um ciclo que evita que eles entrem
em Starvation.
etc.
Mltiplas filas 197

Mltiplas Filas com Realimentao


Os processos no permanecem em uma mesma fila at o trmino do processamento, pois o SO faz um ajuste
dinmico (mecanismo adaptativo) para ajustar os processos em funo do comportamento do sistema. Os processos
no so previamente associados s filas, mas direcionados pelo sistema entre as diversas filas com base no seu
comportamento.

Parmetros:
Nmero de filas.
Algoritmo de escalonamento para cada fila.
Mtodo para mudar (promover ou rebaixar) o processo de fila.
Mtodo para determinar em que fila um processo entra.
Mtodo mais complexo:
Um exemplo (existem outras variaes).
Processos novos entram no fim da primeira fila.
Nas filas, os processos so escalonados segundo Round-robin.
O quantum varia de uma fila para outra (aumenta em direo s ltimas, quantum 1, 2 para a segunda, etc).
Os processos das primeiras filas tm maior prioridade (um processo no pode ser escolhido, a menos que, as
filas anteriores estejam vazias).
Um processo em execuo interrompido caso aparea um processo em uma das filas anteriores sua.
Sempre que um processo esgotar seu quantum, ele suspenso na fila da prxima classe de prioridade.
Se o processo liberar a CPU, sem preempo, sai da estrutura de filas.
Quando um processo volta estrutura, colocado em uma fila de prioridade mais alta do que estava antes de
sair.

Diviso dos Processos


Cada fila possui seu prprio algoritmo de escalonamento;
Os Processos so previamente divididos em grupos em funo do tipo de processamento realizado:
A cada grupo aplicado um mecanismo de escalonamento adequado.
Por exemplo, filas distintas podem ser utilizadas para processos em background ou foreground.A fila foreground
pode utilizar o escalonamento circular enquanto que background utiliza o FCFS;
Cada fila pode possuir prioridade absoluta sobre as filas de menor prioridade ou o tempo do processador pode ser
compartilhado entre elas. Por exemplo, a fila foreground pode receber 80% do tempo do processador enquanto que
background recebe 20%.
Mltiplas filas 198

Problemas
Starvation: Para evitar esse problema, o Sistema Operacional pode aplicar prioridades dinmicas. Neste caso, os
processos que no tiveram acesso CPU durante muito tempo, tm sua prioridade momentaneamente elevada. Em
sistemas interativos esse mesmo mecanismo tambm pode ser empregado, porque o usurio deve possuir uma
prioridade alta para poder trocar de programa quando desejar.
Inverso de Prioridade: Dua tarefas A e B de alta e baixa prioridades, precisam acessar um recurso R (um
determinado dispositivo de E/S, uma impressora por exemplo). Considerando que A inicia aps B adquirir o recurso
R, a tarefa de maior prioridade A obrigada a esperar B. Problemas surgem quando uma nova tarefa M, de mdia
prioridade e que no utiliza R, iniciada durante este intervalo. M a tarefa de maior prioridade no bloqueada,
portanto ser escalonada antes de B que continua utilizado o recurso e A continua aguardando pelo recurso. A tarefa
M ir executar, ento B poder executar - pelo menos ao ponto de liberar R - e ao final A executa. Neste cenrio uma
tarefa de mdia prioridade foi executada antes de uma de maior prioridade, demonstrando uma inverso de
prioridade.

Algoritmo next-fit
Next-fit um algoritmo utilizado para partio de disco rgido.

Processo
Algoritmo para partio dinmica que inicia a busca a partir da posio da ltima alocao at encontrar o primeiro
bloco, mais frequentemente so alocados blocos de tamanho grande.
Grandes blocos so particionados em blocos menores e existe a necessidade de compactao quando no houver
mais memria disponvel.
Otimizao da colnia de formigas 199

Otimizao da colnia de formigas


1. REDIRECIONAMENTO Colnia de formigas (otimizao)

Particionamento binrio de espao


Espao Binrio de Particionamento (Binary Space Partitioning) um mtodo para dividir recursivamente um
espao em pedaos convexos de hiperplanos. Esse tipo de subdiviso d luz a uma representao de cena a partir de
uma rvore de dados conhecida como rvore BSP (BSP tree).
Esta implementao foi inicialmente posposta para aumentar a eficincia da renderizao de grficos 3D. As
aplicaes grficas que trabalham com operaes com formas geomtricas se beneficiam desta implementao de
renderizao.

Resumo
Na computao grfica desejvel que uma cena seja desenhada tanto precisamente quanto rapidamente. Um dos
meios de se desenhar uma cena corretamente usando o algoritmo do pintor, que desenha a cena na ordem dos
objetos mais distantes at os mais prximos na viso da cmera. Este algoritmo tem uma limitao: muita
performance perdida desenhando objetos que esto atrs de outros, e caso um objeto coincida com a mesma
distncia da cmera de outro eles confundem o algoritmo.
Com ajuda de um Z-buffer e um espao reservado na memria, o desenho da cena pode ser acelerado, j que toda a
informao da distncia dos objetos est gravada no z-buffer. O grande problema que o z-buffer costuma exigir
muita memria para cenas com muitos objetos.
Por outro lado a rvore BSP corta os objetos em pedaos pr-calculados, eliminando a necessidade do z-buffer e da
ordenao dos objetos antes de desenhar a cena.
O efeito colateral das rvores BSP o tempo consumido no pr-clculo das cenas, o que o torna invivel no clculo
de objetos mveis que mudam constantemente de posio. Porm uma combinao de BSP e z-buffer consegue
superar essa limitao.
Devido a essa natureza pr-calculada e da geometria usada, as rvores BSP so mais eficientes e mais comuns em
cenas de ambientes fechados.

Referncias
FUCHS, Henry, KEDEM Zvi M., NAYLOR, Bruce F.. " On Visible Surface Generation by a Priori Tree Structures
[1]
" (PDF). Acessado em 21/07/2007.

Referncias
[1] http:/ / portal. acm. org/ citation. cfm?id=800250. 807481
Algoritmo de Peterson 200

Algoritmo de Peterson
O algoritmo de Peterson um algoritmo de programao concorrente para excluso mtua, que permite a dois ou
mais processos ou subprocessos compartilharem um recurso sem conflitos, utilizando apenas memria compartilhada
para a comunicao. Ele foi formulado por Gary L. Peterson em 1981.[1] Embora a formulao original de Peterson
funcionasse apenas com dois processos, o algoritmo pode ser estendido para mais processos.[2]

O algoritmo

//flag[2] booleana; e turn um inteiro


flag[0] = 0;
flag[1] = 0;
turn;
P0: flag[0] = 1; P1: flag[1] = 1;
turn = 1; turn = 0;
while (flag[1] == 1 && turn == 1) while (flag[0] == 1 && turn == 0)
{ {
// ocupado, espere // ocupado, espere
} }
// parte crtica // parte crtica
... ...
// fim da parte crtica // fim da parte crtica
flag[0] = 0; flag[1] = 0;

Notas
[1] G. L. Peterson: "Myths About the Mutual Exclusion Problem", Information Processing Letters 12(3) 1981, 115116
[2] Conforme discutido em Operating Systems Review, Janeiro de 1990 ("Proof of a Mutual Exclusion Algorithm", M Hofri).
Poda alfa-beta 201

Poda alfa-beta
Na cincia da computao, poda (em ingls: pruning) a remoo de partes de uma rvore de deciso ou de
neurnios de uma rede neural. Isso pode ocorrer porque no h significativa contribuio para a preciso ou
interpretabilidade da rvore, reduzindo-se a complexidade da rvore e aumentando-se a sua generalizao.

Poda alfa-beta
A poda alfa-beta (ou poda -) uma variao do algoritmo minimax que visa reduzir o nmero de ns que so
avaliados na rvore de busca. uma busca adversarista comumente utilizada na implementao de jogadores
automticos em jogos com dois jogadores (Jogo da Velha, Xadrez, Go, etc.). Ele pra completamente de avaliar um
movimento quando ele encontra, de maneira comprovada, um movimento cujo valor associado seja pior do que um
movimento previamente examinado. Sendo assim, os movimentos posteriores no necessitam ser avaliados.
A poda alfa beta no altera o resultado final da avaliao de uma sub-rvore e a sua vantagem est no fato de que, em
rvores de busca com um fator de ramificao muito grande, a utilizao de memria ser significativamente
reduzida.

Exemplo
O exemplo abaixo demonstra, de uma forma simples, o princpio matemtico presente no funcionamento da poda
-.

Note que, independente do valor de e o resultado da equao o mesmo.


Problema da vazo mxima 202

Problema da vazo mxima


O problema do fluxo mximo consiste em encontrar fluxo atravs de uma rede de fluxo que seja mximo O problema
do fluxo mximo pode ser visto como um caso especial de um problema de fluxo mais complexo. Ele o problema
fluxo de mutiplas-mercadorias com so uma so mercadoria, e tambm como o problema de fluxo de custo-minimo
com todos os fluxos zerados. O fluxo mximo esta relacionado ao corte em uma rede pelo Teorema do mnimo
corte-mximo fluxo.

Solues
Dado um grafo , onde cada aresta tem uma capacidade , nos queremos determinar o fluxo
mximo , sujeito a certas limitaes. Existem varias maneiras para solucionar este problema:
Mtodo Complexidade Descrio

Fora bruta Encontra os menor de todos os cortes que separa e .

Programao linear
Restries dadas pelas definies de uma fluxo legal. Otimizar .

Algoritmo de Ford-Fulkerson To logo seja aberto um caminho atravs da rede, envie o maior fluxo possvel atravs
dele.

Algoritmo de Edmonds-Karp Uma especializao do algoritmo de Ford-Fulkerson, busca caminhos com busca em
largura.

Algoritmo de Rearranja os nodos em vrios pesos tal que o um acrscimo mximo de fluxo corra de
remarcagem-para-frente para "por si proprio".

Referncia
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms,
Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0262032937. Chapter 26: Maximum Flow,
pp.643700.
Problema do par de pontos mais prximo 203

Problema do par de pontos mais prximo


O problema do par de pontos mais prximo consiste em, dado
um conjunto de n pontos num espao mtrico, encontrar os dois
pontos do conjunto que possuem a menor distncia um do outro. A
verso em duas dimenses, para pontos num plano,[1] estava entre
os primeiros problemas geomtricos que foram tratados na origem
do estudo de complexidade computacional de algoritmos
geomtricos.

Se forem computadas as distncias entre todos os pares de pontos


do conjunto, h n(n-1)/2 computaes antes de ser possvel decidir
inequivocamente qual o par que apresenta a menor distncia. Esse
algoritmo conhecido como fora bruta e tem complexidade de
tempo O(n2), ou seja, seu tempo de execuo proporcional ao
quadrado do nmero de pontos do conjunto considerado. Porm, Ilustrao do par de pontos mais prximo.
pesquisadores em geometria computacional descobriram que este
problema pode ser resolvido em tempo O(n log n) em um espao euclidiano ou espao Lp de dimenso d fixa.

No modelo computacional que assume que a funo cho computada em tempo constante, o problema pode ser
resolvido em tempo de O(n log log n).[2] Se for permitido o uso de escolhas aleatrias em conjunto com a funo
cho, o problema pode ser resolvido em tempo O(n).[3] []

Problema no plano
O problema no plano pode ser resolvido em tempo de O(n log n) usando diviso e conquista, nos seguintes passos[1]:
1. Ordenar os pontos de acordo com as coordenadas x;
2. Dividir o grupo de pontos em dois subgrupos de mesmo tamanho por uma linha vertical
3. Resolver o problema recursivamente para os dois grupos, resultando nas distncias mnimas nos lados esquerdos
e direitos, e respectivamente.
4. Encontrar a distncia mnima entre um par de pontos onde cada ponto est em um lado diferente da
linha vertical.
5. A resposta final o mnimo entre , , and .
Por sua vez, o quarto passo pode ser realizado em tempo linear, pois j sabemos que o par de pontos mais prximos
no podem ter distncia maior que . Portanto para cada ponto p do lado esquerdo da
linha vertical feita feita a comparao das distncias para pontos que esto do lado direito e dentro de um retngulo
de dimenses (dist, 2 * dist), ou seja, pontos que possuem coordenada x com uma distncia mxima dist para a
direita de p e coordenada y com distncia mxima dist para cima ou para baixo de p.
Considerando que o par de pontos mais prximos definem uma aresta na triangulao de Delaunay, e corresponde a
duas faces adjacentes no diagrama de Voronoi, o par de pontos mais prximos pode ser determinado em tempo linear
quando dado junto ao problema uma dessas duas estruturas. Computar a triangulao de Delaunay, assim como o
diagrama de Voronoi, leva tempo O(n log n). Porm para uma dimenso d maior que 2, esse tempo ir aumentar,
enquanto que o algoritmo com diviso e conquista pode ser generalizado mantendo tempo O(n log n) para qualquer
d.
Problema do par de pontos mais prximo 204

Referncias
[1] M. I. Shamos e D. Hoey. "Closest-point problems." Em Proc. 16th Annual IEEE Symposium on Foundations of Computer Science (FOCS), p.
151162, 1975
[2] S. Fortune e J.E. Hopcroft. "A note on Rabin's nearest-neighbor algorithm." Information Processing Letters, 8(1), p. 2023, 1979
[3] S. Khuller e Y. Matias. A simple randomized sieve algorithm for the closest-pair problem. Inf. Comput., 118(1):3437,1995

Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest e Clifford Stein. Introduction to Algorithms, Second
Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. P. 957961 of section 33.4: Finding the
closest pair of points.
Jon Kleinberg; va Tardos. Algorithm Design. [S.l.]:Addison Wesley, 2006.
UCSB Lecture Notes (http://www.cs.ucsb.edu/~suri/cs235/ClosestPair.pdf)
rosettacode.org (http://rosettacode.org/wiki/Closest-pair_problem) - Closest pair of points implemented in
multiple programming languages
Line sweep algorithm for the closest pair problem (http://www.topcoder.com/tc?module=Static&
d1=tutorials&d2=lineSweep)

Prosthaphaeresis
Prosthaphaeresis era um algoritmo usado no final do sculo XVI e incio do XVII para aproximar um produto
usando frmulas da trigonometria. 25 anos antes da inveno dos logaritmos, em 1614, esta era a nica forma
conhecida que podia ser largamente utilizada para aproximar o resultado de uma multiplicao rapidamente. Seu
nome vem do grego prosthesis e apharesis que significam "adio" e "subtrao" que so dois passos do processo.

Pseudocdigo
Pseudocdigo uma forma genrica de escrever um algoritmo, utilizando uma linguagem simples (nativa a quem o
escreve, de forma a ser entendida por qualquer pessoa) sem necessidade de conhecer a sintaxe de nenhuma
linguagem de programao. , como o nome indica, um pseudocdigo e, portanto, no pode ser executado num
sistema real (computador) de outra forma deixaria de ser pseudo.
Os livros sobre a cincia de computao utilizam frequentemente o pseudocdigo para ilustrar os seus exemplos, de
forma que todos os programadores possam entend-los (independentemente da linguagem que utilizem).
No caso da lngua portuguesa existam alguns interpretadores de pseudocdigo, nenhum tem a projeco das
linguagens Pascal ou BASIC, que no caso da lngua inglesa se assemelham bastante a um pseudo-cdigo.
Um programa para compilar um cdigo em portugol o VisuALG ou Portugol Viana que podem ser baixados de
qualquer site de busca como o Google.

Exemplo
Abaixo vemos o exemplo de um programa que faz a leitura de dez nmeros e calcula a mdia dos nmeros positivos:

VARIAVEIS
S,C,I,A,MD:Real;
INCIO
S 0;
C 0;
PARA I 1 AT 10 FAA
INCIO
Pseudocdigo 205

Escreva ('Digite um nmero');


LEIA (a);
SE a >=0 ENTO
INCIO
S S+a;
C C+1;
FIM;
FIM SE;
FIM;
FIM PARA;
MD S/C;
ESCREVER ('A mdia :', MD);
FIM.

Rsync
rsync um programa de computador, utilizado em sistemas Unix, para sincronizao de arquivos e diretrios
(pastas) entre duas localidades diferentes enquanto minimiza a transferncia de dados.

Algoritmo
Seu algoritmo (inventado pelo programador Andrew Tridgell) foi criado para transmisso eficiente de um arquivo
atravs de um link de comunicao quando um outro computador que recebe os dados j tem uma verso diferente
do mesmo arquivo.
Diferente de outras ferramentas disponveis para cpia de arquivos, o rsync quebra o arquivo de origem em vrios
pedaos e gera uma pequena assinatura de cada pedao. Ento, envia pela rede estas assinaturas e, fazendo o mesmo
do outro lado, descobre quais pedaos faltam no arquivo de destino para torn-lo igual ao de origem.

Licena
Rsync est em cdigo aberto sob os termos da GNU GPL Verso 2.

Ligaes externas
Stio oficial Rsync [1]

Referncias
[1] http:/ / samba. anu. edu. au/ rsync
SJF 206

SJF
O SJF (Shortest Job First ou Processo mais curto primeiro) um algoritmo de escalonamento que executa, dentre
processos igualmente importantes, o mais curto primeiro.
O escalonador SJF funciona a partir de um conceito bem simples: os processos menores tero prioridade, ou seja,
sero executados primeiro. Isso tem como resultado um tempo mdio mnimo de espera para cada conjunto de
processos a serem executados.
O clculo de cada tempo mdio feito a partir da prxima alocao de CPU, ou seja, o processo que utilizar a CPU
por menos tempo ser executado primeiro. Existem dois esquemas j conhecidos desse tipo de escalonamento:
No-Preemptivo
Uma vez a CPU atribuda a um processo, este no pode ser interrompido at completar a execuo do
processo.
Preemptivo
Se um novo processo chega ao estado "pronto" com um tempo de alocao menor que o tempo restante do
processo em execuo, ento h preempo (interrupo). Este esquema conhecido por
Shortest-Remaining-Time-First (SRTF).
Vantagens
O emprego deste algoritmo vantajoso devido sua simplicidade e tambm porque maximiza o rendimento
do processo (em termos de nmero de processos de execuo para concluso em um determinado perodo de
tempo). Ele tambm minimiza a quantidade mdia de tempo que cada processo tem que esperar at que a sua
execuo esteja completa. No entanto, ele tem o potencial de starvation para processos que requerem um longo
perodo de tempo, se os processos curtos so continuamente adicionados.
Sistema de reduo 207

Sistema de reduo
Em matemtica um sistema de reduo um sistema onde termos podem ser reescritos usando uma lista finita, ou
infinita, de regras de reescrita
Exemplos de sistemas de reduo incluem sistemas de reescrita de cadeias de caractere, sistemas de reescrita de
termos, clculo lambda sob converso lambda e sistemas de reduo combinatria.
Quando nenhuma regra de reduo pode ser aplicada para uma determinada expresso, dito que esta est na Forma
Normal.

Viso geral
Um sistema de liguagem formal que pode ser transformado de acordo com um conjunto finito de regras de reescrita
chamado de sistema de reduo. Enquanto sistemas de reduo tambm so conhecidos como sistemas de reescrita
de strings ou sistema de reescrita de termos, o termo sistemas de reduo mais geral.
Clculo lambda, como j foi dito, um exemplo de sistema de reduo com regras converses lambda, constituindo
assim as regras de reescrita.

Exemplo
Se nenhuma das regras de reescrita de um sistema de reduo aplicada a Expresso E, ento E est em forma
normal para um sistema de reduo.
Um par de expresses (x,y) chamado juntvel (joinable), se ambos, x e y, podem ser reduzidos para a mesma
expresso em zero ou mais passos de reduo (exemplo, a aplicao de regras de reduo).
Se x reduzido para y em um passo, isso indicado por . Se Se x reduzido para y em zaro ou mais passos,
isso indicado por .

Sistema de Reduo Abstrato


Um sistema de reduo abstrato (SRA) uma modelagem matemtica que permite o estudo de propriedades sobre
sistema de reescrita de termos sem a necessidade de nos preocuparmos com a natureza dos objetos que so
reescritos.
Um sistema de reduo abstrato (SRA) um par (A, ), em que a reduo uma relao binria sobre o
conjunto A, isto , em A x A.

Reduo
Se temos (a,b) a para a e b A, ento escrevemos a b e chamamos b de uma reduo de a, ou a uma
expanso de b.
Sistema de reduo 208

Cadeia de reduo ou seqncia de reduo


Seja o SRA (A, ), uma cadeia de reduo uma cadeia finita ou infinita da seguintes forma:
... .

n-Reduo
Dizemos que uma n-reduo de se existir uma cadeia .

Notaes
Para o SRA (a, ) temos as seguintes notaes para :
Fecho reflexivo: .
Fecho transitivo: .
Fecho simtrico: .
Fecho transitivo e reflexivo: .
Fecho transitivo e simtrico: .
Fecho transitivo, simtrico e reflexivo: .
Relao inversa: .
Para o SRA (A, ) e x, y e z A dizemos que:
y um sucessor direto de x se e somente se x y;
y um sucessor de x se e somente se x y;
x e y so ligveis se e somente se existe um z tal que x z y.

Referncias
Mathword.com em http://mathworld.wolfram.com/ReductionSystem.html
Solitaire cipher 209

Solitaire cipher
O algoritmo criptogrfico conhecido como Solitaire foi criado por Bruce Schneier "para permitir que agentes de
campo se comuniquem de forma segura sem precisar de eletrnicos ou ter que carregar objetos incriminadores",[1] a
pedido de Neal Stephenson para usar no enredo do seu livro Cryptonomicon. O algoritmo foi desenvolvido para ser
um sistema criptogrfico manual calculado com a utilizao de um baralho normal. No livro, esse algoritmo
originalmente chamado Pontifex para ocultar o fato que envolve cartas de baralho.

References

Ligaes externas
Schneier's Solitaire Description (http://www.schneier.com/solitaire.html)

Algoritmo de sudoku
O algoritmo de sudoku consiste em verificar atravs de lgica matemtica, as possibilidade para resolver o
problema apresentado.
Existem diversos algoritmos e regras para cada implementao, sendo bastante utilizados para tcnicas de
aperfeioamento da lgica, em cursos e faculdades ligadas a rea de exatas.
Basicamente, necessrio observar que a regra do jogo s permite nmeros distintos de 1 at 9 em zonas e linhas
(ambas composta por nove casas), o jogo contm uma tabela com nove linhas e nove colunas.[1]

Tcnicas

Matemtica
O problema geral de solucionar enigmas Sudoku em tabuleiros de blocos conhecido como
[2]
NP-completo. Isto d algumas indicaes de porque o Sudoku difcil de resolver. Contudo, em tabuleiros de
tamanhos finitos o problema finito e pode ser solucionado atravs de um autmato finito probabilstico que
conhece toda a rvore do jogo. Solucionar enigmas Sudoku (assim como qualquer outro problema NP-difcil) pode
ser expresso como um problema de preenchimento grfico de cores. O objetivo do enigma em sua forma padro
construir grfico apropriado de nove coloraes, informando parcialmente as nove coloraes. O grfico em questo
tem 81 vrtices, uma interpolao em cada clula da grade. Os vrtices podem ser rotulados com os pares ordenados
, onde x e y so nmeros inteiros entre 1 e 9. Neste caso, dois vrtices distintos rotulados por e
so conectados por uma borda se e apenas se
.
O enigma ento completado designando-se um nmero inteiro entre 1 e 9 para cada interpolao, de tal maneira
que os vrtices que so unidos atravs de uma borda no tenham nenhum nmero inteiro igual designado neles. Uma
grade de soluo vlida para o Sudoku tambm um quadrado latino. H significativamente menos solues de
grades de Sudoku vlidas do que os quadrados latinos, porque o Sudoku impe restries de regio adicionais.
Apesar disso, o nmero de soluo de Sudoku para uma grade padro de 99 foram calculados em 2005 por Bertram
Felgenhauer como sendo 6.670.903.752.021.072.936.960.[3] Este nmero igual a
, o ltimo fator o qual um nmero primo. O resultado derivado atravs da
lgica e computao fora bruta. A derivao deste resultado foi simplificada consideravelmente por anlises
fornecidas por Frazer Jarvis e o nmero foi confirmado independentemente por Ed Russell. Russel e Jarvis tambm
Algoritmo de sudoku 210

demonstraram de que quando as simetrias so levadas em conta, havia 5.472.730.538 solues.[4] O nmero de
solues vlidas para a variao do Sudoku de uma grade 1616 desconhecido.

Tentativa e erro
Essa tcnica, consistem em criar uma classe de verificao de inconsistncias, chamando-a, a cada nmero
preenchido, se estiver incorreto, reinicia-se com um nmero diferente, at se obter o nmero perfeito, tcnica
bastante trabalhosa, j que para o correto preenchimento, necessrio cerca de um trilho de tentativas. Por exemplo,

Resoluo de um sudoku em branco


Embora a resoluo de tabelas de sudoku parcialmente preenchidas
frequentemente possa ser bastante difcil de resolver, as tabelas em
branco podem ser resolvidas rapidamente. Talvez a forma mais fcil de
fazer isto seja produzir a soluo raiz, que pode ser obtida por meio do
seguinte algoritmo bem simples, cujo tempo de execuo
polinomial:[5]

Para uma grade padro de tamanho n x n o algoritmo tem a seguinte


forma (em java):

Exemplo de sudoku ilustrando as posiveis


combinaes (em azul claro).

final int n = 3;
final int[][] field = new int[n*n][n*n];
for (int i = 0; i < n*n; i++)
for (int j = 0; j < n*n; j++)
field[i][j] = (i*n + i/n + j) % (n*n) + 1;

O procedimento acima produz o seguinte sudoku 9x9:

+-----------------------+
| 1 2 3 | 4 5 6 | 7 8 9 |
| 4 5 6 | 7 8 9 | 1 2 3 |
| 7 8 9 | 1 2 3 | 4 5 6 |
|-------+-------+-------|
| 2 3 4 | 5 6 7 | 8 9 1 |
| 5 6 7 | 8 9 1 | 2 3 4 |
| 8 9 1 | 2 3 4 | 5 6 7 |
|-------+-------+-------|
| 3 4 5 | 6 7 8 | 9 1 2 |
| 6 7 8 | 9 1 2 | 3 4 5 |
| 9 1 2 | 3 4 5 | 6 7 8 |
+-----------------------+

[1] http:/ / diuf. unifr. ch/ people/ juillera/ Sudoku/ Sudoku. html Sudoku explorado por Nicolas Juillerat (Conhecido poplarmente por jogos de
lgica em geral)
[2] http:/ / www. phil. uu. nl/ ~oostrom/ cki20/ 02-03/ japansepuzzles/ ASP. pdf
Algoritmo de sudoku 211

[3] http:/ / www. afjarvis. staff. shef. ac. uk/ sudoku/


[4] http:/ / www. afjarvis. staff. shef. ac. uk/ sudoku/ sudgroup. html
[5] Lewis, R (2007) Metaheuristics Can Solve Sudoku Puzzles Journal of Heuristics, vol. 13 (4), pp 387-401.

Ligaes externas
Sudoku - Rosetta Code (http://rosettacode.org/wiki/Sudoku) - implementaes em diversas linguagens de
programao
http://www.research.att.com/~gsf/man/man1/sudoku.html sudoku by gsf (em ingls)
AMS.org (em [[Lngua inglesa|ingls (http://www.ams.org/notices/200904/rtx090400460p.pdf)])]
Download de um assitente para [[Excel (http://home.comcast.net/~raagnew/site/?/page/Downloads)].(em
ingls)]
Resolvendo com [[PL/pgSQL (http://www.microshell.com/database/postgresql/
solving-sudoku-using-postgresql-plpgsql/)], da Microshell (em ingls)]
Sudoku,Wordoku (http://alfunstuff.com/pr/)

Tcnicas de projeto de algoritmos


D se o nome de 'Tcnicas de Projeto de Algoritmos a um conjunto de tcnicas de projeto de algoritmos
compreendem os mtodos de codificao de algoritmos de forma salientar sua complexidade, levando em conta a
forma pela qual determinado algoritmo chega a soluo desejada.
So tcnicas de projeto de algoritmos a Fora bruta e a Diviso e conquista.

Teste de primalidade
Um teste de primalidade um algoritmo para determinar se um dado nmero inteiro primo. Este tipo de teste
usado em reas da matemtica como a criptografia. Diferentemente da fatorao de inteiros, os testes de primalidade
geralmente no fornecem os fatores primos, indicando apenas se o nmero fornecido ou no primo. O problema da
fatorao computacionalmente difcil, enquanto que os testes de primalidade so comparativamente mais fceis (o
tempo de execuo polinomial no tamanho dos dados de entrada). Alguns testes de primalidade provam que um
nmero primo, enquanto que outros, como o teste de Miller-Rabin provam que um nmero composto.
Um dos primeiros testes de primalidade o crivo de Eratstenes.
Token Bucket 212

Token Bucket
Token Bucket um algoritmo usado para controlar a transmisso de pacotes de dados em uma rede de
computadores.

Componentes
O Token Bucket composto por trs componentes:
um tamanho de rajada de bits (ou burst size), que especifica o quanto pode ser enviado num determinado intervalo
de tempo;
uma taxa mdia em bps (ou mean rate ou ainda committed information rate), que especifica a quantidade de
dados, em mdia, que pode ser enviada por unidade de tempo; e
um intervalo de tempo (Tc), que caracteriza o tempo por rajada.

Funcionamento
Podemos considerar um Token Bucket como um balde furado em que a fila de pacotes pode ser considerada como o
volume do balde. Independente de como cheguem os dados na fila, a sada sempre uniforme em vazo e latncia.
Se a capacidade da fila for ultrapassada (volume de pacotes for maior que o volume do balde) ento os pacotes sero
descartados, o balde transborda os pacotes em excesso.

Worst-fit
Worst-fit um algoritmo utilizado na partio de disco rgido.

Funo
O algoritmo worst-fit aloca o programa na pior partio, ou seja, aquela que deixa o maior espao livre.
Est tcnica, apesar de aproveitar primeiro as parties maiores, acaba deixando espaos livres grandes o suficiente
para que outros programas utilizem da memria, diminuindo ou retardando a fragmentao.
Fontes e Editores da Pgina 213

Fontes e Editores da Pgina


Estrutura de dados Fonte: http://pt.wikipedia.org/w/index.php?oldid=35317284 Contribuidores: Acscosta, Agronopolos, Amenendez, Belanidia, Bons, Carnevalli, Cesarsouza, Ddi's,
Fabiano Tatsch, Firmo, Get It, Herbae, Holyventrue, Jic, Leonardo.stabile, LeonardoG, Lijealso, Luiza Teles, Lus Felipe Braga, Marcelo0602, Marivb, MisterSanderson, Nuno Tavares,
Profvalente, Slade, Urbanalegio, Whooligan, Yone Fernandes, 148 edies annimas

Problema do caixeiro viajante Fonte: http://pt.wikipedia.org/w/index.php?oldid=34235965 Contribuidores: Alchimista, Allansuperze, Ariel C.M.K., Beria, CelsoS, Clara C., Ccero, Dreispt,
Erclsb, JoaoMiranda, Jos AF, Juntas, Laura Nielsen, Leonardo.stabile, Mamc, Manuel Anastcio, Maxtremus, Mschlindwein, Muriel Gottrop, Ricardo Ferreira de Oliveira, Ronaldremo, Rui
Malheiro, Salgueiro, Teles, Vapmachado, 44 edies annimas

Busca em largura Fonte: http://pt.wikipedia.org/w/index.php?oldid=34520693 Contribuidores: Aexpedito, Ariel C.M.K., Ccero, Diego Queiroz, EduM, FelipeVargasRigo, Fernando S.
Aldado, Hugo Bas, LeonardoG, Maxtremus, Nuno Tavares, O CoRVo, Olavom, Renato Rebouas, Ricardo Ferreira de Oliveira, Salgueiro, Vini 175, 20 edies annimas

rvore B+ Fonte: http://pt.wikipedia.org/w/index.php?oldid=35035450 Contribuidores: Aexpedito, Barao78, Colaborador Z, CommonsDelinker, Leonardo.stabile, Lus Felipe Braga,
Maxtremus, Ricardo Ferreira de Oliveira, Vitor Mazuco, 9 edies annimas

rvore (estrutura de dados) Fonte: http://pt.wikipedia.org/w/index.php?oldid=34856846 Contribuidores: Alexg, Dpc01, Fabiogramos, Firmo, Gunnex, Lcharallo, LeonardoG, Luiz Jr, Lus
Felipe Braga, Maxtremus, Nabla, Niteshadow, Nuno Tavares, Phillipe Israel, Pietro Roveri, Ruy Pugliesi, SaintCahier, Wbrito, 23 edies annimas

Anexo:Lista de algoritmos Fonte: http://pt.wikipedia.org/w/index.php?oldid=35298469 Contribuidores: AcidPoison, Adailton, Agil, Andrezc, Belanidia, Bittencourt, Carnevalli, Chentz,
Danielcasca, Danielcc10, Dvulture, Eamaral, EduM, Girino, JMGM, Jorge, JotaCartas, Kaktus Kid, Lcavique, Leonardo.stabile, LeonardoG, Lijealso, Manuel Anastcio, Marivb, Osias,
Rafael.afonso, Rui Malheiro, Rmulo Penido, Salgueiro, Sobreira, Thiago Serra, Thiagoharry, Timor, 32 edies annimas

rvore de busca binria Fonte: http://pt.wikipedia.org/w/index.php?oldid=22343788 Contribuidores: Alchimista, Bruno Ishiai, Dobau, EduM, Fnds, Fredmaranhao, Janotijr, Leandro Drudo,
Leonardo.stabile, LeonardoG, Lgrave, Lijealso, Luiz Jr, Manuel Anastcio, Mca.leite, Mschlindwein, Mrio e Drio, Nosbig, Rei-artur, Reynaldo, Ricvelozo, Rdi, Sag rodrigo, Spoladore,
Teaga.txt, Toalha, Vini 175, 28 edies annimas

Algoritmo de busca Fonte: http://pt.wikipedia.org/w/index.php?oldid=35346695 Contribuidores: Giro720, Hugo Dionizio Santos, Ramzysamman, Salgueiro, 5 edies annimas

rvore binria Fonte: http://pt.wikipedia.org/w/index.php?oldid=34931964 Contribuidores: Diegorubert, EuTuga, Firmo, Geniltodallo, Janotijr, Luis Dantas, Luiz Jr, Lus Felipe Braga,
Matheus-sma, Maxtremus, Ofernandes, Pablodiego15, ThiagoRuiz, Tschulz, 116 edies annimas

Algoritmo Fonte: http://pt.wikipedia.org/w/index.php?oldid=35372710 Contribuidores: !Silent, 200-157-17-75.intelignet.com.br, 200.248.157.xxx, Alchimista, Alscardoso, AndreHahn,
Andrezc, Belanidia, Betosneto, Caameri, Cabelo, Campani, CasperBraske, Ceklock, ChristianH, Daimore, Dbastro, Eamaral, Eduardofeld, Ehabkost, Enderson, FML, Fabsouza1, Fasmgl,
Faustino.F, Firmo, Francisco Leandro, GOE, Gandbranco, Gawiga, Gdamasceno, Giro720, Gjmveloso, Gunnex, HVL, Helder.wiki, JSSX, Jcmo, Joao, JoaoMiranda, Jorge, Leonardo.stabile,
LeonardoG, LeonardoRob0t, Lourenj, Lpcnew, Lus Felipe Braga, Manuel Anastcio, Marcelo Reis, Marcelolima86, Marcos Elias de Oliveira Jnior, Marianeclaro, Marivb, Mateus Hidalgo,
Maurcio I, Mca.leite, Mschlindwein, Muriel Gottrop, Mrio Henrique, Nuno Tavares, OS2Warp, Osias, PauloColacino, PauloEduardo, Petrus Yuri, Pietro Roveri, Probatista, Profvalente,
Rei-artur, Reynaldo, Robsramos, Rochilson, Salamat, Salgueiro, Shiryu500, Sr X, SubX, Tetri, Thiago90ap, Thiagoharry, Tijolo Eltrico, Tribal, Tumnus, Villarinho, Viniciusmc, Vitor Mazuco,
ZiroCool, 224 edies annimas

Crivo de Eratstenes Fonte: http://pt.wikipedia.org/w/index.php?oldid=35360577 Contribuidores: Albmont, Alchimista, Capmo, ChristianH, Ccero, Darwinius, Fernandosignorelli, Fnds,
HVL, Helder.wiki, Hit0442, Kkjunior, Lenfers, Marcobiscaro2112, Matheus-sma, Moretti, Onjacktallcuca, Orium, Pietro Roveri, Salgueiro, Viniciusmc, Vitor Mazuco, W.A. Ribeiro Jr., 63
edies annimas

Algoritmo de Dijkstra Fonte: http://pt.wikipedia.org/w/index.php?oldid=34440939 Contribuidores: Adailton, Attom, Bortolozzi, Chicocvenancio, CommonsDelinker, Danielcc10, Desnes,
Diego UFCG, FelipeVargasRigo, Gfonsecabr, Gruberdiego, JotaCartas, Juntas, Leonardo.stabile, Lijealso, Manuel Anastcio, Mecanismo, Osias, Pedro Ivan de Albuquerque Lima, Ricardo
Ferreira de Oliveira, Rui Malheiro, Suisui, Xico.nunes, 69 edies annimas

Algoritmo guloso Fonte: http://pt.wikipedia.org/w/index.php?oldid=35228468 Contribuidores: Hallel, Leomar.Costa, Leonardo.stabile, Lusitana, Osias, Salgueiro, 9 edies annimas

Busca em profundidade Fonte: http://pt.wikipedia.org/w/index.php?oldid=34520840 Contribuidores: Bjmedeiros, BrunoSupremo, Ccero, FSogumo, FelipeVargasRigo, Fernando S. Aldado,
Hermgenes Teixeira Pinto Filho, Leonardo.stabile, Maxtremus, Nuno Tavares, Olavom, 17 edies annimas

Pesquisa binria Fonte: http://pt.wikipedia.org/w/index.php?oldid=35346393 Contribuidores: Aexpedito, Agil, Alvaromenezes, Anderson90, Andrevruas, Arrr2, Brunosmm,
CommonsDelinker, Cralize, Diegotremper, EduM, Eng.joseandro, Epinheiro, FML, Fulviusbsas, GOE, Giro720, Gkhan, Jonas AGX, Kaze Senshi, Lord Mota, Marivb, Nuno Tavares,
OS2Warp, Ozymandias, Rafael.afonso, Ricardo Ferreira de Oliveira, Steinlh, Thiagoharry, 103 edies annimas

rvore AVL Fonte: http://pt.wikipedia.org/w/index.php?oldid=34878770 Contribuidores: !Silent, ASkNo, Alexg, Clarice Reis, David71rj, EduM, Elloabguedes, FSogumo, Firmo, Jacksonp2,
Lcharallo, Leonardo.stabile, LeonardoG, Luiz Jr, Maurcio I, Maxtremus, Mrio e Drio, Wbrito, Wesleyro10, 57 edies annimas

Problema do caminho mnimo Fonte: http://pt.wikipedia.org/w/index.php?oldid=34500558 Contribuidores: Ccero, Dermeister, Loge, Lusitana, Nuno Tavares, Salgueiro, 5 edies annimas

rvore B Fonte: http://pt.wikipedia.org/w/index.php?oldid=34879883 Contribuidores: Aexpedito, ArlindoPereira, Bisbis, DerekStavis, Diogo alves 1747, Eamaral, Eduardoferreira, Feitodigital,
Gfonsecabr, Helder.wiki, Kaktus Kid, Lechatjaune, LeonardoG, Lordcaio, Luiz Jr, Lus Felipe Braga, Marcos limao, Maxtremus, Purodha, Santana-freitas, Viniciusmc, Wbrito, 77 edies
annimas

Programao dinmica Fonte: http://pt.wikipedia.org/w/index.php?oldid=34501149 Contribuidores: 555, Gean, Leonardo.stabile, OS2Warp, Rvencio, Whooligan, 23 edies annimas

Grafo Fonte: http://pt.wikipedia.org/w/index.php?oldid=34486206 Contribuidores: Colaborador Z, Ccero, Der kenner, FSogumo, Faustino.F, FelipeVargasRigo, Hallel, Humbertobrandao,
Israelrocha, JotaCartas, Lechatjaune, Leonardo.stabile, LeonardoG, Luiz Jr, Maxtremus, Michelmfb, Nuno Tavares, Rcaetano, Ricardo Ferreira de Oliveira, Rmulo Penido, Salgueiro, Stegop,
TradutoresJEDI, Villarinho, 34 edies annimas

Teoria dos grafos Fonte: http://pt.wikipedia.org/w/index.php?oldid=34399998 Contribuidores: 200.249.56.xxx, 2A02:8109:8140:11:E1B4:C844:FFBC:7111, Al Lemos, AndreHahn, Bons,
BrunoSupremo, Carbol, Ccero, Daniel Dias Branco Arthaud, Diego UFCG, Dotti, E2m, Faustino.F, Firer, GOE, Hallel, Helder.wiki, Israelrocha, JSSX, JoaoMiranda, Jonex, Jorge, Lechatjaune,
Leonardo.stabile, LeonardoG, LeonardoRob0t, Lusitana, Lus Felipe Braga, Manuel Anastcio, Maxtremus, Mrsouza, Muriel Gottrop, Nuno Tavares, OS2Warp, Opaulo, Pdellani, Polyethylen,
Quiumen, Rei-artur, Ricardo Ferreira de Oliveira, Rickhard 22, Rlopes, Roxul84, Ruy Pugliesi, Rmulo Penido, SHASTA136013.ig.com.br, Salgueiro, Sobao, Stego, Thiago Serra,
Thiagoprocaci, Viniciusmc, Webkid, Yanguas, 97 edies annimas

Lista ligada Fonte: http://pt.wikipedia.org/w/index.php?oldid=35503338 Contribuidores: !Silent, BrunoAssis, Cezar.almeidajr, ChristianH, Ciromonteiro, Colaborador Z, Darwinius,
Ericosperrella, Felipealexandref, JotaCartas, LeonardoG, Less, Luckas Blade, Mschlindwein, Nuno Tavares, OS2Warp, Renatomcr, Veneruchi, Vinnysoares, Zehntor, 49 edies annimas

Complexidade computacional Fonte: http://pt.wikipedia.org/w/index.php?oldid=34934465 Contribuidores: !Silent, Bons, Brunonar, Clecio, Dilsonlira, Elloabguedes, Helder Ribeiro,
Humbertobrandao, LeonardoG, Mschlindwein, PedR, Profvalente, Robertopinho, Salgueiro, 13 edies annimas

Pascal (linguagem de programao) Fonte: http://pt.wikipedia.org/w/index.php?oldid=35470286 Contribuidores: !Silent, Agil, Andr Koehne, Belanidia, Bitolado, Cacatdias, Carlos Rosa PT,
Carlosnatal, CasperBraske, Circular, Dancunha98, E2m, Eclesiastes, Edu Niccio, Eduardo, Eduardoferreira, Enderson, Flaviocruz1, Francisco Leandro, Furadrae, Gean, Get It, Gibanauts,
Gladstone, Guilherme Paula, Higorrg, IcaroBragana, Indech, JSSX, Jorge Morais, Joo Carvalho, Kascyo, Lameiro, Leonardo.stabile, LeonardoG, Leuadeque, Lflrocha, Lijealso, LordTuga, Lus
Felipe Braga, Marcric, Mariolui, Mautf, Menezes1992, NH, Nunof, OS2Warp, Pipas1234, RafaAzevedo, Rafael.afonso, Rafaelrosa, Ramosinfo, Ricardo Ferreira de Oliveira, Ricvelozo, Roberto
Cruz, Rsjuliao, Rdi, Sekelsenmat, Shadlan, Stegop, Stuckkey, ThiagoRuiz, Tilgon, Tumnus, Valdirsjr, Vanthorn, Vini 175, VonNaturAustreVe, Waldir, Waltercruz, Xexeo, 199 edies
annimas

Algoritmo de ordenao Fonte: http://pt.wikipedia.org/w/index.php?oldid=34491516 Contribuidores: Andrevruas, Carnevalli, EduM, Hgfernan, Joo Carvalho, Leonardo.stabile, LeonardoG,
Marivb, Ndnaum, OS2Warp, Rafael.afonso, Rcaetano, Ricardo Ferreira de Oliveira, Santana-freitas, 27 edies annimas
Fontes e Editores da Pgina 214

Algoritmo gentico Fonte: http://pt.wikipedia.org/w/index.php?oldid=35143460 Contribuidores: Alexanderps, Andretaff, Bons, Dpc01, Girino, Hgorni, Lechatjaune, Leonardo.stabile, Luabio,
Lpton, Michelmfb, Mike.lifeguard, PatrciaR, Pietro Roveri, Ricardo Ferreira de Oliveira, Rmulo Penido, Tarantulae, Titofhr, Viniciusmc, Waltercruz, 33 edies annimas

Decomposio de Dantzig-Wolfe Fonte: http://pt.wikipedia.org/w/index.php?oldid=35095335 Contribuidores: Elisangela Martins, Gunnex

Diviso e conquista Fonte: http://pt.wikipedia.org/w/index.php?oldid=34905344 Contribuidores: 555, FSogumo, Firmo, Hgfernan, Leonardo.stabile, 5 edies annimas

Minimax Fonte: http://pt.wikipedia.org/w/index.php?oldid=35363636 Contribuidores: Diego Queiroz, Hunyadym, Leonardo.stabile, 5 edies annimas

Mtodo do gradiente conjugado Fonte: http://pt.wikipedia.org/w/index.php?oldid=35306481 Contribuidores: Helder.wiki

Algoritmo simplex Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646776 Contribuidores: Albmont, Alquimista Digital, Bgsouza, Eduardofeld, Giro720, Kurumin.pb, Leonardo.stabile,
Salgueiro, Tschis, 9 edies annimas

Simulated annealing Fonte: http://pt.wikipedia.org/w/index.php?oldid=34703396 Contribuidores: 333, Alexg, Camponez, Davidandrade, JotaCartas, Leonardo.stabile, Pedro.haruo, Thom, 11
edies annimas

Algoritmo busca-ciclos de Floyd Fonte: http://pt.wikipedia.org/w/index.php?oldid=35248841 Contribuidores: Alessandro70, Helder.wiki, Hermgenes Teixeira Pinto Filho, Porantim,
Salgueiro, Yanguas, 6 edies annimas

Algoritmo Chaff Fonte: http://pt.wikipedia.org/w/index.php?oldid=31984985 Contribuidores: Celopinho, Kaktus Kid, Leonardo.stabile, Rauljcs, Reynaldo, Salgueiro, 3 edies annimas

Visualg Fonte: http://pt.wikipedia.org/w/index.php?oldid=29459219 Contribuidores: Acscosta, Adolfont, CommonsDelinker, Juanpaul, Onjacktallcuca, Profvalente, Reporter, Socegado, Tribal,
10 edies annimas

Algoritmo Doomsday Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646645 Contribuidores: Ariel C.M.K., Beraldo27, Davemustaine, Helder.wiki, Raupi, Rpmcruz, Tiago abiramia,
Tonchizerodos, 5 edies annimas

Algoritmo DPLL Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646641 Contribuidores: Celopinho, Gunnex, Ivsmjunior, Rauljcs, Salgueiro, Teixant, 2 edies annimas

Algoritmo Earley Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646648 Contribuidores: Cafu05, Cesarlm11, FSogumo, Fabiano Tatsch, Justin000, Mschlindwein, Njsg, Richard Melo da
Silva, 2 edies annimas

Algoritmo Needleman-Wunsch Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646652 Contribuidores: Eamaral, Helder.wiki, Ricardo Ferreira de Oliveira, Robertogilnei, Rvencio, Vini
175

Algoritmo RANDU Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646654 Contribuidores: Burmeister, Categorizador, Thiagoharry, 5 edies annimas

Algoritmo Yarrow Fonte: http://pt.wikipedia.org/w/index.php?oldid=34234412 Contribuidores: Bruno Ishiai, Helder.wiki, Jos AF, Lus Felipe Braga, 1 edies annimas

Algoritmo astronmico Fonte: http://pt.wikipedia.org/w/index.php?oldid=34520912 Contribuidores: Berganus, Blamed, Lijealso

Algoritmo das economias Fonte: http://pt.wikipedia.org/w/index.php?oldid=20460689 Contribuidores: Andrezc, Berganus, Camponez, ChristianH, Humbertobrandao, Leonardo.stabile,
Salgueiro, Santana-freitas

Algoritmo de Boor Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646660 Contribuidores: Gdst, Quiumen, Salgueiro, 2 edies annimas

Algoritmo de Strassen Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646727 Contribuidores: FSogumo, Felipe.barreta, Helder.wiki, Jack Bauer00, Mateus RM, MwR.Ariete, Mrio
Henrique, 7 edies annimas

Algoritmo de Wagner-Whitin Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646732 Contribuidores: Constana S, Gunnex, Herafonso, Vapmachado, 2 edies annimas

Algoritmo de chave simtrica Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646740 Contribuidores: Avzuquete, Beria, Bfreis, Castelobranco, Dbastro, Defreitas, Faunas, Jorge Luiz
Santos Farias, Nogets, Nuno Tavares, Plant, Salgueiro, Samuelcampos, Vanthorn, Yanguas, 22 edies annimas

Algoritmo de multiplicao de Booth Fonte: http://pt.wikipedia.org/w/index.php?oldid=35257343 Contribuidores: Alexg, Arges, Carlos Maurcio, Mschlindwein, Nathalia.sautchuk, Rautopia,
Salgueiro, 6 edies annimas

Algoritmo de pesquisa Fonte: http://pt.wikipedia.org/w/index.php?oldid=26974181 Contribuidores: Mschlindwein, Zdtrlik, 1 edies annimas

Algoritmo do Avestruz Fonte: http://pt.wikipedia.org/w/index.php?oldid=22104368 Contribuidores: Agiesbrecht, Faustino.F, OffsBlink, Ricardo Ferreira de Oliveira

Algoritmo do Banqueiro Fonte: http://pt.wikipedia.org/w/index.php?oldid=22104381 Contribuidores: Faustino.F, Ricardo Ferreira de Oliveira

Algoritmo do Castor Fonte: http://pt.wikipedia.org/w/index.php?oldid=22104389 Contribuidores: Faustino.F, Pedro Henrique Oliveira dos santos, Ricardo Ferreira de Oliveira, 2 edies
annimas

Algoritmo embrulho para presente Fonte: http://pt.wikipedia.org/w/index.php?oldid=34456479 Contribuidores: Ilustrador, Jorge, Osias, Rui Silva, Salgueiro, 2 edies annimas

Algoritmo para extrao da raiz quadrada Fonte: http://pt.wikipedia.org/w/index.php?oldid=26177279 Contribuidores: Adailton, Albmont, Alchimista, Alexg, Amats, Amorimcarlos, Bisbis,
Bons, ChristianH, Colaborador Z, Delemon, Diego UFCG, Doshell, EuTuga, FSogumo, Firer, Fulviusbsas, GOE2, GRS73, Gean, Girino, Gui Pitta, Guilhermebellia, HVL, Helder.wiki,
IamPortuguese, JCMP, JMGM, Jbribeiro1, Jcb, Jllompi, Joseolgon, Lameiro, Lauroaranha, Lemlam, Leo Wyatt 6605, LeonardoRob0t, Leslie, Lijealso, Lus Felipe Braga, MRFraga, Manuel
Anastcio, Marceif, MarinaSchulz, Matheus-sma, Mobyduck, Mschlindwein, Mrio Henrique, OS2Warp, Olctikjk 7319, Onjacktallcuca, Ovdio, PatrciaR, Petersonaraujo, Porantim,
Prima.philosophia, Professor sabe, RafaAzevedo, Rafael R. Procopio, Ruy Pugliesi, Salgueiro, Santista1982, ShinigamiWC, Shocahtoa, Srgio Noriaki Sato, Tarcnux, Theus PR, Thiago69,
Thrasherbermensch, Ts42, Vanthorn, Vini 175, Viniciusmc, Vitor Mazuco, rico Jnior Wouters, 214 edies annimas

Algoritmo probabilstico Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646774 Contribuidores: 555, Attom, Leonardo.stabile, Lijealso, NiginiOliveira, Pilha, Ts42, 18 edies annimas

Algortmica Fonte: http://pt.wikipedia.org/w/index.php?oldid=3773823 Contribuidores: Indech, Mschlindwein, Salgueiro, 1 edies annimas

Amostragem de Gibbs Fonte: http://pt.wikipedia.org/w/index.php?oldid=34660861 Contribuidores: Quiumen, 1 edies annimas

Analisador sinttico LL Fonte: http://pt.wikipedia.org/w/index.php?oldid=34663380 Contribuidores: Diogofsr, Leonardo.stabile, Sanscrit1234, 1 edies annimas

Analisador sinttico LR Fonte: http://pt.wikipedia.org/w/index.php?oldid=35052438 Contribuidores: Leonardo.stabile, 2 edies annimas

Analisador sinttico descendente recursivo Fonte: http://pt.wikipedia.org/w/index.php?oldid=35305665 Contribuidores: Leonardo.stabile

Anlise de algoritmos Fonte: http://pt.wikipedia.org/w/index.php?oldid=34683643 Contribuidores: LeonardoG, Manuel Anastcio, Villarinho, 8 edies annimas

Algoritmos de Berkeley Fonte: http://pt.wikipedia.org/w/index.php?oldid=20414872 Contribuidores: Bisbis, Eduardo Henrique Rivelli Pazos, Fabiom wiki, Rodrigoedp, Santosga

CRC Fonte: http://pt.wikipedia.org/w/index.php?oldid=34523273 Contribuidores: Anacarolina, Beto, Der kenner, Ebalter, Frosseto, Girino, Hermgenes Teixeira Pinto Filho, Manuel
Anastcio, Nuno Tavares, Probatista, Rui Silva, Sir Lestaty de Lioncourt, Theus PR, 35 edies annimas

Algoritmo CYK Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646639 Contribuidores: Kaktus Kid, Leonardo.stabile, 1 edies annimas

Comb sort Fonte: http://pt.wikipedia.org/w/index.php?oldid=35010294 Contribuidores: Bruno Meireles, Gonalo Veiga, Ricardo Ferreira de Oliveira, Yanguas, 8 edies annimas
Fontes e Editores da Pgina 215

Congruncia de Zeller Fonte: http://pt.wikipedia.org/w/index.php?oldid=35040146 Contribuidores: Leonardo.stabile

Algoritmo de Cristian Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646668 Contribuidores: Bisbis, ChristianH, Fabiom wiki, OS2Warp, Salgueiro, Santosga, 1 edies annimas

Crivo de Atkin Fonte: http://pt.wikipedia.org/w/index.php?oldid=35068163 Contribuidores: Fnds, Gonalo Veiga, Leonardo.stabile, Marcobiscaro2112, Rafael.afonso, 2 edies annimas

Deteco e correco de erros Fonte: http://pt.wikipedia.org/w/index.php?oldid=20453594 Contribuidores: Dantadd, Ebalter, Merrill, [email protected], Yanguas, 7 edies annimas

Dgito verificador Fonte: http://pt.wikipedia.org/w/index.php?oldid=34465478 Contribuidores: 999, Accio Salgueiro, Ademar Brasil, Anderson de A., Augux, Aurola, Bruno Meireles,
ChristianH, CorreiaPM, Deniscostadsc, Dpc01, Farope, Gaf.arq, HVL, Helder.wiki, Hyju, Imprensista, Jbribeiro1, Jhumber, Leopaiva2000, Marcusmbz, Onjacktallcuca, PH, Pablodiego15,
Rnbastos, Scharf, Stegop, Tumnus, Tuvalkin, WikiGT, Xam, Xandi, Yanguas, 82 edies annimas

Dgito verificador GS1 Fonte: http://pt.wikipedia.org/w/index.php?oldid=17249665 Contribuidores: Ebalter, Fabiano Tatsch, Mateus RM, Yanguas, 2 edies annimas

Algoritmo de discagem predictiva Fonte: http://pt.wikipedia.org/w/index.php?oldid=17249518 Contribuidores: Al Lemos, Eduardo Carvalho, Rnbastos, Santosga, Yanguas

Algoritmo de disperso Fonte: http://pt.wikipedia.org/w/index.php?oldid=24410099 Contribuidores: !Silent, Adailton, FML, Fabiano Tatsch, Leandrod, Lijealso, Lusitana, Marcelo.Faveri,
Mschlindwein, Ncarvalho, Santosga, Sygmn, Yanguas, 4 edies annimas

Distncia Levenshtein Fonte: http://pt.wikipedia.org/w/index.php?oldid=34518846 Contribuidores: !Silent, 555, Alchimista, Felds, Helder.wiki, Joaotg, JotaCartas, Mschlindwein, 23 edies
annimas

Diviso polinomial Fonte: http://pt.wikipedia.org/w/index.php?oldid=35113885 Contribuidores: Joo Carvalho, 1 edies annimas

Eleio de lder Fonte: http://pt.wikipedia.org/w/index.php?oldid=35036414 Contribuidores: FSogumo, Lechatjaune, Yanguas, 3 edies annimas

Encapsulao Fonte: http://pt.wikipedia.org/w/index.php?oldid=2820362 Contribuidores: Bigs, Bons, EduM, Santana-freitas

Escalonamento garantido Fonte: http://pt.wikipedia.org/w/index.php?oldid=20425928 Contribuidores: Elias Augusto Sansana, Maurcio I, 10 edies annimas

Exame de Graham Fonte: http://pt.wikipedia.org/w/index.php?oldid=34916822 Contribuidores: Alessandro70, Alexlaier, Ccero, Helder.wiki, Mathonius, Maurcio I, Salgueiro, 7 edies
annimas

FIFO (escalonamento) Fonte: http://pt.wikipedia.org/w/index.php?oldid=33753875 Contribuidores: Arthemius x, Kaiemkzk, Maurcio I, Tschis, Yanguas, 3 edies annimas

Fluxograma Fonte: http://pt.wikipedia.org/w/index.php?oldid=35518246 Contribuidores: Abmac, Andreavorio, Arley, Arnaldo Rabelo, Bons, Brunoslessa, Camponez, Chico, Chicocvenancio,
Chris Benoit 27, Daimore, Eduardo Henrique Rivelli Pazos, FML, Faustino.F, Franklin Fioroti, Get It, Helder.wiki, Hyju, JSSX, Leonardo.stabile, Leslie, Lijealso, Mschlindwein, Muriel Gottrop,
Nuno Tavares, OS2Warp, PauloHenrique, Pietro Roveri, Salvaemerson, Severino666, Spoladore, Theus PR, Tschulz, Voz da Verdade, Zoldyick, 97 edies annimas

Fora bruta Fonte: http://pt.wikipedia.org/w/index.php?oldid=35367850 Contribuidores: Brunonar, Camponez, EduM, Joo Carvalho, Juntas, Leonardo.stabile, Lusitana, MisterSanderson,
Rafael.afonso, Rodrigo.siqueira, Tetri, Tumnus, Vanthorn, 12 edies annimas

Gerador de nmeros pseudoaleatrios Fonte: http://pt.wikipedia.org/w/index.php?oldid=35415783 Contribuidores: Alessandro70, Leonardo.stabile, Lus Felipe Braga, Salgueiro, Yanguas, 4
edies annimas

Heurstica (computao) Fonte: http://pt.wikipedia.org/w/index.php?oldid=34852420 Contribuidores: Alchimista, Brunosprak, CelsoS, Cmorelli, EduM, Jcmo, Joo Carvalho,
Leonardo.stabile, Nuno Tavares, OS2Warp, Salgueiro, 19 edies annimas

Intratabilidade Fonte: http://pt.wikipedia.org/w/index.php?oldid=17318560 Contribuidores: Carlos Luis M C da Cruz, Fabiano Tatsch, Hermgenes Teixeira Pinto Filho, Higor Douglas,
Kleiner, Prowiki, 1 edies annimas

Jaro-Winkler Fonte: http://pt.wikipedia.org/w/index.php?oldid=34235945 Contribuidores: Castelobranco, Jos AF, Joo Carvalho, MisterSanderson, Mmoire, Rui Silva, 1 edies annimas

Juno hash Fonte: http://pt.wikipedia.org/w/index.php?oldid=35146143 Contribuidores: FSogumo, MisterSanderson, OffsBlink

Algoritmo de Kruskal Fonte: http://pt.wikipedia.org/w/index.php?oldid=34442529 Contribuidores: CommonsDelinker, Ccero, Danielamaral, Danielcc10, FelipeVargasRigo, Giro720, Kaktus
Kid, Leonardo.stabile, Maxtremus, Osias, Ricardo Ferreira de Oliveira, Salgueiro, 27 edies annimas

Lamport ordering Fonte: http://pt.wikipedia.org/w/index.php?oldid=28873174 Contribuidores: Bons, 1 edies annimas

Leaky Bucket Fonte: http://pt.wikipedia.org/w/index.php?oldid=35276482 Contribuidores: Clara C., Fg costa, Helder.wiki, Jack Bauer00, Leolmelo, 1 edies annimas

Mtodo de Monte Carlo Fonte: http://pt.wikipedia.org/w/index.php?oldid=34475766 Contribuidores: Agil, Albmont, Carlos-PC, Ci.cp, Llcastro, Loureiroandre, Mateus95860, Rbaliq, Roberto
Cruz, Salgueiro, 18 edies annimas

Mtodo de Newton Fonte: http://pt.wikipedia.org/w/index.php?oldid=34461229 Contribuidores: Andr Scaranto, Campani, Carnevalli, Der kenner, Edudobay, Ehabkost, Francisco Leandro,
Gabrielmd2802, Helder.wiki, Joo Gadelha, Kaze Senshi, Moacirponti, OS2Warp, Porantim, Rafael.afonso, Salgueiro, 20 edies annimas

Mtodo das secantes Fonte: http://pt.wikipedia.org/w/index.php?oldid=34721987 Contribuidores: Ariel C.M.K., Edudobay

Mltiplas filas Fonte: http://pt.wikipedia.org/w/index.php?oldid=33753829 Contribuidores: Arthemius x, CommonsDelinker, Fvmp, Gerbilo, Grupo S.O UTFPR, Hermgenes Teixeira Pinto
Filho, Rafaeldelucena, Reynaldo, Yanguas, 14 edies annimas

Algoritmo next-fit Fonte: http://pt.wikipedia.org/w/index.php?oldid=17249746 Contribuidores: Hermgenes Teixeira Pinto Filho, Santosga, Wilyman, Yanguas

Otimizao da colnia de formigas Fonte: http://pt.wikipedia.org/w/index.php?oldid=22884021 Contribuidores: Filipe Saraiva, Mschlindwein, Mrcio Silva, Rafaelveggi, Rafamaxpires, 1
edies annimas

Particionamento binrio de espao Fonte: http://pt.wikipedia.org/w/index.php?oldid=34906460 Contribuidores: Al Lemos, Ebalter, Helder.wiki, Marcoapc, Orelhas, Rhe, Wikipedialista, 2
edies annimas

Algoritmo de Peterson Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646718 Contribuidores: Caroline Brown da Rocha, Davemustaine, Helder.wiki, Hermgenes Teixeira Pinto Filho,
Leonardo.stabile, Rmaghcho, Yanguas, 4 edies annimas

Poda alfa-beta Fonte: http://pt.wikipedia.org/w/index.php?oldid=23091894 Contribuidores: Joaopchagas2, Stegop

Problema da vazo mxima Fonte: http://pt.wikipedia.org/w/index.php?oldid=34916475 Contribuidores: Alessandro70, Ccero, Kaktus Kid, Salgueiro, 2 edies annimas

Problema do par de pontos mais prximo Fonte: http://pt.wikipedia.org/w/index.php?oldid=34926608 Contribuidores: Alexg, Helder.wiki, Ilustrador, Pfaraujo, Salgueiro, 3 edies annimas

Prosthaphaeresis Fonte: http://pt.wikipedia.org/w/index.php?oldid=35004160 Contribuidores: Epinheiro, Marceif

Pseudocdigo Fonte: http://pt.wikipedia.org/w/index.php?oldid=35372597 Contribuidores: !Silent, Adailton, Capmo, CasperBraske, Clara C., Daimore, Ddi's, Fabios100, Gean, Hyju,
JotaCartas, Leonardo.stabile, Luiza Teles, Marivb, Nuno Tavares, OS2Warp, Prof Ricardo Vianna, 39 edies annimas

Rsync Fonte: http://pt.wikipedia.org/w/index.php?oldid=34458820 Contribuidores: CrhisGhama, Giro720, Leonardo.stabile, LeonardoG, Leslie, Santana-freitas, Vicente.lima, 1 edies
annimas
Fontes e Editores da Pgina 216

SJF Fonte: http://pt.wikipedia.org/w/index.php?oldid=34621985 Contribuidores: !Silent, FSogumo, FabioBrunini, Hermgenes Teixeira Pinto Filho, Jack Bauer00, Kleiner, Risthel, 7 edies
annimas

Sistema de reduo Fonte: http://pt.wikipedia.org/w/index.php?oldid=34708692 Contribuidores: Maurcio I, Placidosouza, Yanguas

Solitaire cipher Fonte: http://pt.wikipedia.org/w/index.php?oldid=25745909 Contribuidores: Jabuti, 2 edies annimas

Algoritmo de sudoku Fonte: http://pt.wikipedia.org/w/index.php?oldid=34646746 Contribuidores: Carlos Bacco, Fabiano Tatsch, Helder.wiki, Jonas AGX, Leonardo.stabile, Mschlindwein,
Onjacktallcuca, 1 edies annimas

Tcnicas de projeto de algoritmos Fonte: http://pt.wikipedia.org/w/index.php?oldid=28428145 Contribuidores: Diotti, OS2Warp, Tetri, Yanguas, 1 edies annimas

Teste de primalidade Fonte: http://pt.wikipedia.org/w/index.php?oldid=34808646 Contribuidores: Ccero, Helder.wiki, One People, Salgueiro

Token Bucket Fonte: http://pt.wikipedia.org/w/index.php?oldid=35276485 Contribuidores: Castelobranco, Clara C., Fg costa

Worst-fit Fonte: http://pt.wikipedia.org/w/index.php?oldid=29004784 Contribuidores: Hermgenes Teixeira Pinto Filho, Pietro Roveri, Rodrigozanatta, Thorack
Fontes, Licenas e Editores da Imagem 217

Fontes, Licenas e Editores da Imagem


Ficheiro:binary tree.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Binary_tree.svg Licena: Public Domain Contribuidores: User:Dcoetzee
Ficheiro:Breadth-First-Search-Algorithm.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Breadth-First-Search-Algorithm.gif Licena: Creative Commons
Attribution-Sharealike 3.0,2.5,2.0,1.0 Contribuidores: Mre
Image:Breadth-first search Algorithm.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Breadth-first_search_Algorithm.gif Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Aexpedito
Imagem:6n-graf.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:6n-graf.svg Licena: Public Domain Contribuidores: User:AzaToth
Ficheiro:MapGermanyGraph.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:MapGermanyGraph.svg Licena: Public Domain Contribuidores: AndreasPraefcke, Mapmarks,
MistWiz, Regnaron
Ficheiro:GermanyBFS.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:GermanyBFS.svg Licena: Public Domain Contribuidores: Regnaron
File:Bplustree.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Bplustree.png Licena: Creative Commons Attribution 3.0 Contribuidores: Grundprinzip
File:B+-tree-organization.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B+-tree-organization.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Aexpedito
File:Insertion-3.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Insertion-3.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: User:Aexpedito
File:Insertion-25.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Insertion-25.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: User:Aexpedito
File:B+-tree-remove-10.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B+-tree-remove-10.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Aexpedito
File:B+-Tree-remove-2.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B+-Tree-remove-2.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Aexpedito
File:B+-tree-remove-30.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B+-tree-remove-30.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Aexpedito
File:B+-tree-remove-20.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B+-tree-remove-20.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Aexpedito
File:B+-tree-remove-61.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B+-tree-remove-61.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores:
User:Aexpedito
Ficheiro:Binary tree.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Binary_tree.png Licena: Creative Commons Attribution-ShareAlike 3.0 Unported Contribuidores:
User:Rune
Ficheiro:Binary tree.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Binary_tree.svg Licena: Public Domain Contribuidores: User:Dcoetzee
Ficheiro:Binary tree in array.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Binary_tree_in_array.svg Licena: Public Domain Contribuidores: User:Dcoetzee
Imagem:Sorting quicksort anim.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Sorting_quicksort_anim.gif Licena: Creative Commons Attribution-ShareAlike 3.0 Unported
Contribuidores: Wikipedia:en:User:RolandH
Imagem:Fluxogranma02.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Fluxogranma02.gif Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: Andre
Cardoso
Imagem:New Animation Sieve of Eratosthenes.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:New_Animation_Sieve_of_Eratosthenes.gif Licena: Creative Commons
Attribution-Share Alike Contribuidores: M.qrius
Image:Dijkstra_Animation.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Dijkstra_Animation.gif Licena: Public Domain Contribuidores: Ibmua
Imagem:Wiki letter w.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Wiki_letter_w.svg Licena: GNU Free Documentation License Contribuidores: Jarkko Piiroinen
Ficheiro:Depth-first-tree.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Depth-first-tree.png Licena: GNU Free Documentation License Contribuidores: Alexander Drichel,
Braindrain0000, Bukk, Dcoetzee, EugeneZelenko, Regnaron, 2 edies annimas
Ficheiro:Depthfirst.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Depthfirst.png Licena: GNU Free Documentation License Contribuidores: User:Baruneju
Ficheiro:graph.traversal.example.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Graph.traversal.example.svg Licena: GNU Free Documentation License Contribuidores:
Miles
Imagem:Unbalanced binary tree.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Unbalanced_binary_tree.svg Licena: Public Domain Contribuidores: Me (Intgr)
Imagem:AVLtreef.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:AVLtreef.svg Licena: Public Domain Contribuidores: User:Mikm
Ficheiro:Prim Algorithm 0.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Prim_Algorithm_0.png Licena: Creative Commons Attribution-ShareAlike 3.0 Unported
Contribuidores: Shen, Yuval Madar
Imagem:B-tree-definition.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B-tree-definition.png Licena: GNU Free Documentation License Contribuidores: Christian1985,
Haui, Hawky.diddiz, 1 edies annimas
File:B-tree.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B-tree.svg Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: CyHawk
Image:B tree insertion example.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:B_tree_insertion_example.png Licena: Public Domain Contribuidores: User:Maxtremus
File:Delete-key-from-Btree-1.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Delete-key-from-Btree-1.png Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Aexpedito
File:Delete-key-from-Btree-2.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Delete-key-from-Btree-2.png Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Aexpedito
File:Delete-key-from-Btree-3.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Delete-key-from-Btree-3.png Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Aexpedito
File:Delete-key-from-Btree-5.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Delete-key-from-Btree-5.png Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Aexpedito
File:Delete-key-from-Btree-4.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Delete-key-from-Btree-4.png Licena: Creative Commons Attribution-Sharealike 3.0
Contribuidores: User:Aexpedito
Ficheiro:6n-graf.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:6n-graf.svg Licena: Public Domain Contribuidores: User:AzaToth
Ficheiro:Grafo k4 plano.PNG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Grafo_k4_plano.PNG Licena: GNU Free Documentation License Contribuidores: Original uploader
was Marivb at pt.wikipedia
Imagem:Single linked list.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Single_linked_list.png Licena: Creative Commons Attribution-ShareAlike 3.0 Unported
Contribuidores: User:Rune
Ficheiro:TSP Deutschland 3.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:TSP_Deutschland_3.png Licena: Public Domain Contribuidores: Original uploader was Kapitn
Nemo at de.wikipedia. Later version(s) were uploaded by MrMonstar at de.wikipedia.
Image:Decisao.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Decisao.png Licena: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contribuidores:
AidaFernandaUFPE
Image:Maquina.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Maquina.png Licena: Public Domain Contribuidores: Schadel (http://turing.izt.uam.mx)
File:Sorting quicksort anim.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Sorting_quicksort_anim.gif Licena: Creative Commons Attribution-ShareAlike 3.0 Unported
Contribuidores: Wikipedia:en:User:RolandH
Image:Complexity subsets pspace.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Complexity_subsets_pspace.svg Licena: Public Domain Contribuidores: Hand drawn in
Inkscape Qef
Fontes, Licenas e Editores da Imagem 218

Image:Complexity classes.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Complexity_classes.svg Licena: Public Domain Contribuidores: Booyabazooka, Mdd, Mike1024,
NeverDoING, 1 edies annimas
File:Theoretical computer science.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Theoretical_computer_science.png Licena: Creative Commons Attribution-Share Alike
Contribuidores: User:RobinK
Imagem:Insertion sort animation.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Insertion_sort_animation.gif Licena: Creative Commons Attribution-Sharealike 2.5
Contribuidores: Nuno Nogueira (Nmnogueira)
Imagem:Selection sort animation.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Selection_sort_animation.gif Licena: Public Domain Contribuidores: en:Marco Polo at
en.wikipedia.org
Imagem:Bubble sort animation.gif Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Bubble_sort_animation.gif Licena: Creative Commons Attribution-Sharealike 2.5
Contribuidores: Original uploader was Nmnogueira at en.wikipedia
Ficheiro:DW Block Angular Matrix.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:DW_Block_Angular_Matrix.jpg Licena: Creative Commons Attribution 3.0
Contribuidores: Alotau
Ficheiro:Conjugate gradient illustration.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Conjugate_gradient_illustration.svg Licena: Public Domain Contribuidores: Oleg
Alexandrov
Ficheiro:CycleFindingNew.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:CycleFindingNew.png Licena: GNU Free Documentation License Contribuidores: Maksim,
MistWiz
Imagem:ZChaff.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:ZChaff.png Licena: Creative Commons Attribution-ShareAlike 3.0 Unported Contribuidores: Rauljcs
Imagem:Dois Literais.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Dois_Literais.png Licena: Creative Commons Attribution-ShareAlike 3.0 Unported Contribuidores: Raul
Joaquim Camara dos Santos
Imagem:Estrutura de Chaff.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Estrutura_de_Chaff.png Licena: Creative Commons Attribution 2.5 Contribuidores: Raul Joaquim
Cmara dos Santos
Imagem:Wagner-Whitin2.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Wagner-Whitin2.jpg Licena: GNU Free Documentation License Contribuidores: Tersine
Imagem:Wagner-Whitin3.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Wagner-Whitin3.jpg Licena: GNU Free Documentation License Contribuidores: tersine
Imagem:Wagner-Whitin4.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Wagner-Whitin4.jpg Licena: GNU Free Documentation License Contribuidores: tersine
Ficheiro:Jarvis march convex hull algorithm diagram.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Jarvis_march_convex_hull_algorithm_diagram.svg Licena: Public
Domain Contribuidores: Original uploader was Alan De Smet at en.wikipedia
Ficheiro:Graham scan.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Graham_scan.png Licena: Public Domain Contribuidores: Alessandro70, Boris Christ, Butko, Ilmari
Karonen, Pethrus, 3 edies annimas
Imagem:FIFO_EXEMPLO_1.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:FIFO_EXEMPLO_1.png Licena: GNU Free Documentation License Contribuidores: Kaiemkzk
Imagem:FIFO_EXEMPLO_2.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:FIFO_EXEMPLO_2.png Licena: GNU Free Documentation License Contribuidores: Kaiemkzk
Imagem:LampFlowchart pt.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:LampFlowchart_pt.svg Licena: GNU Free Documentation License Contribuidores: svg by
Booyabazooka (portuguese translation by Spoladore)original png by Wapcaplet
Ficheiro:Prim Algorithm 0.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Prim_Algorithm_0.svg Licena: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0
Contribuidores: Alexander Drichel
Ficheiro:Kruskal Algorithm 1.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kruskal_Algorithm_1.svg Licena: Public Domain Contribuidores: Maksim, Yuval Madar
Ficheiro:Kruskal Algorithm 2.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kruskal_Algorithm_2.svg Licena: Public Domain Contribuidores: Maksim, Yuval Madar
Ficheiro:Kruskal Algorithm 3.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kruskal_Algorithm_3.svg Licena: Public Domain Contribuidores: Maksim, Yuval Madar
Ficheiro:Kruskal Algorithm 4.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kruskal_Algorithm_4.svg Licena: Public Domain Contribuidores: Maksim, Yuval Madar
Ficheiro:Kruskal Algorithm 5.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kruskal_Algorithm_5.svg Licena: Public Domain Contribuidores: Maksim, Yuval Madar
Ficheiro:Kruskal Algorithm 6.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Kruskal_Algorithm_6.svg Licena: Public Domain Contribuidores: Maksim, Yuval Madar
Ficheiro:Montecarlo.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Montecarlo.svg Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: Avron, Dake,
Ramac, 1 edies annimas
Ficheiro:FMFluxogramaMetropolis.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:FMFluxogramaMetropolis.jpg Licena: Creative Commons Attribution-Sharealike 2.5
Contribuidores: Llcastro
Ficheiro:Ganzhi001.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Ganzhi001.jpg Licena: GNU Free Documentation License Contribuidores: User Ganzhi on zh.wikipedia
Ficheiro:Secant method.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Secant_method.svg Licena: Public Domain Contribuidores: User:Jitse Niesen
Ficheiro:Distribuio de Prioridades.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Distribuio_de_Prioridades.JPG Licena: Public Domain Contribuidores: Grupo de S.O
Ficheiro:Mltiplas Filas com realimentao.JPG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Mltiplas_Filas_com_realimentao.JPG Licena: Public Domain Contribuidores:
Grupo de S.O
Imagem:ClosestPair.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:ClosestPair.png Licena: Public Domain Contribuidores: Original uploader was Gfonsecabr at en.wikipedia
Later version(s) were uploaded by McLoaf at en.wikipedia.
Ficheiro:Sudoku grid pairing.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Sudoku_grid_pairing.png Licena: GNU Free Documentation License Contribuidores: Wegge at
da.wikipedia
Licena 219

Licena
Creative Commons Attribution-Share Alike 3.0 Unported
//creativecommons.org/licenses/by-sa/3.0/

Você também pode gostar