Algoritmia e Computação
Algoritmia e Computação
Algoritmia e Computação
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
Referncias
Fontes e Editores da Pgina 213
Fontes, Licenas e Editores da Imagem 217
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.
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
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.
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
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
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
{$APPTYPE CONSOLE}
uses
SysUtils;
var
Busca em largura 8
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
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
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.
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
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
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
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
Mtodos
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 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.
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.
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
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.
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.
Insero
O algoritmo da insero em rvores binrias so facilmente implementadas atravs de funo recursiva.
Algoritmo da insero em C:
anterior = novo;
}
return anterior;
}
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 :
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 :
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 :
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
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;
}
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.
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
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.
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
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
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:
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
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}
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
// 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];
int dis[MAXV];
// Calcula as distncias de 'Vi' a todos os outros vrtices de um grafo com 'V' vrtices e armazena-as em dis[]
// vis[i] informa se o vrtice 'i' j foi visitado/analisado ou no (inicialmente nenhum vrtice foi)
char vis[MAXV];
// Inicialmente afirmamos que a menor distncia encontrada entre Vi e qualquer outro vrtice (exceto o prprio Vi) infinita
Algoritmo de Dijkstra 39
dis[Vi] = 0;
while (1)
int i, n = -1;
n = i;
if (n < 0)
break;
vis[n] = 1;
#include <vector>
// Lista de adjacncias
// Para inserir uma aresta - partindo do vrtice 'i' ao vrtice 'j', com custo 'c' - na lista, podemos usar:
int dis[MAXV];
// Calcula as distncias de 'Vi' a todos os outros vrtices de um grafo com 'V' vrtices e armazena-as em dis[]
// vis[i] informa se o vrtice 'i' j foi visitado/analisado ou no (inicialmente nenhum vrtice foi)
char vis[MAXV];
// Inicialmente afirmamos que a menor distncia encontrada entre Vi e qualquer outro vrtice (exceto o prprio Vi) infinita
Algoritmo de Dijkstra 40
dis[Vi] = 0;
while (1)
int i, n = -1;
n = i;
if (n < 0)
break;
vis[n] = 1;
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).
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.
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
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:
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
}
Java
public static int buscaBinaria( int[] array, int valor )
{
int esq = 0;
int dir = array.length - 1;
int valorMeio;
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);
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;
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
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;
return -1;
}
$a = array(1, 2, 3, 4, 5, 6);
[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.
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
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
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:
//vetor de chaves
int chaves[D-1];
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:
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.
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.
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.
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
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.
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
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)
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.
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);
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:
int main(void){
No * raiz;
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);
}
}
struct dic{
char *original;
char *complementar;
struct dic *prox;
};
Lista ligada 76
//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;
}
}
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;
}
};
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;
}
}
ListaLigada ()
{
primeiro = null;
ultimo = null;
nroNos = 0;
}
/*
* @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;
}
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
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.
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.
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.
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.
Classes de complexidade
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]
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.
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]
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.
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
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
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
Criado por []
Niklaus Wirth
Compiladores Delphi, Free Pascal, GNU Pascal, MIDletPascal, Palm & Pascal, Turbo Pascal
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);
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
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 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
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:
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]
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
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.
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.
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
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;
Veja tambm
Mtodo de Monte Carlo
Pesquisa tabu
Cadeias de Markov
Problema do caixeiro viajante
Algoritmo busca-ciclos de Floyd 112
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
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:
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.
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.
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
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
1800-1899 Sexta-feira
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.
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.
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
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:
Com as entradas:
2 + 3 * 4
== 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
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
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:
O pseudo-cdigo para o algoritmo que calcula F como segue (ndice 0 representa 1a posio):
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:
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;
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.
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
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 .
Perodo 1 2 3 4 5 6
Procura 75 0 33 28 0 10
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
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
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)
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
Referncias
[1] http:/ / pt. wikipedia. org/ w/ index. php?title=Algoritmo_embrulho_para_presente& action=edit
Algoritmo para extrao da raiz quadrada 144
Propriedades
As seguintes propriedades da funo raiz quadrada so vlidas para todos os nmeros reais positivos x e y:
sempre que x y
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
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
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.
____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;
}
5.
6.
7.
8.
9.
O prximo nmero 9.
O resultado nos d 5.19 com uma aproximao da raiz quadrada de 27.
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:
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
Os estados:
As matrizes de transio:
REJEIO:
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*
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
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
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
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.
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
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
Comb sort
Comb sort
classe Algoritmo de ordenao
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.
Implementaes
Pseudocdigo
function combsort(array input)
i := 0
swaps := 0 //see bubblesort for an explanation
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;
swaps = false;
ForwardIterator itLeft(first);
ForwardIterator itRight(first); std::advance(itRight, gap);
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;
swapped = 0;
i = 0;
Ruby
def comb_sort(list)
shrink_factor = 1.247330950103979
gap = list.size
swapped = true
i = 0
swapped = false
Comb sort 168
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
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:
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)
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
GTIN-8 N1 N2 N3 N4 N5 N6 N7 N8
18 digitos N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 N16 N17 N18
x3 X1 x3 x1 x3 x1 x3 x1 x3 x1 x3 x1 x3 x1 x3 x1 x3
Subtraia (X) por um mltiplo de 10 superior mais prximo a ele = Dgito Verificador
Posies N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 N16 N17 N18
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 = = = = = = = = = = = = = = = = =
Passo 3: Subtrair o resultado da soma por um mltiplo de 10 superior mais prximo (110) = Dgito Verificador (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 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
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
tab[X, Y] := menor(
tab[X-1, Y ] + 1, // Deletar
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
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
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 escalonador sabe exatamente o tempo necessrio para realizar cada operao do sistema operacional.
- 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);
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.
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.
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
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:
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
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.
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.
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
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
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
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).
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:
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
O mtodo
O mtodo das secantes definido pela
relao de recorrncia
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
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
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.
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
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
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
-.
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
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
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
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 .
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
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,
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;
+-----------------------+
| 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
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/)
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
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
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
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 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 do Avestruz Fonte: http://pt.wikipedia.org/w/index.php?oldid=22104368 Contribuidores: Agiesbrecht, Faustino.F, OffsBlink, 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
Analisador sinttico LL Fonte: http://pt.wikipedia.org/w/index.php?oldid=34663380 Contribuidores: Diogofsr, Leonardo.stabile, Sanscrit1234, 1 edies annimas
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
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
Eleio de lder Fonte: http://pt.wikipedia.org/w/index.php?oldid=35036414 Contribuidores: FSogumo, Lechatjaune, Yanguas, 3 edies annimas
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
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
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
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
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
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
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
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
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/