Escolar Documentos
Profissional Documentos
Cultura Documentos
Ziviani, Nivio
Projeto de algoritmos c o m implementaes
Pascal C / Nivio Ziviani. -- 4. ad. -- So Paulo :
Pioneira, 1999. -- (Pioneira Informtica)
Bibliografia.
ISBN 85-221-
98-5286 CDD-005.1
ndices para catlogo sistemtico:
1. Algoritmos : Computadores : Programao : Processamento
de dados 005.1
Projeto
de
Algoritmos
Com Implementaes
em Pascal e C
PIONEIRA INFORMTICA
Coordenador:
Routo Terada
Conselho Diretor:
Lvio Giosa
Ulf Gregor Baranow
Projeto
de
Algoritmos
Com Implementaes
em Pascal e C
44 Edio
Este livro foi composto, revisado.
paginado pelo autor.
A Pioneira, a partir dos fotolitos, imprimiu-o.
Capa do
Riccardo Fanucchi
Copyright 1999
Impresso no
Brasil Printed in
Brazil
Prefcio
Este livro apresenta uma introduo ao estudo de algoritmos computacionais.
As principais tcnicas de projeto de algoritmos so ensinadas atravs da
explicao detalhada de algoritmos e estruturas de dados para o uso eficiente
do computador. Estas explicaes so mantidas o mais simples possvel, mas
sem perder a profundidade e o rigor matemtico.
O contedo dirigido principalmente para ser utilizado como livro-texto
em cursos sobre algoritmos e estruturas de dados. Pelo fato de apresentar
muitas implementaes de algoritmos prticos o texto igualmente til para
profissionais engajados no desenvolvimento de sistemas de computao e de
programas de aplicao. Os algoritmos so apresentados atravs de refina-
mentos sucessivos at o nvel de uma implementao na linguagem Pascal, o
que permite que qualquer pessoa com um mnimo de experincia em pro-
gramao possa ler o cdigo.
Contedo
Ao Leitor
Uma verso inicial deste texto foi escrita para ser usada no Curso Estruturas
de Dados e Algoritmos da I Escola Brasileiro-Argentina de Informtica em
fevereiro de 1986, publicada pela Editora da Unicamp sob o ttulo Projeto de
Algoritmos e Estruturas de Dados. Gostaria de agradecer a Carlos Jos Pe-
reira de Lucena e Routo Terada por lembrarem do meu nome para participar
da I Escola Brasileiro-Argentina de Informtica, o que motivou o desenvol-
vimento da semente deste texto. Gostaria de agradecer a Cilio Rosa Ziviani,
Cleber Hostalcio de Melo, Jos Monteiro da Mata, Lilia Tavares Mascare-
nhas, Luiz Carlos de Abreu Albuquerque, Regina Helena Bastos Cabral e
Rosngela Fernandes pelas contribuies para a primeira verso do texto.
Muitos amigos e colegas me auxiliaram na. elaborao deste livro. Agra-
deo a todos pela ajuda e pelas crticas construtivas. O Departamento de
Cincia da Computao da Universidade Federal de Minas Gerais tem pro-
porcionado um excelente ambiente de trabalho. Os meus alunos de extenso,
graduao, especializao e ps-graduao, especialmente os alunos das disci-
plinas Tcnicas de Programao, Algoritmos e Estruturas de Dados e Projeto
e Anlise de Algoritmos contriburam significativamente.
Vrios erros foram corrigidos como conseqncia da leitura cuidadosa
de vrias pessoas, em especial Alberto Henrique Frade Laender, Eduardo
Fernandes Barbosa, Jos Nagib Cotrim Arabe, Mrcio Luiz Bunte de Car-
valho, Osvaldo Srgio Farhat de Carvalho, Roberto Mrcio Ferreira de Souza
e Virglio Augusto Fernandes Almeida, aos quais gostaria de registrar meus
agradecimentos. Gostaria de agradecer a Cristina Duarte Murta pela leitura
crtica de todo o texto, pelos testes dos programas Pascal e pela execuo dos
programas que permitiu o estudo comparativo dos algoritmos de ordenao.
A verso C dos algoritmos existe graas ao trabalho paciente de traduo
dos programas Pascal conduzido -por Maurcio Antnio de Castro Lima
e Wagner Toledo Corra, realizado com o auxlio do programa p2c para
traduo automtica de programas em Pascal para programas em C, desen-
volvido por Dave Gillespie, do California Institute of Technology, EUA. O
livro foi formatado com LATEX, um conjunto de macros para o TEX. Um
agradecimento todo especial para Mrcio Luiz Bunte de Carvalho pela
imensa ajuda durante todo o trabalho de formatao, incluindo a criao de
ambientes especiais em LATEX para este texto, sendo que esta etapa
contou tambm com a ajuda de Murilo Silva Monteiro.
Nivio Ziviani
Belo Horizonte
Dezembro de 1992
Endereo Internet: nivio@dcc.ufmg.br
Sumrio
Prefcio v
Lista de Tabelas xv
1 Introduo 1
1.1 Algoritmos, Estruturas de Dados e Programas ...................................... 1
1.2 Tipos de Dados e Tipos Abstratos de Dados ......................................... 2
1.3 Medida do Tempo de Execuo de um Programa ................................. 3
1.3.1 Comportamento Assinttico de Funes ................................. 11
1.3.2 Classes de Comportamento Assinttico ...................................14
1.4 Tcnicas de Anlise de Algoritmos ...................................................... 18
1.5 Pascal ...................................................................................................... 25
Notas Bibliogrficas .................................................................................... 30
Exerccios ..................................................................................................... 30
3 Ordenao 69
3.1 Ordenao Interna ................................................................................ 71
3.1.1 Ordenao por Seleo ............................................................. 72
3.1.2 Ordenao por Insero ............................................................ 73
3.1.3 Shellsort ..................................................................................... 76
3.1.4 Quicksort .................................................................................... 78
3.1.5 Heapsort ..................................................................................... 81
3.1.6 Comparao Entre os Mtodos ................................................. 87
3.2 Ordenao Externa ............................................................................... 91
3.2.1 Intercalao Balanceada de Vrios Caminhos ........................ 92
3.2.2 Implementao Atravs de Seleo por Substituio ............. 94
3.2.3 Consideraes Prticas ............................................................. 97
Notas Bibliogrficas ................................................................................... 99
Exerccios .................................................................................................... 99
ndice 261
Lista de Figuras
1.1 Partio de A em dois subconjuntos ....................................................... 9
1.2 Dominao assinttica de (An) sobre g(n) ......................................... 12
1.3 Operaes com a notao O .................................................................. 13
1.4 Problema do caixeiro viajante ...............................................................18
1.5 Estrutura de um programa Pascal ......................................................... 25
1.6 Registro do tipo pessoa ......................................................................... 28
1.7 Lista encadeada ...................................................................................... 30
2.1 Implementao de uma lista atravs de arranjo ...................................37
2.2 Implementao de uma lista atravs de apontadores .......................... 40
2.3 Classificao dos alunos por NotaFinal ............................................... 43
2.4 Lista de aprovados por Curso ............................................................... 44
2.5 Implementao de uma pilha atravs de arranjo ..............................
............................... 48
2.6 Implementao de uma pilha atravs de apontadores ......................... 51
2.7 Implementao circular para filas ........................................................ 56
2.8 Implementao de uma fila atravs de apontadores ............................ 58
2.9 Lista circular duplamente encadeada ................................................... 61
2.10 Exemplo de Matriz Esparsa ................................................................ 62
3.1 Exemplo de ordenao por seleo ...................................................... 72
3.2 Exemplo de ordenao por insero ..................................................... 74
3.3 Exemplo de ordenao usando Shellsort ..............................................76
3.4 Partio do vetor .................................................................................... 79
3.5 Exemplo de ordenao usando Quicksort ............................................ 80
3.6 Arvore binria completa ........................................................................ 84
3.7 Arvore binria completa representada por um arranjo . 84
3.8 Construo do heap ............................................................................... 85
3.9 Exemplo de ordenao usando Heapsort ............................................. 86
3.10 Arquivo exemplo com 22 registros .................................................... 93
3.11 Formao dos blocos ordenados iniciais ............................................ 93
3.12 Intercalao-de-3-caminhos ................................................................ 93
3.13 Resultado da primeira passada usando seleo por ubstituio....... 95
LISTA DE FIGURAS
1
2 CAPTULO 1. INTRODUO
2De acordo com o Novo Dicionrio Aurlio da Lingua Portuguesa, um orculo : 1. Resposta de um deus a quem o
consultava. 2. Divindade que responde consultas e orienta o crente: o orculo de Delfos. 3. Fig. Palavra, sentena ou deciso inspirada,
infalvel ou que tem grande autoridade: os orculos dos profetas, os orculos da cincia.
1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 11
curso < c1, c3, c4, c2, c1 > uma soluo para o problema, cujo percurso total
tem distncia 24.
Um algoritmo simples para o problema acima seria verificar todas as
rotas e escolher a menor delas. Como existem ( n 1)! rotas possveis e a
distncia total percorrida em cada rota envolve n adies, ento o nmero
total de adies n ! . Para o exemplo da Figura 1.4 teriamos 24 adies.
Suponha agora 50 cidades: o nmero de adies seria igual ao fatorial de 50,
que aproximadamente 1064. Considerando um computador capaz de
executar 109 adies por segundo, o tempo total para resolver o problema
com 50 cidades seria maior do que 1045 sculos somente para executar as
adies.
1.5 Pascal
Os programas apresentados neste livro usam apenas as caractersticas bsicas
do Pascal, de acordo com a definio apresentada por Jensen e Wirth (1974).
Sempre que possvel so evitadas as facilidades mais avanadas disponveis
em algumas implementaes do Pascal.
0 objetivo desta seo no apresentar a linguagem Pascal na sua to-
talidade, mas apenas examinar algumas de suas caractersticas, facilitando
assim a leitura deste livro para as pessoas pouco familiarizadas com a lingua
-gem. Uma descrio clara e- concisa da linguagem apresentada por
Cooper (1983). Um bom texto introdutrio sobre a linguagem
apresentado por Clancy e Cooper (1982).
As vrias partes componentes de um programa Pascal podem ser vistas
na Figura 1.5. Um programa Pascal comea com um cabealho que d nome
ao programa. Rtulos, constantes, tipos, variveis, procedimentos, e funes
so declaradas sempre na ordem indicada pela Figura 1.5. A parte ativa do
programa descrita como uma seqncia de comandos, os quais incluem
chamadas de procedimentos e funes.
Se as variveis c, s, e d so declaradas
var c :
cor;
var s :
sexo;
var b :
boolean;
c :
=rosa;
s :
=fern;
b :
=true;
vara :
ano; var b :
letra;
1.5. PASCAL 27
onde a constante n deve ser previamente declarada
const n = 20;
Dada a varivel
var x : coluna;
p.sobrenome := 'Ziviani';
p.primeironome := 'Patricia';
p.aniversrio.dia := 21;
p.aniversrio.ms := 10;
p.sexo := fern;
A Figura 1.6 ilustra este exemplo.
Um tipo estruturado conjunto define a coleo de todos os subconjuntos
de algum tipo simples, com operadores especiais * (interseo), + (unio),
(diferena) e in (pertence a) definidos para todos os tipos conjuntos.
Exemplos:
type conjint = set of 1..9;
type conjcor = set of cor;
type conjchar = set of char;
28 CAPTULO 1. INTRODUO
1.5. PASCAL 29
Notas Bibliogrficas
Estudos bsicos sobre os conceitos de algoritmos, estruturas de dados e pro-
gramas podem ser encontrados em Dahl, Dijkstra e Hoare (1972), Dijkstra (
1971), Dijkstra (1976), Hoare (1969), Wirth (1971), Wirth (1974), Wirth (
1976). Mais recentemente Manber (1988) e Manber (1989) tratam da
utilizao de induo matemtica para o projeto de algoritmos.
A anlise assinttica de algoritmos hoje a principal medida de eficincia
para algoritmos. Existem muitos livros que apresentam tcnicas para analisar
algoritmos, tais como somatrios, equaes de recorrncia, rvores de
deciso, orculos, dentre outras. Knuth (1968), Knuth (1973), Knuth (1981),
Graham, Knuth e Patashnik (1989), Aho, Hoperoft e Ullman (1974), Stanat
e McAllister (1977), Cormem, Leiserson e Rivest (1990), Manber (1989), Ho-
rowitz e Sahni (1978), Greene e Knuth (1982), so alguns exemplos. Artigos
gerais sobre o tpico incluem Knuth (1971), Knuth (1976), Weide (1977),
Lueker (1980), Flajolet e Vitter (1987). Tarjan (1985) apresenta custo
amortizado: se certa parte de um algoritmo executada muitas vezes, cada
vez com um tempo de execuo diferente, ao invs de considerar o pior caso
em cada execuo, os diferentes custos so amortizados.
Existe uma enorme quantidade de livros sobre a linguagem Pascal. O
Pascal padro foi definido originalmente em Jensen e Wirth (1974). O livro
de Cooper (1983) apresenta uma descrio precisa e ao mesmo tempo
didtica do Pascal padro.
Exerccios
1) D o conceito de
algoritmo
EXERCCIOS 31
32 CAPTULO 1. INTRODUO
EXERCCIOS 33
34 CAPITULO 1. INTRODUO
35
36 CAPTULO 36. ESTRUTURAS DE DADOS BSICAS
Existem vrias estruturas de dados que podem ser usadas para representar
listas lineares, cada uma com vantagens e desvantagens particulares. As duas
representaes mais utilizadas so as implementaes atravs de arran-
jos e de apontadores. A implementao atravs de cursores (Aho, Hoperoft e
Ullman, 1983, pp. 48) pode ser til em algumas aplicaes.
2.37. LISTAS LINEARES 37
Chave : 1..999;
NotaFinal : 0..10;
Opo : array [1..3] of 1..7;
Programa 2.5: Campos do registro de um candidato
2.2 Pilhas
Existem aplicaes para listas lineares nas quais inseres, retiradas e acessos
a itens ocorrem sempre em um dos extremos da lista. Uma pilha uma lista
linear em que todas as inseres, retiradas e geralmente todos os acessos so
feitos em apenas um extremo da lista..
Os itens em uma pilha esto colocados um sobre o outro, com o item
inserido mais recentemente no topo e o item inserido menos recentemente no
fundo. 0 modelo intuitivo de uma pilha o de um monte de pratos em uma
prateleira, sendo conveniente retirar pratos ou adicionar novos pratos na
parte superior. Esta imagem est freqentemente associada com a teoria de
autmato, onde o topo de uma pilha considerado como o receptculo de
uma cabea de leitura/gravao que pode empilhar e desempilhar itens da
pilha (Hoperoft e Ullman, 1969).
As pilhas possuem a seguinte propriedade: o ltimo item 'inserido o
primeiro item que pode ser retirado da lista. Por esta razo as pilhas so
chamadas de listas lifo, termo formado a partir de "last-in, first-out". Existe
uma ordem linear para pilhas, que a ordem do "mais recente para o menos
recente". Esta propriedade torna a pilha uma ferramenta ideal para proces-
samento de estruturas aninhadas de profundidade imprevisvel, situao em
que necessrio garantir que subestruturas mais internas sejam processadas
antes da estrutura que as contenham. A qualquer instante uma pilha contm
uma seqncia de obrigaes adiadas, cuja ordem de remoo da pilha ga-
rante que as estruturas mais internas sero processadas antes das estruturas
mais externas.
Estruturas aninhadas ocorrem freqentemente na prtica. Um exemplo
simples a situao em que necessrio caminhar em um conjunto de dados
e guardar uma lista de coisas a fazer posteriormente (mais adi-ante veremos
uma situao semelhante a esta em um programa editor de textos). 0
controle de seqncias de chamadas de subprogramas e sintaxe de
expresses aritmticas so exemplos de estruturas aninhadas. As pilhas
ocorrem tambm em conexo com algoritmos recursivos e estruturas de
natureza recursiva, tais como as rvores.
48 CAPTULO 2. ESTRUTURAS DE DADOS BSICAS
2.2.1 I m p l e m e n t a o de P i l h a s A t r a v s de A r r a n j o s
Em uma implementao atravs de arranjos os itens da pilha so armaze-
nados em posies contguas de memria, conforme ilustra a Figura 2.5.
Devido s caractersticas da pilha as operaes de insero e de retirada de
itens devem ser implementadas de forma diferente das implementaes usa-
das anteriormente para listas. Como as inseres e as retiradas ocorrem no
topo da pilha, um cursor chamado topo utilizado para controlar a posio
do item no topo da pilha.
2.3 Filas
Uma fila uma lista linear em que todas as inseres so realizadas em um
extremo da lista, e todas as retiradas e geralmente os acessos so realizados
no outro extremo da lista. 0 modelo intuitivo de uma fila o de uma fila de
espera em que as pessoas no incio da fila so servidas primeiro e as pessoas
que chegam entram no fim da fila. Por esta razo as filas so chamadas de
listas fifo, termo formado a partir de "first-in", "first-out". Existe uma ordem
linear para filas que a "ordem de chegada". Filas so utilizadas quando
desejamos processar itens de acordo com a ordem "primeiro-quechega,
primeiro-atendido". Sistemas operacionais utilizam filas para regular a ordem
na qual tarefas devem receber processamento e recursos devem ser alocados a
processos.
Um possvel conjunto de operaes, definido sobre um tipo abstrato de
dados Fila, definido a seguir.
4. Vazia(Fila). Esta funo retorna true se a fila est vazia; seno retorna
false.
56 CAPTULO 6. ESTRUTURAS DE DADOS BSICAS
Notas Bibliogrficas
Knuth (1968) apresenta um bom tratamento sobre listas lineares. Outras
referncias relevantes sobre estruturas de dados bsicas so Aho, Hoperoft e
Ullman (1983), Cormem, Leiserson e Rivest (1990) e Sedgewick (1988).
Exerccios
1) Considere a implementao de listas lineares utilizando apontadores e
com clula-cabea. Considere que um dos campos do TipoItem uma
Chave: TipoChave. Escreva uma funo em Pascal
function EstaNaLista (Ch: TipoChave; var L: TipoLista): boolean;
que retorna true se Ch estiver na lista e retorna false se Ch no estiver
na lista. Considere que no h ocorrncias de chaves repetidas na lista.
Determine a complexidade do seu algoritmo.
EXERCCIOS 59
Cada coluna da matriz ser representada por uma lista linear circular-
Listas!circulares com uma clula cabea. Da mesma maneira, cada
linha da matriz tambm ser representada por uma lista linear circular
com uma clula cabea. Cada clula da estrutura, alm das clulas-
cabea, representar os termos diferentes de zero da matriz e devem
ter o seguinte tipo:
62 CAPTULO 2. ESTRUTURAS DE DADOS BSICAS
4, 4
1, 1, 50.0
2, 1, 10.0
2, 3, 20.0
4, 1, -30.0
4, 3, -60.0
4, 4, 5.0
b) procedure ApagaMatriz (var A: Matriz);
Este procedimento devolve todas as clulas da matriz A para a
rea de memria disponvel (use a procedure dispose).
c) procedure SomaMatriz (var A, B, C: Matriz);
Este procedimento recebe como parmetros as matrizes A e B,
devolvendo em C a soma de A com B.
d) procedure MultiplicaMatriz (var A, B, C: Matriz);
Este procedimento recebe como parmetros as matrizes A e B,
devolvendo em C o produto de A por B.
e) procedure ImprimeMatriz (var A: Matriz);
Este procedimento imprime (uma linha da matriz por linha da
sada) a matriz A, inclusive os elementos iguais a zero.
Para inserir e retirar clulas das listas que formam a matriz, crie pro-
cedimentos especiais para este fim. Por exemplo, um procedimento
program TestaMatrizesEsparsas;
...
...
begin
...
LeMatriz (A); ImprimeMatriz (A);
LeMatriz (B); ImprimeMatriz (B);
SomaMatriz (A, B, C); ImprimeMatriz (C); ApagaMatriz (C);
MultiplicaMatriz (A, B, C); ImprimeMatriz (C);
ApagaMatriz (B); ApagaMatriz (C);
LeMatriz (B);
ImprimeMatriz (A); ImprimeMatriz (B);
SomaMatriz (A, B, C); ImprimeMatriz (C);
MultiplicaMatriz (A, B, C); ImprimeMatriz (C);
MultiplicaMatriz (B, B, C);
ImprimeMatriz (B); ImprimeMatriz (B); ImprimeMatriz (C);
ApagaMatriz (A); ApagaMatriz (B); ApagaMatriz (C);
...
end. { TestaMatrizesEsparsas }
7) Alterao do ET
Alterar a especificao do programa ET, apresentado na seo 2.2.2,
para aceitar o comando cancela palavra, cujo efeito cancelar a palavra
anterior na linha que est sendo editada. Por exemplo, se `$' o
CancelaPalavra, ento a seqncia de caracteres NO CANCELA$$
CANCELA LINHA$ PALAVRA corresponde seqncia CANCELA
PALAVRA.
Altere o programa de acordo com a nova especificao proposta. Para
testar o programa utilize o texto da pgina 53, com as seguintes al-
teraes:
9) Se voc tem que escolher entre uma representao por lista encadeada
ou uma representao usando posies contguas de memria para um
vetor, quais informaes so necessrias para voc selecionar uma
representao apropriada? Como estes fatores influenciam a escolha da
representao?
66 CAPTULO 2. ESTRUTURAS DE DADOS BSICAS
Ordenao
69
70 CAPITULO 20. ORDENAO
1 2 3 4 5 6
Chaves iniciais: O R D E N A
i= 2 A R D E N O
i=3 A D R E N O
i=4 A D E R N O
i=5 A D E N R O
i=6 A D E N O R
Figura 3.1: Exemplo de ordenao por seleo
3.1.2 O r d e n a o por I n s e r o
Este o mtodo preferido dos jogadores de cartas. Em cada passo, a partir
de i=2, o i-simo item da seqncia fonte apanhado e transferido para a
seqncia destino, sendo inserido no seu lugar apropriado. O mtodo
74 CAPTULO 3. ORDENAO
3.1.3 Shellsort
Shell (1959) props uma extenso do algoritmo de ordenao por insero. O
mtodo da insero troca itens adjacentes quando est procurando o ponto
de insero na seqncia destino. Se o menor item estiver na posio mais a
direita no vetor ento o nmero de comparaes e movimentaes igual a
n 1 para encontrar o seu ponto de insero.
O mtodo de Shell contorna este problema permitindo trocas de registros
que esto distantes um do outro. Os itens que esto separados h posies so
rearranjados de tal forma que todo h-simo item leva a uma seqncia
ordenada. Tal seqncia dita estar h-ordenada. A Figura 3.3 mostra como
um arquivo de seis itens ordenado usando os incrementos 4, 2, e 1 para h.
A seqncia para h corresponde a 1, 4, 13, 40, 121, 364, 1093, 3280, .... O
Programa 3.5 mostra a implementao do algoritmo, para a seqncia
mostrada acima. Observe que no foram utilizados registros sentinelas
porque teramos que utilizar h sentinelas, uma para cada h-ordenaes.
Anlise
A razo pela qual este mtodo eficiente ainda no conhecida, porque
ningum ainda foi capaz de analisar o algoritmo. A sua anlise contm al-
3.1. ORDENAO INTERNA 77
3.1.4 Quicksort
Quicksort o algoritmo de ordenao interna mais rpido que se conhece
para uma ampla variedade de situaes, sendo provavelmente mais utilizado
do que qualquer outro algoritmo. O algoritmo foi inventado por C. A. R.
Hoare em 1960, quando visitava a Universidade de Moscou como estudante.
O algoritmo foi publicado mais tarde por Hoare (1962), aps uma srie de
refinamentos.
A idia bsica a de partir o problema de ordenar um conjunto com
n itens em dois problemas menores. A seguir, os problemas menores so
ordenados independentemente e depois os resultados so combinados para
produzir a soluo do problema maior.
A parte mais delicada deste mtodo relativa ao procedimento partio,
o qual tem que rearranjar o vetor A[Esq..Dir] atravs da escolha arbitrria
de um item x do vetor chamado piv, de tal forma que ao final o vetor A est
particionado em uma parte esquerda com chaves menores ou iguais a x
e uma parte direita com chaves maiores ou iguais a x.
Este comportamento pode ser descrito pelo seguinte algoritmo:
3.29. ORDENAO INTERNA 79
80 CAPITULO 30. ORDENAO
Anlise
Uma caracterstica interessante do Quicksort a sua ineficincia para ar-
quivos j ordenados quando a escolha do piv inadequada. Por exemplo, a
escolha sistemtica dos extremos de um arquivo j ordenado leva ao seu pior
caso. Neste caso, as parties sero extremamente desiguais, e o pro-
cedimento Ordena ser chamado recursivamente n vezes, eliminando apenas
um item em cada chamada. Esta situao desastrosa pois o nmero de
comparaes passa a cerca de n2/2, e o tamanho da pilha necessria para as
chamadas recursivas cerca de n. Entretanto, o pior caso pode ser evitado
atravs de pequenas modificaes no programa, conforme veremos mais
adiante.
3.31. ORDENAO INTERNA 81
C(n) = 2C(n/2) + n
3.1.5 Heapsort
Heapsort um mtodo de ordenao cujo princpio de funcionamento o
mesmo princpio utilizado para a ordenao por seleo, a saber: selecione o
menor item do vetor e a seguir troque-o com o item que est na primeira
posio do vetor; repita estas duas operaes com os n 1 itens restantes,
depois com os n 2 itens, e assim sucessivamente.
0 custo para encontrar o menor (ou o maior) item entre n itens custa n
1 comparaes. Este custo pode ser reduzido atravs da utilizao de uma
estrutura de dados chamada fila de prioridades. Devido a enorme
importncia das filas de prioridades para muitas aplicaes (inclusive or-
denao), a prxima seo ser dedicada ao seu estudo.
Filas de Prioridades
4. Substitui o maior item por um novo item, a no ser que o novo item
seja maior.
5. Altera a prioridade de um item.
6. Remove um item qualquer.
n] tal que
' Uma rvore binria completa uma rvore binria com os nodos numerados de 1 a n, onde o nodo Lk/2
j o pai do nodo k, para 1 < k < n. Em outras palavras, em uma rvore binria completa os nodos externos
aparecem em dois nveis adjacentes e os nodos no nvel mais baixo esto posicionados mais esquerda.
84 CAPITULO 3. ORDENAO
Anlise
P r o g r a m a 3 . 9 : P r o c ed i m en to H ea p s o r t
3.1 . 6 C o m p a r a o Ent re o s Mt o d o s
A ordenao interna utilizada quando todos os registros do arquivo ca-bem
na memria principal. Neste captulo apresentamos cinco mtodos de
ordenao interna atravs de comparao de chaves. Foram estudados dois
mtodos simples (Seleo e Insero) que requerem 0(n2) comparaes e trs
mtodos eficientes (Shellsort, Quicksort e Heapsort) que requerem 0(n log n)
comparaes (apesar de no se conhecer analiticamente o comportamento do
Shellsort, ele considerado um mtodo eficiente).
As Tabelas 3.1, 3.2 e 3.3 apresentam quadros comparativos do tempo
total real para ordenar arranjos com 500, 5.000, 10.000 e 30.000 registros na
ordem aleatria, na ordem ascendente e na ordem descendente, respectiva-
mente. Em cada tabela, o mtodo que levou menos tempo real para executar
recebeu o valor 1 e os outros receberam valores relativos a ele. Assim, na
Tabela 3.1, o Shellsort levou o dobro do tempo do Quicksort para ordenar
30.000 registros.
88 CAPTULO 38. ORDENAO
arquivos grandes o mtodo cerca de apenas duas vezes mais lento do que o
Quicksort. Sua implementao simples e fcil de colocar funcionando
corretamente e geralmente resulta em um programa pequeno. Ele no possui
um pior caso ruim e quando encontra um arquivo parcialmente ordenado
trabalha menos.
O Quicksort o algoritmo mais eficiente que existe para uma grande
variedade de situaes. Entretanto, um mtodo bastante frgil no sentido
de que qualquer erro de implementao pode ser difcil de ser detectado. O
algoritmo recursivo, o que demanda uma pequena quantidade de memria
adicional. Alm disso, seu desempenho da ordem de O ( n 2) operaes no
pior caso.
Uma vez que se consiga uma implementao robusta, o Quicksort deve
ser o mtodo a ser utilizado. 0 principal cuidado a ser tomado com relao
escolha do piv. A escolha do elemento do meio do arranjo melhora muito o
desempenho quando o arquivo est total ou parcialmente ordenado, e o pior
caso nestas condies tem uma probabilidade muito remota de ocorrer
quando os elementos forem aleatrios. A melhor soluo para tornar o pior
caso mais improvvel ainda escolher ao acaso uma pequena amostra do
arranjo e usar a mediana da amostra como piv na partio. Geralmente se
usa a mediana de uma amostra de trs elementos. Alm de tornar o pior
caso muito mais improvvel esta soluo melhora o caso mdio ligeiramente.
Outra importante melhoria para o desempenho do Quicksort evitar
chamadas recursivas para pequenos subarquivos, atravs da chamada de um
mtodo de ordenao simples, como o mtodo da Insero. Para tal, basta
colocar um teste no incio do procedimento recursivo Ordena do Pro-grama
3.7 para verificar o tamanho do subarquivo a ser ordenado: para arquivos
com menos do que 25 elementos o algoritmo da Insero deve ser chamado (
a implementao do algoritmo da Insero deve ser alterada para aceitar
parmetros indicando os limites do subarquivo a ser ordenado). A melhoria
no desempenho significativa, podendo chegar a 20% para a maio-ria das
aplicaes (Sedgewick, 1988).
O Heapsort um mtodo de ordenao elegante e eficiente. Apesar de
possuir um anel interno relativamente complexo, que o torna cerca de duas
vezes mais lento do que o Quicksort, ele no necessita nenhuma memria
adicional. Alm disso, ele executa sempre em tempo proporcional a n log n,
qualquer que seja a ordem inicial dos elementos do arquivo de entrada.
Aplicaes que no podem tolerar eventuais variaes no tempo esperado de
execuo devem usar o Heapsort.
Finalmente, quando os registros do arquivo A[1], A[2], ..., A[n] so muito
grandes desejvel que o mtodo de ordenao realize apenas n movimentos
dos registros, atravs do uso de uma ordenao indireta. Isto pode ser
realizado atravs da utilizao de um arranjo P[1], P[2], ..., P[n] de aponta-
dores, um apontador para cada registro: os registros somente so acessados
3.41. ORDENAO EXTERNA 91
Por esta razo, apenas mtodos gerais sero apresentados nesta seo,
ao invs de apresentarmos refinamentos de algoritmos at o nvel de
um programa Pascal executvel.
3.2.1 I n t e r c a l a o B a l a n c e a d a de Vrios C a m i n h o s
3.2.3 C o n s i d e r a e s P r t i c a s
Para implementar o mtodo de ordenao externa descrito anteriormente
muito importante implementar de forma eficiente as operaes de entrada
sada de dados. Estas operaes compreendem a transferncia dos dados
entre a memria interna e as unidades externas onde esto armazenadas os
registros a serem ordenados. Deve-se procurar realizar a leitura, a escrita o
processamento interno dos dados de forma simultnea. Os computa-dores
de maior porte possuem uma ou mais unidades independentes para
processamento de entrada e sada que permitem realizar simultaneamente
as operaes de entrada, sada e processamento interno.
Knuth (1973) discute vrias tcnicas para obter superposio de entrada
sada com processamento interno. Uma tcnica comum a de utilizar 2 f
reas de entrada e 2 f reas de sada. Para cada unidade de entrada ou sada
so mantidas duas reas de armazenamento: uma para uso do processador
central e outra para uso do processador de entrada ou sada. Para entrada, o
processador central usa uma das duas reas enquanto a unidade de entrada
est preenchendo a outra rea. No momento que o processador central
termina a leitura de uma rea, ele espera que a unidade de entrada acabe de
preencher a outra rea e ento passa a ler dela, enquanto a unidade de
entrada passa a preencher a outra. Para sada, a mesma tcnica utilizada.
Existem dois problemas relacionados com a tcnica de utilizao de duas
reas de. armazenamento. Primeiro, apenas metade da memria disponvel
utilizada, o que pode levar a uma ineficincia se o nmero de reas for grande,
como no caso de uma intercalao-de- f -caminhos para f grande. Segundo,
98 CAPTULO 48. ORDENAO
Notas Bibliogrficas
Exerccios
1) Dado que existe necessidade de ordenar arquivos de tamanhos diversos,
podendo tambm variar o tamanho dos registros de um arquivo para
outro, apresente uma discusso sobre quais algoritmos de ordenao
voc escolheria diante das diversas situaes colocadas acima.
Que observaes adicionais voc apresentaria caso haja
a) restries de estabilidade ou
b) de intolerncia para o pior caso (isto , a aplicao exige um
algoritmo eficiente mas no permite que o mesmo eventualmente
leve muito tempo para executar).
2) Invente um vetor-exemplo de entrada para demonstrar que Ordenao
por Seleo um mtodo instvel. Mostre os passos da execuo do
algoritmo at que a estabilidade violada. Note que quanto menor for o
vetor que voc inventar, mais rpido voc vai resolver a questo.
3) Considere uma matriz retangular. Ordene em ordem crescente os ele-
mentos de cada linha. A seguir ordene em ordem crescente os elementos
de cada coluna. Prove que os elementos de cada linha continuam em
ordem.
100 CAPTULO 3. ORDENAO
7) Quicksort
Algumas sugestes:
11) Suponha que voc tenha que ordenar vrios arquivos de 100, 5.000 e
2 0 . 0 0 0 nmeros inteiros. Para todos os trs tamanhos de arquivos
necessrio realizar a ordenao no menor tempo possvel.
Pesquisa em Memria
Primria
107
108 CAPTULO 8. PESQUISA EM MEMRIA PRIMRIA
Anlise
Para uma pesquisa com sucesso, conforme mostrado no final da Seo 1.3,
temos
C'(n)=n+1.
Anlise
A cada iterao do algoritmo, o tamanho da tabela dividido ao meio. Logo,
o nmero de vezes que o tamanho da' tabela dividido ao meio cerca de log
n. Entretanto, o custo para manter a tabela ordenada alto: a cada insero na
posio p da tabela implica no deslocamento dos registros a partir da posio p
para as posies seguintes. Conseqentemente, a pesquisa binria no deve ser
usada em aplicaes muito dinmicas.
Anlise
possveis em n+1 intervalos. Uma insero em A considerada randmica se ela tem probabilidade igual de
acontecer em qualquer um dos n + 1 intervalos. Uma rvore de pesquisa randmica com n chaves uma
rvore construda atravs de n inseres randmicas sucessivas em uma rvore inicialmente vazia
2 Em uma rvore completamente balanceada os nodos externos aparecem em no mximo dois nveis
adjacentes.
118 CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA
Figura 4.3 e obter a rvore direita na mesma figura necessrio movimentar todos os nodos
da rvore original.
r v o r e s SBB
entre a raiz e cada um dos nodos internos da rvore. Por exemplo, o comprimento do caminho
interno da rvore esquerda na Figura 4.3 8 = (0 + 1 + 1 + 2 + 2 + 2).
4.3. RVORES DE PESQUISA 119
cujo nome foi abreviado para rvores SBB (Symmetric Binary B-trees) por
Bayer (1972). A Figura 4.5 apresenta uma rvore SBB.
Uma rvore SBB pode tambm ser vista como uma representao binria
da rvore 2-3-4 apresentada por Guibas e Sedgewick (1978) e mostrada em
detalhes em Sedgewick (1988), na qual "supernodos" podem conter at trs
chaves e quatro filhos. Por exemplo, tal "supernodo", com chaves 3, 5 e 9,
pode ser visto na rvore SBB da Figura 4.5.
Transformaes para Manuteno da Propriedade SBB
Anlise
Para as rvores SBB necessrio distinguir dois tipos de alturas. Uma de-
las a altura vertical h, necessria para manter a altura uniforme e obtida
atravs da contagem do nmero de apontadores verticais em qualquer cami-
nho entre a raiz e um nodo externo. A outra a altura k, que representa o
nmero mximo de comparaes de chaves obtida atravs da contagem do
nmero total de apontadores no maior caminho entre a raiz e um nodo ex-
4.4. PESQUISA DIGITAL 127
Trie
Uma trie uma rvore M-ria cujos nodos so vetores de M componentes
com campos correspondentes ao dgitos ou caracteres que formam as chaves.
Cada nodo no nvel i representa o conjunto de todas as chaves que comeam
com a mesma seqncia de i dgitos ou caracteres. Este nodo especifica uma
ramificao com M caminhos dependendo do (i + 1)-simo dgito ou
caractere de uma chave. Considerando as chaves como seqncia de bits (isto
, M = 2), o algoritmo de pesquisa digital semelhante ao de pesquisa em
rvore, exceto que, ao invs de se caminhar na rvore de acordo com o
resultado de comparao entre chaves, caminha-se de acordo com os bits de
chave. A Figura 4.9 mostra uma trie construda a partir das seguintes chaves
de 6 bits:
B = 010010
C = 010011
H = 011000
J = 100001
Q = 101000
Para construir .uma trie, faz-se uma pesquisa na rvore com a chave a ser
inserida. Se o nodo externo em que a pesquisa teminar for vazio, cria-se um
novo nodo externo nesse ponto contendo a nova chave, como ilustra a
insero da chave W = 110110 na Figura 4.10. Se o nodo externo contiver
uma chave, cria-se um ou mais nodos internos cujos descendentes contero a
chave j existente e a nova chave. A Figura 4.10 ilustra a insero da chave
K = 100010 que envolve repor J por um novo nodo interno cuja subrvore
esquerda outro novo nodo interno cujos filhos so J e K, porque estas
chaves possuem os mesmos bits at a quinta posio.
O formato das tries, diferentemente das rvores binrias comuns, no
depende da ordem em que as chaves so inseridas e sim da estrutura das
chaves atravs da distribuio de seus bits. Uma grande desvantagem das
4 Uma chave semi-infinita uma seqncia de caracteres em que somente a sua extre-
midade inicial definida. Logo, cada posio no texto representa uma chave semi-infinita,
constituda pela seqncia que inicia naquela posio e se estende direita tanto quanto for
necessrio ou at o final do texto. Por exemplo, um banco de dados constitudo de n palavras (
as posies de interesse nesse caso so os endereos de incio das palavras) possui n chaves
semi-infinitas.
4.4. PESQUISA DIGITAL 129
Patricia
PATRICIA a abreviatura de Practical Algorithm To Retrieve Information
Coded In Alphanumeric (Algoritmo Prtico para Recuperar Informao
Codificada em Alfanumrico). Este algoritmo foi originalmente criado por
Morrison (1968) num trabalho de casamento de cadeias, aplicado recu-
perao de informao em arquivos de grande porte. Knuth (1973) deu um
novo tratamento ao algoritmo, reapresentando-o de frma mais clara como
um caso particular de pesquisa digital, essencialmente, um caso de rvore trio
binria. Sedgewick(1988) apresentou novos algoritmos de pesquisa e de in-
sero baseados nos algoritmos propostos por Knuth. Gonnet e Baeza-Yates
(1991) propuzeram tambm outros algoritmos.
130 CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA
P r o g r a m a 4 . 2 0 : I n i c i a l i z a o d a r v o r e
lado, vamos supor uma tabela capaz de armazenar M = 97 chaves, onde cada
chave pode ser um nmero decimal de 4 dgitos. Neste caso existem N =
10000 chaves possveis, e a funo de transformao no pode ser um para
um: mesmo que o nmero de registros a serem armazenados seja muito
menor do que 97, qualquer que seja a funo de transformao, algumas
colises iro ocorrer fatalmente, e tais colises tm que ser resolvidas de
alguma forma.
Mesmo que se obtenha uma 'funo de transformao que distribua os
registros de forma uniforme entre as entradas da tabela, existe uma alta
probabilidade de haver colises. 0 paradoxo do aniversrio (Feller, 1968,
p. 33), diz que em um grupo de 23 ou mais pessoas, juntas ao acaso, existe
uma chance maior do que 50% de que 2 pessoas comemorem aniversrio no
mesmo dia. Isto significa que, se for utilizada uma funo de transformao
uniforme que enderece 23 chaves randmicas em uma tabela de tamanho
365, a probabilidade de que haja colises maior do que 50%.
4.5.1 Funes de T r a n s f o r m a o
Uma funo de transformao deve mapear chaves em inteiros dentro do
intervalo [0..M 1 ] , onde M o tamanho da tabela. A funo de trans-
formao ideal aquela que: (i) seja simples de ser computada; (ii) para cada
chave de entrada, qualquer uma das sadas possveis igualmente provvel
de ocorrer.
Considerando que as transformaes sobre as chaves so aritmticas, o
primeiro passo transformar as chaves no numricas em nmeros. No caso
do Pascal, basta utilizar a funo ord que recebe um argumento de um tipo
escalar qualquer e retorna o nmero ordinal dentro do tipo (por exemplo, ord
(t r u e) 1 desde que o tipo boolean definido como (false, t r u e) ) .
Vrias funes de transformao tm sido estudadas (Knott, 1975; Knuth,
1973). Um dos mtodos que funciona muito bem usa o resto da diviso por M
5:
h(K) = K mod M
Anlise
C(n)
0.10 1.06
0.25 1.17
0.50 1.50
0.75 2.50
0.90 5.50
0.95 10.50
Tabela 4.1: Nmero de comparaes em uma pesquisa com sucesso para hashing linear
Notas Bibliogrficas
As principais referncias para pesquisa em memria interna so Gonnet e
Baeza-Yates (1991), Knuth (1973), e Mehlhorn (1984). Outros livros in-
cluem Standish (1980), Wirth (1976), Wirth (1986), Aho, Hoperoft e Ullman (
1983), Terada (1991). Um estudo mais avanado sobre estruturas de dados e
algoritmos pode ser encontrado em Tarjan (1983).
Um dos primeiros estudos sobre insero e retirada em rvores de pes-
quisa foi realizado por Hibbard (1962), tendo provado que o comprimento
mdio do caminho interno aps n inseres randnicas 21n n. A definio
de rvore binria foi extrada de Knuth (1968, p.315).
A primeira rvore binria de pesquisa com balanceamento foi proposta
por Adel'son-Vel'skii e Landis (1962), dois matemticos russos, a qual rece-
beu o nome de rvore AVL. Uma rvore binria de pesquisa uma rvore
AVL se a altura da subrvore esquerda de cada nodo nunca difere de l da
altura da subrvore direita. A Figura 4.16 apresenta uma rvore com esta
propriedade.
Exerccios
1) Considere as tcnicas de pesquisa seqencial, pesquisa binria e a pes-
quisa baseada em hashing.
c) Voc conhece algum algoritmo que seja timo para resolver o pro-
blema?
5) Arvores Binrias
Suponha que voc tenha uma rvore binria na qual esto armazenadas
uma chave em cada nodo. Suponha tambm que a rvore foi construda
de tal maneira que, ao caminhar nela na ordem central, as chaves so
visitadas em ordem crescente.
a) Qual propriedade entre as chaves deve ser satisfeita para que isso
seja possvel?
b) Dada uma chave k, descreva sucintamente um algoritmo que pro-
cure por k em uma rvore com essa estrutura.
c) Qual a complexidade do seu algoritmo no melhor caso e no pior
caso? Justifique.
6) rvore SBB
7) rvore SBB
Um novo conjunto de transformaes para a rvore SBB foi proposto
por Olivi (1980). 0 algoritmo de insero usando as novas trans-
formaes produz rvores SBB com menor altura e demanda um n-
mero menor de transformaes de diviso de nodos para construir a
rvore, conforme comprovado em Ziviani e Tompa (1982) e Ziviani,
Olivi e Gonnet (1985). A Figura 4.17 mostra as novas transformaes. 0
operao divide esquerda-esquerda requer modificao de trs apon-
tadores, a operao divide esquerda-direita requer a alterao de cinco
146 CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA
Bayer (1972), Olivi (1980) e tambm Wirth (1976) usaram dois bits
por nodo em suas implementaes para indicarem se os apontadores
direita e esquerda so horizontais ou verticais. Entretanto, apenas um
bit necessrio: a informao indicando se o apontador direita (
esquerda) horizontal ou vertical pode ser armazenada no filho
direita (esquerda). Alm do fato de demandar menos espao em cada
nodo, o retorno ao longo do caminho de pesquisa para procurar por dois
apontadores horizontais pode ser terminado mais edo, porque a
informao sobre o tipo de apontador que leva a um nodo disponvel
sem a necessidade de retornar at seu pai.
Implemente as novas transformaes mostradas na Figura 4.17. Utilize
apenas 1 bit por nodo para manter a informao sobre a inclinao dos
apontadores.
11) Hashing
Substitua XXXXXXXXXXXX pelas 12 primeiras letras do seu nome,
desprezando brancos e letras repetidas, nas duas partes desta questo.
Para quem no tiver doze letras diferentes no nome, completar com as
letras PQRSTUVWXYZ, nesta ordem, at completar 12 letras. Por
exemplo, eu deveria escolher
NIVOZAPQRSTU
and 4 5 6
be 3
by 2 6 7
easy 3 4
human-engineered 5
programming 1 7
programs 3
to 3 4
Pesquisa em Memria
Secundria
155
156 CAPTULO 6. PESQUISA EM MEMRIA SECUNDRIA
f(e)=f(p,b)=p/+b
onde o endereo de programa e (nmero da pgina p e nmero do byte b)
pode ser visto na Figura 5.1.
A Tabela_de_Pginas pode ser um arranjo do tamanho do nmero de
pginas possveis. Quando acontecer do programa enderear um nmero de
pgina que no esteja na memria principal, a entrada correspondente na
Tabela_de_Pginas estar vazia (p/ = nil) e a pgina correspondente ter que
ser trazida da memria secundria para a memria primria, atualizando a
Tabela_de_Pginas.
Se no existir uma Moldura_de_Pgina vazia no momento de trazer uma
nova pgina do disco ento alguma outra pgina tem que ser removida da
memria principal para abrir espao para a nova pgina. O ideal remover a
pgina que no ser referenciada pelo perodo de tempo mais longo no
futuro. Entretanto, no h meios de se prever o futuro. O que normalmente
MODELO DE COMPUTAO PARA MEM. SECUNDRIA 159
I m p l e m e n t a o de um S i s t e m a de P a g i n a o
de alterao no seu contedo ela dever ser gravada de volta na memria se-
cundria pelo processo P5. 0 processo P4 l da memria secundria a pgina
solicitada, coloca-a na moldura determinada pelo processo P3 e atualiza a
Tabela_de_Pginas.
pares de valores < x, p > deve ser criado, onde x representa uma chave e p
representa o endereo da pgina na qual o primeiro registro contm a chave
x.
A Figura 5.4 mostra um exemplo da estrutura de um arquivo seqencial
indexado para um conjunto de 15 registros. No exemplo, cada pgina tem
capacidade para armazenar 4 registros do arquivo de dados e cada entrada do
ndice de pginas armazena a chave do primeiro registro de cada pgina e o
endereo da pgina no disco. Por exemplo, o ndice relativo primeira
pgina informa que ela contm registros com chaves entre 3 e 14 exclusive, o
ndice relativo a segunda pgina informa que ela contm registros com chaves
entre 14 e 25 exclusive, e assim por diante.
de cada cilindro mantido na memria principal. Por sua vez, cada cilindro
contm um ndice de blocos ou ndice de pginas, conforme mostrado na
Figura 5.4. Para localizar o registro que contenha uma chave de pesquisa so
necessrios os seguintes passos:
grande rea comum para ser utilizada quando alguma rea de algum cilindro
tambm transborde. Assim, em ambientes realmente dinmicos, os tempos
de acesso se deterioram rapidamente. Entretanto, em ambientes onde apenas
a leitura de dados necessria, como no caso dos discos ticos de apenas-
leitura, o mtodo de acesso indexado seqencial bastante eficiente e
adequado, conforme veremos na seo seguinte.
Discos t i c o s de A p e n a s - L e i t u r a
5.3.1 rvores B
O objetivo desta seo o de apresentar uma tcnica de organizao e manu
teno de arquivos atravs do uso de rvores B (Bayer e McCreight, 1972). A
origem do nome rvores B nunca foi explicada pelos autores, R. Bayer e E.
McCreight, cujo trabalho foi desenvolvido no Boeing Scientific Research
Labs. Alguns autores sugerem que o "B" se refere a "Boeing", enquanto
Comer (1979) acha apropriado pensar em "B-trees" como "Bayer-trees", por
causa das contribuies de R. Bayer ao assunto. Outras introdues ao
assunto podem ser encontradas em Comer (1979), Wirth (1976), e Knuth (
1973).
Definio e A l g o r i t m o s
Quando uma rvore de pesquisa possui mais de um registro por nodo ela
deixa de ser binria. Estas rvores so chamadas n-rias, pelo fato de
possurem mais de dois descendentes por nodo. Nestes casos os nodos so
mais comumente chamados de pginas.
A rvore B n-ria. Em uma rvore B de ordem m temos que:
Uma rvore B de ordem m = 2 com 3 nveis pode ser vista na Figura 5.8.
Todas as pginas contm 2, 3, ou 4 registros, exceto a raiz que pode conter um
registro apenas. Os registros aparecem em ordem crescente da esquerda para
a direita. Este esquema representa uma extenso natural da organizao da
rvore binria de pesquisa. A Figura 5.9 apresenta a forma geral de uma
pgina de uma rvore B de ordem m.
F i g u r a 5 . 1 0 : Insero em u m a r v o r e B d e o r d em 2
RegRetorno para ser inserido na prxima pgina que contenha espao para
acomod-lo. Se Cresceu = t r u e no momento do retorno do procedimento Ins
para o procedimento Insere significa que a pgina raiz foi dividida e ento uma
nova pgina raiz deve ser criada para acomodar o registro emergente,
fazendo com que a rvore cresca na altura.
p r o c e d u r e Insere (Reg: Registro; var Ap: Apontador);
(c) obtida aps a insero das chaves 55, 3, 11, 4, 28, 36, 33, 52, 17, 25 e
13 na rvore da parte (b) e, finalmente, a rvore da parte (d) obtida aps a
insero das chaves 45, 9, 43, 8 e 48.
5.3.2 r v o r e s B*
Existem vrias alternativas para implementao da rvore B original. Uma
delas a rvore B*. Em uma rvore B*, todos os registros so armazenados
no ltimo nvel (pginas folhas). Os nveis acima do ltimo nvel constituem
um ndice cuja organizao a organizao de uma rvore B.
A Figura 5.14 mostra a separao lgica entre o ndice e os registros que
constituem o arquivo propriamente dito. No ndice s aparecem as chaves,
sem nenhuma informao associada, enquanto nas pginas folha esto todos
os registros do arquivo. As pginas folha so conectadas da esquerda para a
direita, o que permite um acesso seqencial mais eficiente do que o acesso
atravs do ndice. Alm do acesso seqencial mais eficiente, as rvores B*
apresentam outras vantagens sobre as rvores B, como a de facilitar o acesso
concorrente ao arquivo, conforme veremos adiante.
no negativo que pode ser modificado somente pelas operaes wait e signal,
assim descritas: wait (s): when s > 0 do s := s 1; e signal (s): s := s + 1. A
operao s := s + 1 indivisvel, isto , somente um processo consegue
realiz-la de cada vez. Por exemplo, se dois processos A e B querem realizar
signal (s) ao mesmo tempo para s = 3, ao final s = 5. Se a operao s := s + l
no indivisvel e as duas operaes atribuem o resultado 4 a s, o resultado
final pode ser 4 (e no 5). Outra referncia sobre semforos, bem como sua
aplicao para sincronizar processos concorrentes, pode ser encontrada em
Lister (1975).
5.3.4 Consideraes P r a t i c a s
A rvore B simples, de fcil manuteno, eficiente e verstil. A rvore B
permite acesso seqencial eficiente, e o custo para recuperar, inserir, e
retirar registros do arquivo logartmico. O espao utilizado pelos dados ,
no mnimo, 50% do espao reservado para o arquivo. Oespao utilizado
varia com a aquisio e liberao da rea utilizada, medida em que o
arquivo cresce ou diminui de tamanho. As rvores B crescem e diminuem
automaticamente, e nunca existe necessidade de uma reorganizao completa
do banco de dados. O emprego de rvores B em ambientes onde o acesso
concorrente ao banco de dados necessrio vivel e relativamente simples
de ser implementado.
Um bom exemplo de utilizao prtica de rvores B* o mtodo de
acesso a arquivos da IBM, chamado VSAM (Keehn e Lacy, 1974; Wagner,
1973). VSAM um mtodo de acesso a arquivos de aplicao geral que
permite tanto o acesso seqencial eficiente, bem como as operaes de in-
sero, retirada e recuperao em tempo logartmico. Comparado com a
organizao indexado seqencial, o mtodo VSAM oferece as vantagens da
alocao dinmica de memria, garantia de utilizao de no mnimo 50% da
memria reservada ao arquivo, e nenhuma necessidade de reorganizao
peridica de todo o arquivo. O VSAM considerado uma evoluo do antigo
ISAM, o qual utiliza o mtodo indexado seqencial (vicie Seo 5.2).
Anlise
Pelo que foi visto acima, as operaes de insero e retirada de registros em
uma rvore B sempre deixam a rvore balanceada. Alm do mais, o caminho
mais longo em uma rvore B de ordem m com N registros contm no mximo
cerca de log,m+1N pginas. De fato, Bayer e McCreight (1972) provaram que
os limites para a altura mxima e altura mnima de uma rvore B de ordem
m contendo N registros so
contados das pginas folha em direo pgina raiz 'de uma rvore 2-3 (ou
rvore B de ordem m = 1) obtido por Eisenbarth, Ziviani, Gonnet, Mehlhorn
e Wood (1982, p. 159), eles propuseram a seguinte conjetura: a altura
esperada de uma rvore 2-3 randmica (vide definio de rvore de pesquisa
randmica na Seo 4.3) com N chaves
Observaes Finais
Notas Bibliogrficas
Exerccios
Observaes:
Programas C do Captulo 1
197
198 PROGRAMAS EM C DO CAPTULO 1
PROGRAMAS EM C DO CAPTULO 1 199
200 PROGRAMAS EM C DO CAPTULO 1
PROGRAMAS EM C DO CAPTULO 1 201
Apndice B
Programas C do Captulo 2
203
204 PROGRAMAS EM C DO CAPTULO 2
PROGRAMAS EM C DO CAPTULO 2 205
206 PROGRAMAS EM C DO CAPTULO 2
PROGRAMAS EM C DO CAPTULO 2 207
208 PROGRAMAS EM C DO CAPTULO 2
PROGRAMAS EM C DO CAPTULO 2 209
210 PROGRAMAS EM C DO CAPTULO 2
PROGRAMAS EM C DO CAPTULO 2 211
212 PROGRAMAS EM C DO CAPTULO 2
PROGRAMAS EM C DO CAPTULO 2 213
214 PROGRAMAS EM C DO CAPTULO 2
PROGRAMAS EM C DO CAPTULO 2 215
Apndice C
Programas C do Captulo 3
217
218 PROGRAMAS EM C DO CAPTULO 3
PROGRAMAS EM C DO CAPTULO 3 219
220 PROGRAMAS EM C DO CAPTULO 3
PROGRAMAS EM C DO CAPTULO 3 221
Apndice D
Programas C do Captulo 4
223
224 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 225
226 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 227
228 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 229
230 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 231
232 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 233
234 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 235
236 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4. 237
238 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 239
240 PROGRAMAS EM C DO CAPTULO 4
PROGRAMAS EM C DO CAPTULO 4 241
Apndice E
Programas C do Captulo 5
243
244 PROGRAMAS EM C DO CAPTULO 5
PROGRAMAS EM C DO CAPTULO 5 245
246 PROGRAMAS EM C DO CAPTULO 5
PROGRAMAS EM C DO CAPTULO 5 247
248 PROGRAMAS EM C DO CAPTULO 5
PROGRAMAS EM C DO CAPTULO 5 249
250 PROGRAMAS EM C DO CAPTULO 5
PROGRAMAS EM C DO CAPTULO 5 251
Apndice F
Caracteres ASCII
253
Apndice G
Referncias Bibliogrficas
Adel'son-Vel'skii, G.M. e Landis, E.M. (1962) "An Algorithm for the Or-
ganization of Information", Doklady Akademia Nauk USSR 146 (2),
263-266, Traduo para o Ingls em Soviet Math. Doklay 3, 1962,
1259-1263.
Aho, A.V., Hoperoft J.E. e Ullman J.D. (1974) The Design and Analysis of
Computer Algorithms. Addison-Wesley, Reading, Mass.
Aho, A.V., Hoperoft, J.E. e Ullman, J.D. (1983) Data Structures and Al-
gorithms. Addison-Wesley, Reading, Mass.
Albuquerque, L.C.A. e Ziviani, N. (1985) "Estudo Emprico de uma Nova
Implementao para o Algoritmo de Construo da Arvore Patricia".
V Congresso da Sociedade Brasileira de Computao, Porto Alegre,
RGS, 254-267.
rabe, J.N.C. (1992) Comunicao Pessoal, Belo Horizonte, MG.
255
256 REFERNCIAS BIBLIOGRFICAS
Eisenbarth, B., Ziviani, N., Gonnet, G.H., Mehlhorn, K. e Wood, D. (1982) "
The Theory of Fringe Analysis and Its Application to 2-3 Trees and B-
Trees", Information and Control 55 (1-3), 125-174.
Greene, D.H. e Knuth, D.E. (1982) Mathematics for the Analysis of Algo-
rithms. Birkhanser, Boston, Mass.
Knuth, D.E. (1976) "Big Omicron and Big Omega and Big Theta". ACM
SIGACT News 8 (2), 18-24.
Knuth, D.E. (1981) The Art of Computer Programming, Vol. 2: Seminu-
merical Algoritms. Segunda edio, Addison-Wesley, Reading, Mass.
258 REFERNCIAS BIBLIOGRFICAS
Tarjan, R.E. (1983) Data Structures and Network Algorithms. SIAM, Phi-
ladelphia, Pennsylvania.
Ziviani, N., Olivi, H. e Gonnet, G.H. (1985) "The Analysis of the Improved
Symmetric Binary B-Tree Algorithm". The Computer Journal 28 (4),
417-425.
260 REFERNCIAS BIBLIOGRFICAS
261
NDICE
262
Standish T.A., 143 Wirth N., 2, 25, 30, 99, 115, 143,
Suffix array, 154 144, 147, 170, 192 Wood D., 190
Tanenbaum A.S., 157
Ziviani N., vii, 127, 131, 144, 145,
Tarjan R.E., 30, 143, 144
167, 168, 190
Tempo
complexidade de, 5
de busca
em discos ticos, 166
em discos magnticos, 164 de
execuo, .3-24
Terada R., 143
Teto, funo (1'1), 8
Tipos abstratos de dados, 2-3, 35, 42,
44, 47, 48, 53, 55, 82, 107,
108
Tompa F.W., 127, 144, 145
Transbordamento, vide overflow
Transformao de chave, 135-143
duplo, 148
funes de, 136-137
listas encadeadas, 137-138
open addressing, 140-143 Trie,
128-129
Trilha
em disco tico, 166
em disco magntico, 164