Escolar Documentos
Profissional Documentos
Cultura Documentos
(Ebook) Projetos de Algoritmos Com Implementações em Pascal e C (Nivio Ziviani, 4ed) PDF
(Ebook) Projetos de Algoritmos Com Implementações em Pascal e C (Nivio Ziviani, 4ed) PDF
implementaes
Bibliografia.
ISBN 85-221-
98-5286
CDD-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
Capa do
Riccardo Fanucchi
Copyright 1999
Todos os direitos reservados por
ENIO MATHEUS GUAllELLI & CIA. LTDA.
02515-050 Praa Dirceu de Lima, 313
Telefone: (011) 858-3199 Fax: (011) 858-0443 So Paulo SP
e-mail: pioneira@editorapioneira.com.br
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 refinamentos sucessivos at o nvel de uma implementao na linguagem Pascal, o
que permite que qualquer pessoa com um mnimo de experincia em programao possa ler o cdigo.
Contedo
O livro apresenta as principais tcnicas utilizadas para a implementao de
estruturas de dados bsicas e de algoritmos para ordenao e pesquisa em
memria primria e memria secundria. Os tpicos esto agrupados em
cinco captulos, cada um com o seguinte contedo: (i) conceito de algoritmo,
estrutura de dados e tipo abstrato de dados, tcnicas de anlise de desempenho de algoritmos, linguagem Pascal; (ii) estruturas de dados bsicas: listas
lineares, pilhas e filas; (iii) mtodos de ordenao em memria primria: por
insero, por seleo, shellsort, quicksort e heapsort, e em memria secundria: intercalao balanceada; (iv) mtodos de pesquisa em memria
primria: pesquisa seqencial, pesquisa binria, rvores de pesquisa e hashing; (v) mtodos de pesquisa em memria secundria: seqencial indexado
e rvores B.
O estudo do comportamento dos algoritmos tem um papel decisivo no
projeto de algoritmos eficientes. Por isso, so apresentadas informaes sobre as caractersticas de desempenho de cada algoritmo apresentado. Entretanto, a parte matemtica utilizada para apresentar os resultados analticos
Agradecimentos
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 Pereira de Lucena e Routo Terada por lembrarem do meu nome para participar
da I Escola Brasileiro-Argentina de Informtica, o que motivou o desenvolvimento da semente deste texto. Gostaria de agradecer a Cilio Rosa Ziviani,
Cleber Hostalcio de Melo, Jos Monteiro da Mata, Lilia Tavares Mascarenhas, 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. Agradeo a todos pela ajuda e pelas crticas construtivas. O Departamento de
Cincia da Computao da Universidade Federal de Minas Gerais tem proporcionado um excelente ambiente de trabalho. Os meus alunos de extenso,
graduao, especializao e ps-graduao, especialmente os alunos das disciplinas 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 Carvalho, 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, desenvolvido 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
Lista de Figuras
xiii
Lista de Tabelas
xv
Lista de Programas
xvii
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
2 Estruturas de Dados Bsicas
35
2.1 Listas Lineares ....................................................................................... 35
2.1.1 Implementao de Listas Atravs de Arranjos ........................ 37
2.1.2 Implementao de Listas Atravs de Apontadores ................. 38
2.2 Pilhas .......................................................................................................47
2.2.1 Implementao de Pilhas Atravs de Arranjos ........................48
2.2.2 Implementao de Pilhas Atravs de Apontadores ................. 49
2.3 Filas .........................................................................................................55
2.3.1 Implementao de Filas Atravs de Arranjos .......................... 56
2.3.2 Implementao de Filas Atravs de Apontadores ................... 58
Notas Bibliogrficas .................................................................................... 58
Exerccios ..................................................................................................... 58
SUMRIO
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
4 Pesquisa em Memria Primria
107
4.1 Pesquisa Seqencial ........................................................................... 108
4.2 Pesquisa Binria ................................................................................. 110
4.3 Arvores de Pesquisa ........................................................................... 111
4.3.1 Arvores Binrias de Pesquisa Sem Balanceamento .............. 112
4.3.2 Arvores Binrias de Pesquisa Com Balanceamento ............. 117
4.4 Pesquisa Digital ................................................................................... 127
4.5 Transformao de Chave (Hashing) ................................................... 135
4.5.1 Funes de Transformao ..................................................... 136
4.5.2 Listas Encadeadas ................................................................... 137
4.5.3 Open Addressing ..................................................................... 140
Notas Bibliogrficas ................................................................................. 143
Exerccios .................................................................................................. 144
5 Pesquisa em Memria Secundria
155
5.1 Modelo de Computao para Memria Secundria .......................... 157
5.2 Acesso Seqencial Indexado .............................................................. 163
5.3 Arvores de Pesquisa ............................................................................ 169
5.3.1 Arvores B ................................................................................. 170
5.3.2 rvores B* ............................................................................... 182
5.3.3 Acesso Concorrente em Arvores B* ...................................... 184
5.3.4 Consideraes Prticas ........................................................... 189
Notas Bibliogrficas .................................................................................. 192
Exerccios ................................................................................................... 193
A Programas C do Captulo 1
197
B Programas C do Captulo 2
203
SUMRIO
C
Programas C do Captulo 3
217
Programas C do Captulo 4
223
Programas C do Captulo 5
243
Caracteres ASCII
253
Referncias Bibliogrficas
255
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
3.14 Conjunto ordenado na primeira passada .............................................. 96
3.15 Intercalao usando seleo por substituio .......................................97
4.1 Exemplo de pesquisa binria para a chave G ......................................... 111
4.2 rvore binria de pesquisa ..................................................................... 113
4.3 Arvore binria de pesquisa completamente balanceada .........................118
4.4 Uma rvore 2-3 e a rvore B binria correspondente ............................ 119
4.5 Arvore SBB ............................................................................................ 119
4.6 Transformaes propostas por Bayer (1972) ........................................120
4.7 Crescimento de uma rvore SBB ........................................................... 123
4.8 Decomposio de uma rvore SBB ........................................................127
4.9 Trie binria ............................................................................................. 129
4.10 Insero das chaves W e K ...................................................................129
4.11 Arvore Patricia ......................................................................................130
4.12 Insero da chave K ............................................................................. 130
4.13 Insero da chave W .............................................................................131
4.14 Lista encadeada em separado ............................................................... 137
4.15 Open addressing ................................................................................140
4.16 Arvore AVL ..........................................................................................143
4.17 Transformaes propostas por Olivi (1980) .......................................146
4.18 Pat array .............................................................................................. 154
5.1 Mapeamento de endereos para paginao ............................................ 159
5.2 Fila de Molduras_de_Pginas .................................................................160
5.3 Endereamento no sistema de paginao ............................................... 163
5.4 Estrutura de um arquivo seqencial indexado ........................................164
5.5 Disco magntico ..................................................................................... 165
5.6 Organizao de um arquivo indexado seqencial para o CD,
ROM ................................................................................................... 168
5.7 Arvore binria dividida em pginas ....................................................... 169
5.8 Arvore B de ordem 2 com 3 nveis .........................................................171
5.9 Nodo de uma rvore B de ordem m com 2m registros ........................... 171
5.10 Insero em uma rvore B de ordem 2 .................................................173
5.11 Crescimento de uma rvore B de ordem 2 ........................................... 177
5.12 Retirada da chave 3 na rvore B de ordem m = 1 ................................ 178
5.13 Decomposio de uma rvore B de ordem 2 ........................................181
5.14 Estrutura de uma rvore B* ..................................................................182
5.15 Exemplo de uma rvore B* .................................................................. 184
5.16 Retirada de registros em rvores B* .................................................... 185
5.17 Parte de uma rvore B* ........................................................................ 188
Lista de Tabelas
1.1 Comparao dos algoritmos para obter o mximo e o mnimo.......... 10
1.2 Comparao de vrias funes de complexidade ................................ 16
1.3 Influncia do aumento de velocidade dos computadores no
tamanho t do problema ..........................................................................17
3.1 Ordem aleatria dos registros ............................................................... 88
3.2 Ordem ascendente dos registros ........................................................... 88
3.3 Ordem descendente dos registros ......................................................... 88
3.4 Influncia da ordem inicial ................................................................... 89
4.1 Nmero de comparaes em uma pesquisa com sucesso para hashing
linear .................................................................................................... 141
5.1 Nmero de acessos a disco, no pior caso, para tamanhos variados de pginas e arquivos usando rvore B .................................. 190
Lista de Programas
1.1
1.2
1.3
1.4
1.5
1.6
1.7
1.8
LISTA DE PROGRAMAS
3.4 Ordenao por insero ........................................................................ 75
3.5 Algoritmo Shellsort .............................................................................. 77
3.6 Procedimento Partio .......................................................................... 79
3.7 Procedimento Quicksort ..........................................................................80
3.8 Procedimento para construir o heap ....................................................... 85
3.9 Procedimento Heapsort ........................................................................... 87
4.1 Estrutura do tipo dicionrio implementado como arranjo .................109
4.2 Implementao das operaes usando arranjo ................................... 109
4.3 Pesquisa binria ..................................................................................... 111
4.4 Estrutura do dicionrio para rvores sem balanceamento ................. 113
4.5 Procedimento para pesquisar na rvore .............................................. 114
4.6 Procedimento para inserir na rvore ....................................................114
4.7 Procedimento para inicializar ...............................................................114
4.8 Programa para criar a rvore ................................................................ 115
4.9 Procedimento para retirar x da rvore ................................................. 116
4.10 Caminhamento central ........................................................................ 117
4.11 Estrutura do dicionrio para rvores SBB ........................................ 120
4.12 Procedimentos auxiliares para rvores SBB .....................................121
4.13 Procedimento para inserir na rvore SBB ........................................ 123
4.14 Procedimento para inicializar a rvore SBB ......................................................... '123
4.15 Procedimento para retirar da rvore SBB ......................................... 126
4.16 Estrutura de dados ............................................................................... 131
4.17 Funes auxiliares ............................................................................... 132
4.18 Procedimento CrieNodos .................................................................... 133
4.19 Algoritmo de pesquisa ........................................................................ 133
4.20 Inicializao da rvore ........................................................................ 133
4.21 Algoritmo de insero ......................................................................... 134
4.22 Implementao de funo de transformao .................................... 137
4.23 Estrutura do dicionrio para listas encadeadas ................................ 138
4.24 Operaes do Dicionrio usando listas encadeadas .........................139
4.25 Estrutura do dicionrio usando open addressing ........................... 141
4.26 Operaes do dicionrio usando open addressing ......................... 142
5.1 Estrutura de dados para o sistema de paginao ................................ 161
5.2 Diferentes tipos de pginas para o sistema de paginao .
162
5.3 Estrutura do dicionrio para rvore B ................................................. 172
5.4 Procedimento para inicializar uma rvore B ................................
.....................................172
5.5 Procedimento para pesquisar na rvore B ........................................
..173
5.6 Primeiro refinamento do algoritmo Insere na rvore B ................... 174
5.7 Procedimento Insere Na Pgina ..........................................................175
5.8 Refinamento final do algoritmo Insere .............................................. 176
5:9 Procedimento Retira ............................................................................181
LISTA DE PROGRAMAS
LISTA DE PROGRAMAS
Captulo 1
Introduo
1.1 Algoritmos, Estruturas de Dados e Programas
Os algoritmos fazem parte do dia-a-dia das pessoas. As instrues para o uso
de medicamentos, as indicaes de como montar um aparelho qualquer, uma
receita de culinria so alguns exemplos de algoritmos. Um algoritmo pode
ser visto como uma seqncia de aes executveis para a obteno de uma
soluo para um determinado tipo de problema. Segundo Dijkstra (1971) um
algoritmo corresponde a uma descrio de um padro de comportamento,
expresso em termos de um conjunto finito de aes. Ao executarmos a
operao a + b percebemos um mesmo padro de comportamento, mesmo
que a operao seja realizada para valores diferentes de a e b.
Estruturas de dados e algoritmos esto intimamente ligados. No se
pode estudar estruturas de dados sem considerar os algoritmos associados a
elas, assim como a escolha dos algoritmos em geral depende da representao e da estrutura dos dados. Para resolver um problema necessrio
escolher uma abstrao da realidade, em geral atravs da definio de um
conjunto de dados que representa a situao real. A seguir deve ser escolhida
a forma de representar estes dados.
A escolha da representao dos dados determinada, entre outras, pelas
operaes a serem realizadas sobre os dados. Considere a operao de adio.
Para pequenos nmeros uma boa representao atravs de barras
verticais, caso em que a operao de adio bastante simples. J a
representao atravs de dgitos decimais requer regras relativamente complicadas, as quais devem ser memorizadas. Entretanto, a situao se inverte
quando consideramos a adio de grandes nmeros, sendo mais fcil a representao por dgitos decimais por causa do princpio baseado no peso relativo
da posio de cada dgito.
CAPTULO 1. INTRODUO
CAPTULO 4. INTRODUO
CAPTULO 1. INTRODUO
CAPTULO 1. I N T R O D U O
10
CAPTULO 1. INTRODUO
A Tabela 1.1 apresenta uma comparao entre os algoritmos dos Programas 1.2, 1.3 e 1.4,. considerando o nmero de comparaes como medida de
complexidade. Os algoritmos MaxMin2 e MaxMin3 so superiores ao
algoritmo MaxMinl de forma geral. O algoritmo MaxMin3 superior ao
algoritmo MaxMin2 com relao ao pior caso e bastante prximo quanto ao
caso mdio.
Os Trs
Algoritmos
Tabela 1.1:
f (n)
MaxMin1
MaxMin2
Melhor caso
2(n-1)
n1
Pior caso
2(n-1)
2(n-1)
Caso mdio
2(n-1)
3n/2-3/2
MaxMin3
3n/2-2
3n/2-2
3n/2-2
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.
12
CAPITULO 1. INTRODUO
14
CAPTULO 1. INTRODUO
16
CAPITULO 1. INTRODUO
apenas para resolver pequenos problemas. Quando n cem, o nmero de
operaes da ordem de 1 milho. Sempre que n dobra o tempo de execuo
fica multiplicado por 8.
Computador
atual
Computador
100 vezes
mais rpido
Computador
1000 vezes
mais rpido
n
n2
n3
2n
tl
t2
t3
t4
100t 1
10t 2
4,6t 3
t 4+ 6 , 6
1000t 1
31, 6t 2
10t 3
t4+10
18
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.
19
20
CAPTULO 1. INTRODUO
1.4. T C N I C A S D E A N L I S E D E A L G O R I T M O S
21
22
CAPITULO 1. INTRODUO
23
24
CAPTULO 1. INTRODUO
1.5. PASCAL
25
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 totalidade, 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.
program
label
const
type
var
procedure ou function
begin
.
.
.
end
cabealho do programa
declarao de rtulo para goto
definio de constantes
definio de tipos de dados
declarao de variveis
declarao de subprogramas
comandos do programa
CAPTULO 1. INTRODUO
26
Se as variveis c, s, e d so declaradas
var c
cor;
var s
sexo;
var b
boolean;
:
:
:
1900..
=
1.5. PASCAL
27
:
:
:
:
(mas, ferm);
var p: pessoa;
valores particulares podem ser atribuidos como se segue
p.sobrenome
p.primeironome
p.aniversrio.dia
p.aniversrio.ms
p.sexo
:=
:=
:=
:=
:=
'Ziviani';
'Patricia';
21;
10;
fern;
28
CAPTULO 1. INTRODUO
1.5. PASCAL
29
O Programa 1.8 copia o contedo arquivo Velho no arquivo Novo. Observe que os nomes dos arquivos aparecem como parmetros do programa. E
importante observar que a atribuio de nomes de arquivos externos, ao
programa varia de compilador para compilador. Por exempla, no caso do
Turbo Pascal3 a atribuio do nome externo de um arquivo a uma varivel
interna ao programa realizada atravs do comando assign e no como
parmetros do programa.
Os tipos apontadores so teis para criar estruturas de dados encadeadas, do tipo listas, rvores, e grafos. Um apontador uma varivel que referencia uma outra varivel alocada dinamicamente. Em geral a varivel
referenciada definida como um registro que inclui tambm um apontador
para outro elemento do mesmo tipo.
Exemplo:
type Apontador = ^Nodo;
type Nodo = record
Chave : integer
Apont : Apontador;
end;
Dada uma varivel
3 Turbo
30
CAPTULO 1. INTRODUO
var Lista: Apontador;
Notas Bibliogrficas
Estudos bsicos sobre os conceitos de algoritmos, estruturas de dados e programas 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), Horowitz 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
Captulo 2
36
37
38
39
40
41
42
Chave
: 1..999;
NotaFinal : 0..10;
Opo
: array [1..3] of 1..7;
Programa 2.5: Campos do registro de um candidato
43
Figura 2.3. Aps a leitura do ltimo registro os candidatos esto automaticamente ordenados por NotaFinal. Dentro de cada lista os registros esto
ordenados por ordem de inscrio, desde que os registros sejam lidos na
ordem de inscrio de cada candidato e inseridos nesta ordem.
44
Neste momento ns somos forados a tomar decises sobre a implementao do tipo abstrato de dados Lista. Considerando-se que o tamanho
das listas varia de forma totalmente imprevisvel, a escolha deve cair
45
46
2.2. PILHAS
47
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 processamento 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 garante 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
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 armazenados 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 usadas 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.2. PILHAS
49
50
2.2. PILHAS
51
52
2.2. PILHAS
53
54
2.5. FILAS
55
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.
1. FFVazia(Fila). Faz a fila ficar vazia.
2. Enfileira(x, Fila). Insere o item x no final da fila.
3. Desenfileira(Fila, x). Retorna o item x no incio da fila, retirando-o da
fila.
4. Vazia(Fila). Esta funo retorna true se a fila est vazia; seno retorna
false.
56
2.7. FILAS
57
58
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
60
EXERCCIOS
61
Cada coluna da matriz ser representada por uma lista linear circularListas!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 clulascabea, representar os termos diferentes de zero da matriz e devem
ter o seguinte tipo:
62
EXERCCIOS
63
4
1,
1,
3,
1,
3,
4,
50.0
10.0
20.0
-30.0
-60.0
5.0
64
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 }
O que deve ser apresentado:
a) Listagem do programa em Pascal.
b) Listagem dos testes executados.
c) Descrio sucinta (por exemplo, desenho), das estruturas de da-dos
e as decises tomadas relativas aos casos e detalhes de especificao que porventura estejam omissos no enunciado.
d) Estudo da complexidade do tempo de execuo dos procedimentos
implementados e do programa como um todo (notao 0 ) .
obrigatrio o uso de alocao dinmica de memria para implementar
as listas de adjacncia que representam as matrizes. A anlise de
complexidade deve ser feita em funo de m, n (dimenses da matriz) e r
(nmero de elementos diferente de zero).
4) Considere F uma fila no vazia e P uma pilha vazia. Usando apenas a
varivel temporria x, e as quatro operaes
EXERCCIOS
65
66
EXERCCIOS
67
Captulo 3
Ordenao
Os algoritmos de ordenao constituem bons exemplos de como resolver
problemas utilizando computadores. As tcnicas de ordenao permitem
apresentar um conjunto amplo de algoritmos distintos para resolver uma
mesma tarefa. Dependendo da aplicao, cada algoritmo considerado possui
uma vantagem particular sobre os outros. Alm disso, os algoritmos ilustram
muitas regras bsicas para manipulao de estruturas de dados.
Ordenar corresponde ao processo de rearranjar um conjunto de objetos
em uma ordem ascendente ou descendente. O objetivo principal da
ordenao facilitar a recuperao posterior de itens do conjunto ordenado.
Imagine como seria difcil utilizar um catlogo telefnico se os nomes das
pessoas no estivessem listados em ordem alfabtica. A atividade de colocar
as coisas em ordem est presente na maioria das aplicaes onde os objetos
armazenados tm que ser pesquisados e recuperados, tais como dicionrios,
ndices de livros, tabelas e arquivos.
Antes de considerarmos os algoritmos propriamente ditos, necessrio
apresentar alguma notao. Os algoritmos trabalham sobre os registros de
um arquivo. Apenas uma parte do registro, chamada chave, utilizada para
controlar a ordenao. Alm da chave podem existir outros componentes em
um registro, os quais no tm influncia no processo de ordenar, a no ser
pelo fato de que permanecem com a mesma chave. A estrutura de dados
registro a indicada para representar os itens componentes de um arquivo,
conforme ilustra o Programa 3.1.
A escolha do tipo para a chave arbitrria. Qualquer tipo sobre o qual
exista uma regra de ordenao bem-definida pode ser utilizado. As ordens
numrica e alfabtica so as usuais.
Um mtodo de ordenao dito estvel se a ordem relativa dos itens com
chaves iguais mantm-se inalterada pelo processo de ordenao. Por
exemplo, se uma lista alfabtica de nomes de funcionrios de uma empresa
ordenada pelo campo salrio, ento um mtodo estvel produz uma lista
69
70
71
C A P T U L O 2 2 . ORDENAO
72
2
R
R
D
D
D
D
3
D
D
R
E
E
E
4
E
E
E
R
N
N
5
N
N
N
N
R
O
6
A
O
O
O
O
R
73
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
75
76
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-
77
78
CAPTULO 3. ORDENAO
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:
79
80
Anlise
Uma caracterstica interessante do Quicksort a sua ineficincia para arquivos 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 procedimento 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.
81
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 ordenao), a prxima seo ser dedicada ao seu estudo.
Filas de Prioridades
No estudo de listas lineares, no Captulo 2, vimos que a operao de desempilhar um item de uma pilha retira o ltimo item inserido (o mais novo), e a
operao de desenfileirar um item de uma fila retira o primeiro item inserido
82
83
84
CAPITULO 3. ORDENAO
85
86
CAPTULO 3. ORDENAO
Anlise
A primeira vista o algoritmo no parece eficiente, pois as chaves so movimentadas vrias vezes. Entretanto, o procedimento Refaz gasta cerca de
log n operaes, no pior caso. Logo, Heapsort gasta um tempo de execuo
proporcional a n log n no pior caso!
Heapsort no recomendado para arquivos com poucos registros, por
causa do tempo necessrio para construir o heap, bem como porque o anel
interno do algoritmo bastante complexo, se comparado com o anel interno
do Quicksort. De fato, Quicksort , em mdia, cerca de duas vezes mais
rpido que o Heapsort. Entretanto, Heapsort melhor que o Shellsort para
grandes arquivos. Um aspecto importante a favor do Heapsort que o seu
comportamento O(n log n), qualquer que seja a entrada. Aplicaes que
no podem tolerar eventualmente um caso desfavorvel devem usar o
Heapsort. Um aspecto negativo sobre o Heapsort que o mtodo no
estvel.
87
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, respectivamente. 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
Insero
Seleo
Shellsort
Quicksort
Heapsort
500
5000
10000
30000
11.3
16.2
1.2
1
1.5
87
124
1.6
1
1.6
161
228
1.7
1
1.6
2
1
1.6
Insero
Seleo
Shellsort
Quicksort
Heapsort
500
1
128
3.9
4.1
12.2
1 5000 110000
1
1
1524
3066
6.8
7.3
6.3
6.8
20.8
22.4
30000
1
8.1
7.1
24.6
Insero
Seleo
Shellsort
Quicksort
Heapsort
500
40.3
29.3
1.5
1
2.5
5000
305
221
1.5
1
2.7
10000
575
417
1.6
1
2.7
30000
1.6
1
2.9
89
5000
1
1.5
2.9
10000
1
1.6
3.1
Quicksort
30000
1
1.5
3.7
5000
1
1.1
1.9
10000
1
1.1
2.0
Heapsort
30000
1
1.1
2.0
5000
1.1
1
1.1
10000
1.1
1
1
30000
1.1
1
1
90
CAPTULO 3. 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 apontadores, um apontador para cada registro: os registros somente so acessados
91
92
CAPTULO 3. ORDENAO
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.
Para desenvolver um mtodo de ordenao externa eficiente o aspecto
sistema de computao deve ser considerado no mesmo nvel do aspecto algortmico. A grande nfase deve ser na minimizao do nmero de vezes que
cada item transferido entre a memria interna e a memria externa. Mais
ainda, cada transferncia deve ser realizada de forma to eficiente quanto as
caractersticas dos equipamentos disponveis permitam.
O mtodo de ordenao externa mais importante o mtodo de ordenao por intercalao. Intercalar significa combinar dois ou mais blocos
ordenados em um nico bloco ordenado atravs de selees repetidas entre
os itens disponveis em cada momento. A intercalao utilizada como uma
operao auxiliar no processo de ordenar.
A maioria dos mtodos de ordenao externa utilizam a seguinte estratgia geral:
1. realizada uma primeira passada sobre o arquivo, quebrando-o em
blocos do tamanho da memria interna disponvel. Cada bloco ento
ordenado na memria interna.
2. Os blocos ordenados so intercalados, fazendo vrias passadas sobre o
arquivo. A cada passada so criados blocos ordenados cada vez
maiores, at que todo o arquivo esteja ordenado.
Os algoritmos para ordenao externa devem procurar reduzir o nmero
de passadas sobre o arquivo. Como a maior parte do custo para as
operaes de entrada e sada de dados da memria interna, uma boa medida
de complexidade de um algoritmo de ordenao por intercalao o nmero
de vezes que um item lido ou escrito na memria auxiliar. Os bons mtodos
de ordenao geralmente envolvem no total menos do que 10 passadas sobre
o arquivo.
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
Vamos considerar o processo de ordenao externa quando o arquivo est armazenado em fita magntica. Para apresentar os vrios passos envolvidos
em um algoritmo de ordenao por intercalao balanceada vamos utilizar
um arquivo exemplo. Considere um arquivo armazenado em uma fita de
entrada, composto pelos registros com as chaves mostradas na Figura 3.10.
Os 2 2 registros devem ser ordenados de acordo com as chaves e colocados
em uma fita de sada. Neste caso os registros so lidos um aps o outro.
93
Na segunda etapa os blocos ordenados devem ser intercalados. 0 primeiro registro de cada uma das trs fitas lido para a memria interna,
ocupando toda a memria interna. A seguir o registro contendo a menor
chave dentre as trs retirado e o prximo registro da mesma fita lido para
a memria interna, repetindo-se o processo. Quando o terceiro registro de um
dos blocos lido aquela fita fica inativa at que o terceiro registro das outras
fitas tambm sejam lidos e escritos na fita de sada, formando um bloco de 9
registros ordenados. A seguir o segundo bloco de 3 registros de cada fita
lido para formar outro bloco ordenado de nove registros, o qual escrito em
uma outra fita. Ao final trs novos blocos ordenados so obtidos, conforme
mostra a Figura 3.12.
94
CAPTULO 3. ORDENAO
95
96
97
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
EXERCCIOS
99
Notas Bibliogrficas
Knuth (1973) a referncia mais completa que existe sobre ordenao em
geral. Outros livros interessantes sobre o assunto so Sedgewick (1988),
Wirth (1976), Cormem, Leiserson e Rivest (1990), Aho, Hoperoft e Ullman (
1983). 0 livro de Gonnet e Baeza-Yates (1991) apresenta uma relao
bibliogrfica extensa e atualizada sobre o assunto.
Shellsort foi proposto por Shell (1959). Quicksort foi proposto por Hoare (
1962). Um estudo analtico detalhado, bem como um estudo exaustivo dos
efeitos prticos de muitas modificaes e melhorias sugeridas para o
Quicksort pode ser encontrado em Sedgewick (1975) e Sedgewick (1978a).
Heapsort foi proposto por Williams (1964) e melhorado por Floyd (1964).
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 elementos 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
EXERCCIOS
101
102
CAPTULO 3. ORDENAO
EXERCCIOS
103
104
CAPTULO 3. ORDENAO
trs registros. Mostre todas as etapas para ordenar o arquivo
exemplo acima utilizando intercalao balanceada simples (sem
utilizar seleo por substituio).
b) Quantas passadas foram realizadas?
EXERCCIOS
105
10 6
CAPITULO 6. ORDENAO
Captulo 4
Pesquisa em Memria
Primria
Este captulo dedicado ao estudo de como recuperar informao a partir de
uma massa grande de informao previamente armazenada. A informao
dividida em registros, onde cada registro possui uma chave para ser usada
na pesquisa. 0 objetivo da pesquisa encontrar uma ou mais ocorrncias de
registros com chaves iguais chave de pesquisa. Neste caso ocorreu uma
pesquisa com sucesso; caso contrrio a pesquisa sem sucesso. Um
conjunto de registros chamado de tabela ou arquivo. Geralmente o termo
tabela associado a entidades de vida curta, criadas na memria interna
durante a execuo de um programa. J o termo arquivo geralmente
associado a entidades de vida mais longa, armazenadas em memria externa.
Entretanto, esta distino no precisa: um arquivo de ndices pode ser
tratado como uma tabela, enquanto uma tabela de valores de funes pode
ser tratada mais como um arquivo.
Existe uma variedade enorme de mtodos de pesquisa. A escolha do
mtodo de pesquisa mais adequado a uma determinada aplicao depende
principalmente: (i) da quantidade dos dados envolvidos, (ii) do arquivo estar
sujeito a inseres e retiradas freqentes, ou do contedo do arquivo ser praticamente estvel (neste caso importante minimizar o tempo de pesquisa,
sem preocupao com o tempo necessrio para estruturar o arquivo).
E importante considerar os algoritmos de pesquisa como tipos abstratos de dados, com um conjunto de operaes associado a uma estrutura de
dados, de tal forma que haja uma independncia de implementao para as
operaes. Algumas das operaes mais comuns incluem:
1. Inicializar a estrutura de dados.
2. Pesquisar um ou mais registros com determinada chave.
107
108
109
110
Anlise
Para uma pesquisa com sucesso, conforme mostrado no final da Seo 1.3,
temos
melhor caso : C(n) = 1
pior caso
: C(n) = n
caso mdio : C(n) = (n + 1 ) / 2
Para uma pesquisa sem sucesso temos
C'(n)=n+1.
Observe que o anel interno da funo Pesquisa, no Programa 4.2, extremamente simples: o ndice i decrementado e a chave de pesquisa
comparada com a chave que est no registro. Por esta razo, esta tcnica
usando sentinela conhecida por pesquisa seqencial rpida. Este algoritmo a melhor soluo para o problema de pesquisa em tabelas com 25
registros ou menos.
111
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.
112
4.3.1
rvores
Binrias
de
Pesquisa
Sem
Balanceamento
De acordo com Knuth (1968, p. 315), uma rvore binria formada a partir
de um conjunto finito de nodos, consistindo de um nodo chamado raiz mais 0
ou 2 subrvores binrias distintas. Em outras palavras, uma rvore binria
um conjunto de nodos onde cada nodo tem exatamente 0 ou 2 filhos;
quando um nodo tem 2 filhos, eles so Chamadas filhos esquerda e
direita do nodo.
Cada nodo contm apontadores para subrvores esquerda e direita. 0
nmero de subrvores de um . nodo chamado grau daquele nodo. Um nodo
de grau zero chamado de nodo externo ou folha (de agora em diante no
haver distino entre estes dois termos). Os outros nodos so chamados
nodos internos.
Uma rvore binria de pesquisa uma rvore binria em que todo nodo
interno contm um registro, e, para cada nodo, a seguinte propriedade
verdadeira: todos os registros com chaves menores esto na subrvore
esquerda e todos os registros com chaves maiores esto na subrvore direita.
O nvel do nodo raiz 0; se um nodo est no nvel i ento a raiz de suas
subrvores esto no nvel i + 1. A altura de um nodo o comprimento do
caminho mais longo deste nodo at um nodo folha. A altura de uma rvore
a altura do nodo raiz. A Figura 4.2 mostra uma rvore binria de pesquisa
de altura 4.
A estrutura de dados rvore binria de pesquisa ser utilizada para implementar o tipo abstrato de dados Dicionrio (lembre-se que o tipo abstrato
Dicionrio contm as operaes Inicializa, Pesquisa, Insere e Retira). A estrutura e a representao do Dicionrio apresentada no Programa 4.4.
Um procedimento Pesquisa para uma rvore binria de pesquisa bas tante simples, conforme ilustra a implementao do Programa 4.5. Para
encontrar um registro com uma chave x, primeiro compare-a com a chave
que est na raiz. Se menor, v para a subrvore esquerda; se x maior, v
para a subrvore direita. Repita o processo recursivamente, at que a chave
procurada seja encontrada ou ento um nodo folha atingido. Se a pesquisa
for com sucesso ento o contedo do registro retorna no prprio registro x.
113
114
Programa
4.8:
115
O Programa 4.9 mostra a implementao da operao Retira. 0 procedimento recursivo Antecessor somente ativado quando o nodo que contm o
registro a ser retirado possui dois descendentes. Esta soluo elegante
utilizada por Wirth(1976, p.211).
Aps construda a rvore pode ser necessrio percorrer todos os registros
que compem tabela ou arquivo. Existe mais de uma ordem de caminhamento em rvores, mas a mais til a chamada ordem de caminhamento
central. Assim como a estrutura da rvore, o caminhamento central melhor expresso em termos recursivos, a saber:
1. caminha na subrvore esquerda na ordem central;
2. visita a raiz;
3. caminha na subrvore direita na ordem central.
Uma caracterstica importante do caminhamento central que os nodos
so visitados em ordem lexicogrfica das chaves. Percorrer a rvore da Figura 4.2 usando caminhamento central recupera as chaves na ordem 1, 2, 3,
4, 5, 6 e 7. ' 0 procedimento. Central, mostrado no Programa 4.10, faz
exatamente isto. Observe que este procedimento representa um mtodo de
ordenao similar ao Quicksort, onde a chave na raiz faz o papel do item
que particiona o vetor.
116
117
Anlise
O nmero de comparaes em uma pesquisa com sucesso :
melhor caso : C(n) = 0(1) pior
caso : C(n) = 0(n) caso mdio :
C(n) = 0(log n)
O tempo de execuo dos algoritmos para rvores binrias de pesquisa
dependem muito do formato das rvores. Para obter o pior caso basta que as
chaves sejam inseridas em ordem crescente (ou decrescente). Neste caso a
rvore resultante uma lista linear, cujo nmero mdio de comparaes
(n + 1)/2.
Para uma rvore de pesquisa randmica 1 possvel mostrar que o
nmero esperado de comparaes para recuperar um registro qualquer
cerca de 1, 39 log n, apenas 39% pior que a rvore completamente balanceada
(vide seo seguinte).
118
Figura 4.3 e obter a rvore direita na mesma figura necessrio movimentar todos os nodos
da rvore original.
Uma forma de contornar este problema procurar uma soluo intermediria que possa manter a rvore "quase-balanceada", ao invs de tentar
manter a rvore completamente balanceada. 0 objetivo procurar obter bons
tempos de pesquisa, prximos do tempo timo da rvore completa-mente
balanceada, mas sem pagar muito para inserir ou retirar da rvore.
Existem inmeras heursticas baseadas no princpio acima. Gonnet e
Baeza-Yates (1991) apresentam algoritmos que utilizam vrios critrios de
balanceamento para rvores de pesquisa, tais como restries impostas na
diferena das alturas de subrvores de cada nodo da rvore, na reduo do
comprimento do caminho interno3 da rvore, ou que todos os nodos
externos apaream no mesmo nvel. Na seo seguinte vamos apresentar
uma rvore binria de pesquisa com balanceamento em que todos os nodos
externos aparecem no mesmo nvel.
r v o r e s SBB
As rvores B foram introduzidas por Bayer e McCreight (1972) como uma
estrutura para memria secundria, conforme mostrado em detalhes na
Seo 5.3.1. Um caso especial da rvore B, mais apropriada para memria
primria, a rvore 2-3, na qual cada nodo tem duas ou trs subrvores.
Bayer (1971) mostrou que as rvores 2-3 podem ser representadas por rvores
binrias, conforme mostrado na Figura 4.4.
Quando a rvore 2-3 vista como uma rvore B binria, existe uma
assimetria inerente no sentido de que os apontadores esquerda tm que ser
verticais (isto , apontam para um nodo no nvel abaixo), enquanto os
apontadores direita podem ser verticais ou horizontais. A eliminao da
assimetria nas rvores B binrias leva s rvores B binrias simtricas,
3 O comprimento do caminho interno corresponde soma dos comprimentos dos caminhos
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).
119
cujo nome foi abreviado para rvores SBB (Symmetric Binary B-trees) por
Bayer (1972). A Figura 4.5 apresenta uma rvore SBB.
120
121
122
O procedimento Insere tem uma interface idntica interface do procedimento Insere para rvores sem balanceamento, conforme pode ser visto
no Programa 4.13. Para que isso seja possvel o procedimento Insere simplesmente chama um outro procedimento interno de nome Ilnsere, cuja interface contm dois parmetros a mais que o procedimento Insere, a saber:
o parmetro IAp indica que a inclinao do apontador toma o valor horizontal sempre que um nodo elevado para o nvel seguinte durante uma
insero, e o parmetro Fim toma o valor t r u e quando a propriedade SBB
reestabelecida e nada mais necessrio fazer.
123
124
125
126
Anlise
Para as rvores SBB necessrio distinguir dois tipos de alturas. Uma delas a altura vertical h, necessria para manter a altura uniforme e obtida
atravs da contagem do nmero de apontadores verticais em qualquer caminho 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-
127
128
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 extremidade 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.
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 recuperao 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 insero baseados nos algoritmos propostos por Knuth. Gonnet e Baeza-Yates
(1991) propuzeram tambm outros algoritmos.
130
131
132
133
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
134
135
a partir do ltimo ndice consecutivo melhora consideravelmente o desempenho do algoritmo. Se todos forem iguais, a chave j se encontra
na rvore e o algoritmo termina, seno vai-se para o Passo 4.
3. Caso contrrio, ou seja, se a raiz da subrvore corrente for um nodo
interno, vai-se para a subrvore indicada pelo bit da chave k de ndice
dado pelo nodo corrente, de forma recursiva.
4. Depois so criados um nodo interno e um nodo externo: o primeiro
contendo o ndice i e o segundo, a chave k. A seguir, o nodo interno
ligado ao externo pelo apontador de subrvore esquerda ou direita,
dependendo se o bit de ndice i da chave k seja 0 ou 1, respectivamente.
5. 0 caminho de insero percorrido novamente de baixo para cima,
subindo com o par de nodos criados no Passo 4 at chegar a um nodo
interno cujo ndice seja menor que o ndice i determinado no Passo 2.
Este o ponto de insero e o par de nodos inserido.
136
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 transformao 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
onde K um inteiro correspondente chave. Este um mtodo muito
simples de ser implementado, conforme ilustra o Programa 4.22. 0 nico
cuidado a tomar na escolha do valor de M. Por exemplo, se M par, ento
h(K) par quando K par, e h(K) mpar quando K mpar. Resumindo, M
deve ser um nmero primo, mas no qualquer primo: 'devem ser evitados os
nmeros primos obtidos a partir de
137
138
Anlise
Assumindo que qualquer item do conjunto tem igual probabilidade de ser
endereado para qualquer entrada de T, ento o comprimento esperado de
cada lista encadeada N / M , onde N representa o nmero de registros na
tabela e M o tamanho da tabela.
Logo, as operaes Pesquisa, Insere e Retira custam 0 ( 1 + N / M ) operaes em mdia, onde a constante 1 representa o tempo para encontrar a
entrada na tabela e N / M o tempo para percorrer a lista. Para valores de M
prximos de N , o tempo se torna constante, isto , independente de N .
139
140
141
0.10
0.25
0.50
0.75
0.90
0.95
C(n)
1.06
1.17
1.50
2.50
5.50
10.50
Tabela 4.1: Nmero de comparaes em uma pesquisa com sucesso para hashing linear
142
143
Notas Bibliogrficas
As principais referncias para pesquisa em memria interna so Gonnet e
Baeza-Yates (1991), Knuth (1973), e Mehlhorn (1984). Outros livros incluem 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 pesquisa 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 recebeu 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.
A forma de manter a propriedade AVL atravs de transformaes localizadas no caminho de pesquisa. Como a altura das rvores AVL fica sempre
entre log2(n + 1) e 1.4404 log2(n + 2) 0.328 (Adel'son-Vel'skii e Landis,
1962), o custo para inserir ou retirar O(log n), que exatamente o custo
144
para percorrer o caminho de pesquisa. Wirth (1976, 1986) apresenta implementaes dos algoritmos de insero e de retirada para as rvores AVL.
O material utilizado na Seo 4.3.2 veio de Bayer (1971), Bayer (1972),
Olivi (1980), Ziviani e Tompa (1982) e Ziviani, Olivi e Gonnet (1985). Os
trabalhos de Bayer apresentam as rvores SBB, o de Olivi sugere uma
melhoria para o algoritmo de insero e o de Ziviani e Tompa apresentam implementaes para os algoritmos de insero e retirada. A rvore SBB pode
ser vista como uma representao binria da rvore 2-3-4, apresentada por
Guibas e Sedgewick (1978). Este mesmo trabalho mostra como adaptar
vrios algoritmos clssicos para rvores de pesquisa balanceadas dentro do
esquema rvores red-black.
Sleator e Tarjan (1983) apresentam vrios mtodos para manuteno de
rvores auto-ajustveis. A idia mover os nodos mais freqentemente
acessados em direo raiz aps cada acesso: embora cada operao isolada
possa ter custo mais alto, ao longo de um perodo maior o tempo mdio de
cada operao menor, isto , o custo amortizado diminui ao longo do
tempo. Em outras palavras, uma operao particular pode ser lenta, mas
qualquer seqncia de operaes rpida.
Exerccios
1) Considere as tcnicas de pesquisa seqencial, pesquisa binria e a pesquisa baseada em hashing.
a) Descreva as vantagens e desvantagens de cada uma das tcnicas
acima, colocando em que situaes voc usaria cada uma delas.
b) D a ordem do pior caso e do caso esperado de tempo de execuo
para cada mtodo.
c) Qual a eficincia de utilizao de memria (relao entre o
espao necessrio para dados e o espao total necessrio) para
cada mtodo?
EXERCCIOS
145
c) Voc conhece algum algoritmo que seja timo para resolver o problema?
3) Qual a principal propriedade de uma rvore binria de pesquisa?
4) rvore Binria de Pesquisa
a) Desenhe a rvore binria de pesquisa que resulta da insero sucessiva das chaves Q U E S T A O F C I L numa rvore inicialmente vazia.
b) Desenhe as rvores resultantes das retiradas dos elementos E e
depois U da rvore obtida no item anterior.
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 procure 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
a) Desenhe a rvore SBB que resulta da insero sucessiva das chaves
Q U E S T A O F C I L numa rvore inicialmente vazia.
b) Desenhe as rvores resultantes das retiradas dos elementos E e
depois U da rvore obtida no item anterior.
7) rvore SBB
Um novo conjunto de transformaes para a rvore SBB foi proposto
por Olivi (1980). 0 algoritmo de insero usando as novas transformaes produz rvores SBB com menor altura e demanda um nmero 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 apontadores, a operao divide esquerda-direita requer a alterao de cinco
146
EXERCCIOS
147
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.
8) Quais as caractersticas de uma boa funo hash?
9) Um dos mtodos utilizados para se organizar dados atravs de tabelas
hash.
a) Em que situaes a tabela hash deve ser utilizada?
b) Descreva dois mecanismos diferentes para resolver o problema de
colises de vrias chaves em uma mesma posio da tabela.
Quais so as vantagens e desvantagens de cada mecanismo?
10) Em uma tabela hash cam 100 entradas, as colises so resolvidas
usando listas encadeadas. Para reduzir o tempo de pesquisa, decidiu-se
que cada lista seria organizada como uma rvore binria de pesquisa. A
funo utilizada h(k) = k mod 100. Infelizmente, as chaves inseridas
seguem o padro k i = 50i, onde k i corresponde i-sima chave inserida.
a) Mostre a situao da tabela aps a insero de k i, com i = 1,2,.,
13. (Faa desenho.)
b) Depois que 1000 chaves so inseridas de acordo com o padro
acima, inicia-se a insero de chaves escolhidas de forma randmica (isto , no seguem o padro das chaves j inseridas). Assim
responda:
i) Qual a ordem do pior caso (isto , o maior nmero de comparaes) para inserir uma chave?
ii) Qual o nmero esperado de comparaes para inserir uma
chave? (Assuma que cada uma das 100 entradas da tabela
igualmente provvel de ser endereada pela funo h.)
148
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
A segunda letra I de NIVIO no entra porque ela j apareceu antes, e
assim por diante (Arabe, 1992).
a) Desenhe o contedo da tabela hash resultante da insero de registros com as chaves XXXXXXXXXXXX, nesta ordem, numa
tabela inicialmente vazia de tamanho 7 (sete), usando listas encadeadas. Use a funo hash h(k) = k mod 7 para a k-sima letra do
alfabeto.
b) Desenhe o contedo da tabela hash resultante da insero de registros com as chaves XXXXXXXXXXXX, nesta ordem, numa
tabela inicialmente vazia de tamanho 13 (treze), usando open addressing e hashing linear para resolver as colises. Use a funo
hash h(k) = k mod 13 para a k-sima letra do alfabeto.
12) Hashing Open addressing
a) Hashing Linear. Desenhe o contedo da tabela hash resultante da
insero de registros com as chaves Q U E S T A O F C I L, nesta
ordem, numa tabela inicialmente vazia de tamanho 13 (treze)
usando open addressing com hashing linear para a escolha de
localizaes alternativas. Use a funo hash h(k) = k mod 13
para a k-sima letra do alfabeto.
b) Hash Duplo. Desenhe o contedo da tabela hash resultante da
insero de registros com as chaves Q U E S T A O F C I L, nesta
ordem, numa tabela inicialmente vazia de tamanho 13 (treze)
usando open addressing com hash duplo. Use a funo hash h 1(k)
= k mod 13 para calcular o endereo primrio e j = 1 + (k mod
11) para resolver as colises, ou seja, para a escolha de
localizaes alternativas. Logo h i(k) = (h i _ 1(k) + j) mod 13, para
2 i M (Sedgewick, 1988).
13) Considere as seguintes estruturas de dados:
a) heap
EXERCCIOS
149
150
and
be
by
easy
human-engineered
programming
programs
to
4
3
2
3
5
1
3
3
5 6
6 7
4
7
4
EXERCCIOS
151
152
01001011
00011101
11101011
10100101
11011010
Maria
Joaquim
Lili
no
ningum
01100101
00101110
01010011
10011100
10110010
EXERCCIOS
153
154
Captulo 5
Pesquisa em Memria
Secundria
A pesquisa em memria secundria envolve arquivos contendo um nmero
de registros que maior do que o nmero que a memria interna pode
armazenar. Os algoritmos e as estruturas de dados para processamento em
memria secundria tm que levar em considerao os seguintes aspectos:
1. O custo para acessar um registro algumas ordens de grandeza maior
do que o custo de processamento na memria primria. Logo, a medida
de complexidade principal est relacionada com o custo para transferir
dados entre a memria principal e a memria secundria. A nfase deve
ser na minimizao do nmero de vezes que cada registro transferido
entre a memria interna e a memria externa. Por exemplo, o tempo
necessrio para a localizao e a leitura de um nmero inteiro em disco
magntico pode ser suficiente para obter a mdia aritmtica de algumas
poucas centenas de nmeros inteiros ou mesmo orden-los na memria
principal.
2. Em memrias secundrias apenas um registro pode ser acessado em um
dado momento, ao contrrio das memrias primrias que permitem o
acesso a qualquer registro de um arquivo a um custo uniforme. Os
registros armazenados em fita magntica somente podem ser acessados
de forma seqencial. Os registros armazenados em disco magntico ou
disco tico podem ser acessados diretamente, mas a um custo maior do
que o custo para acess-los seqencialmente. Os sistemas operacionais
levam esse aspecto em considerao e dividem o arquivo em blocos,
onde cada bloco constitudo de vrios registros. A operao bsica
sobre arquivos trazer um bloco da memria secundria para uma
rea de armazenamento na memria principal. Assim, a leitura de
155
156
157
158
159
160
161
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
A seguir vamos mostrar uma das formas possveis de se implementar um
sistema de paginao. A estrutura de dados apresentada no Programa 5.1.
O Programa apresenta tambm a estrutura de dados para representar uma
rvore binria de pesquisa, onde um apontador para um nodo da rvore
representado pelo par nmero_da_pgina (p) e posio_dentro_da_pgina (b).
Assumindo que a chave constituda por um inteiro de 2 bytes e o endereo
ocupa 2 bytes para p e 1 byte para b, o total ocupado por cada nodo da
rvore de 8 bytes. Como o tamanho da pgina de 512 bytes ento o
nmero de itens (nodos) por pgina 64.
Em algums casos pode ser necessrio manipular mais de um arquivo ao
mesmo tempo. Neste caso, uma pgina pode ser definida como no Programa 5.2, onde o usurio pode declarar at trs tipos diferentes de pginas.
Se o tipo PginaTipoA for declarado
162
163
de alterao no seu contedo ela dever ser gravada de volta na memria secundria 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.
5.2 Acesso Seqencial Indexado
O mtodo de acesso seqencial indexado utiliza o princpio da pesquisa
seqencial: a partir do primeiro, cada registro lido seqencialmente at
encontrar uma chave maior ou igual a chave de pesquisa. Para aumentar a
eficincia, evitando que todos os registros tenham que ser lidos seqencialmente do disco, duas providncias so necessrias: (i) o arquivo deve mantido
ordenado pelo campo chave do registro, (ii) um arquivo de n d i c e s contendo
164
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.
165
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:
1. Localize o cilindro correspondente chave de pesquisa no ndice de
cilindros;
2. Desloque o mecanismo de acesso at o cilindro correspondente;
3. Leia a pgina que contm o ndice de pginas daquele cilindro;
4. Leia a pgina de dados que contm o registro desejado.
Desta forma, o mtodo de acesso seqencial indexado possibilita tanto o
acesso seqencial quanto o acesso randmico. Entretanto, este mtodo
adequado apenas para aplicaes nas quais as operaes de insero e de
retirada ocorrem com baixa freqncia. Sua grande vantagem a garantia de
acesso aos dados com apenas um deslocamento do mecanismo de acesso do
disco magntico. Sua grande desvantagem a inflexibilidade: em um
ambiente muito dinmico, com muitas operaes de insero e retirada, os
dados tm que sofrer reorganizaes freqentes. Por exemplo, a adio de um
registro com a chave 6 provoca um rearranjo em todos os registros do
arquivo da Figura 5.4.
Para contornar este problema necessrio criar reas de armazenamento (ou reas de overflow) para receber estes registros adicionais at que a
prxima reorganizao de todo o arquivo seja realizada. Normalmente, uma
rea de armazenamento reservada em cada cilindro, alm de uma
166
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 apenasleitura, 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
Os discos ticos de apenas-leitura, conhecidos como CD-ROM (Compact
Disk Read Only Memory), tm sido largamente utilizados para distribuio
de grandes arquivos de dados. 0 interesse crescente sobre os discos CD-ROM
devido a sua capacidade de armazenamento (600 Megabytes) e baixo custo
para o usurio final. As principais diferenas entre o disco CD-ROM e o
disco magntico so:
1. o CD-ROM um meio de apenas-leitura e, portanto, a estrutura da
informao armazenada esttica;
2. a eficincia na recuperao dos dados afetada pela localizao dos
dados no disco e pela seqncia com que so acessados;
3. devido velocidade linear constante as trilhas possuem capacidade
varivel e o tempo de latncia rotacional varia de trilha para trilha.
Ao contrrio dos discos magnticos, a trilha no disco CD-ROM tem a
forma de uma espiral contnua, embora para efeito de estudo analtico cada
volta da espiral possa ser considerada como uma trilha. Ele possui cerca de
300.000 setores de tamanho fixo de 2 Kbytes, distribudos em aproximadamente 20.000 trilhas. Como a velocidade linear de leitura constante, o
tempo de latncia rotacional varia de cerca de 60 milissegundos para as
trilhas mais internas at 138 milissegundos para as trilhas mais externas. Por
outro lado, o nmero de setores por trilha aumenta de 9 para a trilha mais
interna at 20 para a trilha mais externa.
No CD-ROM o tempo de busca (seek time) para acesso a trilhas mais
distantes demanda mais tempo que no disco magntico devido necessidade
de deslocamento do mecanismo de acesso e mudanas na rotao do disco.
Entretanto, possvel acessar um conjunto de trilhas vizinhas sem nenhum
deslocamento do mecanismo de leitura. Esta caracterstica dos discos CDROM , denominada varredura esttica. Nos discos atuais a amplitude de
varredura esttica pode atingir at 60 trilhas ( 30 trilhas a partir da trilha
corrente). 0 acesso a trilhas dentro da amplitude da varredura esttica
consome 1 milissegundo por trilha adicional, sendo realizado por um pequeno
deslocamento angular do feixe de laser a partir da trilha corrente, chamada
167
168
169
170
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:
1. cada pgina contm no mnimo m registros (e m + 1 descendentes) e
171
172
localizao do intervalo onde a chave se encaixa obtida atravs de uma pesquisa seqencial. Entretanto, esta etapa pode ser realizada de forma mais
eficiente atravs do uso de pesquisa binria (vide Seo 4.2).
Vamos ver agora como inserir novos registros em uma rvore B. Em
primeiro lugar preciso localizar a pgina apropriada onde o novo registro
deve ser inserido. Se o registro a ser inserido encontra seu lugar em uma
pgina com menos de 2m registros, o processo de insero fica limitado quela
pgina. Entretanto, quando um registro precisa ser inserido em uma pgina j
cheia (com 2m registros), o processo de insero pode provocar a criao de
uma nova pgina. A Figura 5.10, parte (b), ilustra o que acontece quando o
registro contendo a chave 14 inserido na rvore da parte (a). 0 processo
composto pelas seguintes etapas:
1. O registro contendo a chave 14 no encontrado na rvore, e a pgina 3
(onde o registro contendo a chave 14 deve ser inserido) est cheia.
2. A pgina 3 dividida em 2 pginas, o que significa que uma nova pgina
4 criada.
3. Os 2m+1 registros (no caso so 5 registros) so distribudos igualmente
entre as pginas 3 e 4, e o registro do meio (no caso o registro contendo
a chave 20) movido para a pgina pai no nvel acima.
173
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
No esquema de insero apresentado acima, a pgina pai tem que acomodar um novo registro. Se a pgina pai tambm estiver cheia, ento o
mesmo processo de diviso tem que ser aplicado de novo. No pior caso, o
processo de diviso pode se propagar at a raiz da rvore e, neste caso, a
rvore aumenta sua altura de um nvel. E interessante observar que uma
rvore B somente aumenta sua altura atravs da diviso da raiz.
Um primeiro refinamento do procedimento Insere pode ser visto no Pro-.
grama 5.6. 0 procedimento contm um outro procedimento interno recursivo, de nome Ins, de estrutura semelhante ao Programa 5.5 acima. Quando
um apontador nulo encontrado, significa que o ponto de insero foi localizado. Neste momento o parmetro Cresceu passa a indicar este fato
informando que um registro vai ser passado para cima atravs do parmetro
174
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);
procedure Ins (Reg:Registro; Ap:Apontador; var Cresceu:Boolean;
var RegRetorno:Registro; var ApRetorno:Apontador);
175
176
177
(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.
178
179
180
181
182
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.
183
184
A operao de insero de um registro em uma rvore B* essencialmente igual insero de um registro em uma rvore B. A nica diferena
que quando uma folha dividida em duas, o algoritmo promove uma cpia
da chave que pertence ao registro do meio para a pgina pai no nvel anterior,
retendo o registro do meio na pgina folha da direita.
A operao de retirada em uma rvore B* relativamente mais simples
do que em uma rvore B. 0 registro a ser retirado reside sempre em uma
pgina folha, o que torna sua remoo simples, no havendo necessidade de
utilizao do procedimento para localizar a chave antecessora (vide
procedimento Antecessor do Programa 5.9). Desde que a pgina folha fique
pelo menos com metade dos registros, as pginas do ndice no precisam ser
modificadas, mesmo se uma cpia da chave que pertence ao registro a ser retirado esteja no ndice. A Figura 5.16 mostra a rvore B* resultante quando a
seguinte seqncia de chaves retirada da rvore B* da Figura 5.15: 5 19 22
60; 9. Observe que a retirada da chave 9 da rvore da Figura 5.16, parte (a),
provoca a reduo da rvore.
5.3.3 Acesso C o n c o r r e n t e em rvores B*
Em muitas aplicaes o acesso simultneo ao banco de dados por mais de um
usurio fator importante. Nestes casos, permitir acesso para apenas um
processo de cada vez pode criar um gargalo inaceitvel para o sistema de
banco de dados. Concorrncia ento introduzida para aumentar a utilizao e melhorar o tempo de resposta do sistema. Deste modo o uso de
rvores B* em tais sistemas deve permitir o processamento simultneo de
vrias solicitaes diferentes.
Entretanto, existe a necessidade de se criar mecanismos chamados protocolos para garantir a integridade tanto dos dados quanto da estrutura.
Considere a situao em que dois processos estejam simultaneamente acessando o banco de dados. Em um determinado momento, um dos processos
est percorrendo uma pgina para localizar o intervalo onde a chave de pesquisa se encaixa e seguir o apontador para a subrvore correspondente, enquanto o outro processo est inserindo um novo registro que provoca divises
185
186
187
Para exemplificar o funcionamento do modelo do protocolo para processos modificadores considere a modificao da pgina y da rvore B* apresentada na Figura 5.17. Assuma que as pginas , , e so seguras, e a pgina
y no segura. Antes da execuo do anel principal (passos 2 a 5 do
algoritmo), um travamento-exclusivo colocado na pgina raiz, e a pgina
lida e examinada. A seguir a seguinte seqncia de eventos ocorre:
Passo 3: Um travamento-exclusivo sobre a pgina solicitado;
Passo 4: Aps receber o travamento-exclusivo a pgina lida;
Passo 5: Desde que a pgina segura, o travamento-exclusivo sobre a
pgina a e liberado, permitindo o acesso a pgina a para outros
processos;
Passo 3: Um travamento-exclusivo sobre a pgina solicitado;
Passo 4: Aps receber o travamento-exclusivo a pgina lida;
Passo 5: Desde que a pgina no segura, o travamento-exclusivo
sobre a pgina mantido;
Passo 3: Um travamento-exclusivo sobre a pgina solicitado;
Passo 4: Aps receber o travamento-exclusivo, a pgina b lida;
Passo 5: Desde que a pgina segura, os travamentos-exclusivos sobre
as pginas ( e podem ser liberados.
A soluo apresentada acima requer um protocolo bem simples e ainda
assim permite um nvel razovel de concorrncia. Essa soluo pode ser
melhorada em relao ao nvel de concorrncia com a utilizao de protocolos
mais sofisticados. Por exemplo, o processo modificador pode fazer uma "
reserva" em cada pgina acessada e mais tarde modificar a reserva para
travamento-exclusivo caso o processo modificador verifique que as modificaes a serem realizadas na estrutura da rvore devero se propagar at a
pgina com reserva. Essa soluo aumenta o nvel de concorrncia, desde que
as pginas com reserva possam ser lidas por outros processos.
Os tipos de travamentos referidos aqui so aplicados ao nvel fsico do
banco de dados. Em um banco de dados cujo acesso aos dados realizado
atravs de uma rvore B*, a unidade de transferncia dos dados da memria
secundria para a memria principal a pgina. Deste modo, os protocolos de
travamento so aplicados neste nvel.
A implementao dos travamentos descritos acima pode ser obtida usando
semforos. De acordo com Dijkstra (1965), um semforo um inteiro
188
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).
Outro importante aspecto a ser considerado em um ambiente de processamento concorrente o problema de deadlock. 0 deadlock ocorre quando
dois processos esto inserindo um registro cada um em pginas adjacentes
que estejam cheias. Neste caso cada um dos processos fica esperando pelo
outro eternamente. Lister (1975) mostra que o deadlock pode ser evitado
atravs da eliminao de dependncias circulares entre processos e recursos.
Esta condio pode ser satisfeita atravs do uso da estrutura em rvore para
ordenar todas as solicitaes para acessar o banco de dados. Basta que os
algoritmos usem as operaes de travamento de cima para baixo, isto , da
pgina raiz para as pginas folha. Bayer e Schkolnick (1977) provaram que
as solues apresentadas so livres de deadlock.
189
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 insero, 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
190
10.000.000
7
4
4
4
Tabela 5.1: Nmero de acessos a disco, no pior caso, para tamanhos variados de pginas e
arquivos usando rvore B
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
191
192
Observaes Finais
Existem inmeras variaes sobre o algoritmo original da rvore B. Uma
delas a rvore B*, tratada na Seo 5.3.2.
Outra importante modificao a tcnica de transbordamento (ou
tcnica de overflow) proposta por Bayer e McCreight (1972) e Knuth (1973).
A idia a seguinte: assuma que um registro tenha que ser inserido em uma
pgina cheia que contenha 2m registros. Ao invs de particion-la, ns
olhamos primeiro para a pgina irm direita. Se a pgina irm possui
menos do que 2m registros, um simples rearranjo de chaves torna a partio
desnecessria. Se a pgina direita tambm estiver cheia ou no existir, ns
olhamos para a pgina irm esquerda. Se ambas estiverem cheias, ento a
partio ter que ser realizada. 0 efeito desta modificao o de produzir
uma rvore com melhor utilizao de memria e uma altura esperada menor.
Esta alterao produz uma utilizao de memria de cerca de 83% para uma
rvore B randmica.
Qual a influncia de um sistema de paginao no comportamento de
uma rvore B? Desde que o nmero de nveis de uma rvore B muito pequeno (apenas 3 ou 4) se comparado com o nmero de molduras de pginas,
o sistema de paginao garante que a pgina raiz esteja sempre presente na
memria principal, desde que a poltica de reposio de pginas adotada seja
a poltica LRU. 0 esquema LRU faz tambm com que as pginas a serem
particionadas em uma insero estejam automaticamente disponveis na
memria principal.
Finalmente, importante observar que a escolha do tamanho adequado da
ordem m da rvore B geralmente feita em funo das caractersticas de
cada computador. Por exemplo, em um computador com memria virtual
paginada, o tamanho ideal da pgina da rvore corresponde ao tamanho da
pgina do sistema, e a transferncia de dados da memria secundria para a
memria principal e vice-versa realizada pelo sistema operacional. Estes
tamanhos variam de 512 bytes at 4096 bytes, em mltiplos de 512 bytes.
Notas Bibliogrficas
O material utilizado na Seo 5.1 sobre um modelo de computao para
memria secundria veio de Lister (1975). As rvores B foram introduzi-das
por Bayer e McCreight (1972). Comer (1979) discute rvores B sob um
ponto de vista mais prtico. Wirth (1976) apresenta uma implementao dos
algoritmos de insero e de retirada; Gonnet e Baeza-Yates (1991) apresentam uma implementao do algoritmo de insero. A principal referncia
utilizada no item concorrncia em rvores B veio de Bayer e Schkolnik (1977).
EXERCCIOS
193
Exerccios
1) a) Construa uma rvore B de ordem m = 1 para as seguintes chaves: 15,
10, 30, 40, 5, 20, 12.
b) Retire a chave 15 e depois a chave 20 da rvore obtida acima.
2) Neste trabalho voc deve apresentar uma implementao do conjunto
de procedimentos para criao de um ambiente de memria virtual
paginada em Pascal, conforme descrito na Secao 5.1.
Ao implementar o sistema voc deve ter em mente que o conjunto de
procedimentos dever permitir a o usurio incorporar facilmente um
ambiente de memria virtual ao seu programa para poder organizar o
fluxo de dados entre a memria primria e a memria secundria. Para
tal procure colocar todos os procedimentos e declaraes de tipos em
um nico arquivo chamado SMV.PAS. Este arquivo poder ser
incorporado a qualquer programa escrito em Pascal, o qual dever
aparecer antes das declaraes de variveis do usurio.
O tamanho mximo de cada estrutura de dados utilizada pelo sistema
dever ser definido atravs de constantes que podero facilmente ser
ajustadas pelos usurios diretamente n o arquivo SMV.PAS, de acordo
com suas convenincias.
O que cada aluno deve fornecer:
a) Uma listagem completa do conjunto de procedimentos precedida
de documentao pertinente. A descrio de cada procedimento
dever conter pelo menos a sua funo e a de seus parmetros. Dependendo da complexidade de cada procedimento pode ser interessante descrever sucintamente a lgica do mdulo obtido (evite
descrever o que bvio).
b) Uma listagem de um programa de demonstrao (DEMO) que
mostre claramente ao usurio como utilizar o pacote SMV.PAS. O
programa DEMO deve servir tambm para mostrar toda a
flexibilidade e potencial do SMV.PAS.
c) Teste do Sistema
Para testar os vrios mdulos do sistema de paginao voc deve
gerar um arquivo em disco contendo algumas pginas (para fins de
teste voc pode utilizar uma pgina de tamanho pequeno, digamos
32 bytes). 0 arquivo de teste em disco dever conter as pginas de
uma rvore binria de pesquisa sem balanceamento, conforme
mostrado no Programa 5.1.
194
EXERCCIOS
19 5
Apndice A
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 Organization 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 Algorithms. 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.
Barbosa, E.F. e Ziviani, N. (1992) `"Data Structures and Access Methods
for Read-Only Optical Disks". Baeza-Yates, R. e Manber, U. (Eds.) in
Computer Science: Research and Applications, Plenum Publishing Corp.
, New York, NY, 189-207.
Bayer, R. (1971) "Binary B Trees for Virtual Memory", ACM SIGFIDET
Workshop, San Diego, 219-235.
Bayer, R. (1972) "Symmetric Binary B-Trees: Data Structure and Maintenance Algoritms", Acta Informatica 1 (4), 290-306.
Bayer, R. e McCreight, E.M. (1972) "Organization and Maintenance of
Large Ordered Indices". Acta Informatica 1(3), 173-189.
255
256
REFERNCIAS BIBLIOGRFICAS
REFERNCIAS BIBLIOGRFICAS
257
258
REFERNCIAS BIBLIOGRFICAS
REFERNCIAS BIBLIOGRFICAS
259
260
REFERNCIAS BIBLIOGRFICAS
ndice
caso mdio, 6
de um algoritmo particular, 3 de
uma classe de algoritmos, 4 melhor
caso, 6
pior caso, 6
tcnicas de, 1824
Arabe J.N.C., 59, 100, 103, 148 rea de
armazenamento, 97, 155, 165
Arquivo
conceito, 107
definio, 28
Arranjos, definio, 26
Arvores, 83, 84, 112135, 169192, 194
2-3, 118, 190
2-3-4, 119, 144
altura de, 112, 126
auto-ajustvel, 144
AVL, 143
B, 118, 170181, 194
binrias, 118
definio, 170
tcnica de overflow, 192 B*,
182188
acesso concorrente, 184188
deadlock, 188
definio, 182
pgina segura, 185
processo leitor, 186
processo modificador, 186
protocolos, 184
semforos, 187
O notao, 13
O operaes, 12, 13
[ ] conjunto em Pascal, 27
notao, 14
[ ] teto, 8
[] - Piso, 8
somatrio, 21
2-3, rvores, 118, 190 2-34, rvores, 119, 144
Adel'son-Vel'skii G.M., 143
Agrupamento em tabelas hashing, 141
Aho A.V., 2, 13, 19, 30, 36, 56, 58, 99,
143
Albuquerque L.C.A., 131
Algoritmos
anlise de, 324
classes de, 15
comparao,
1424
complexidade,
324
conceito, 1
escolha de, 1, 12, 71, 107
exponenciais, 16, 17 timos,
4, 5, 11, 24 polinomiais, 17
recursivos, 1924, 47, 79, 112
135, 170192 Alocao
dinmica, 29, 189
encadeada, 29, 38, 49, 65
Altura de rvore, 112, 126
Amortizado, custo, 30, 144
Anlise de algoritmos, 324
261
262
balanceadas, 117127, 169192
binrias, 83, 112
binrias de pesquisa, 112 binrias
de pesquisa com balanceamento, 117127
binrias de pesquisa sem balanceamento, 112117 binrias
completas, 83 caminhamento central,
115 caminho interno, 118, 143
completamente balanceadas, 117
definio, 112
digitais de pesquisa, 127135 nrea, 170
nvel de um nodo, 112
Patricia, 129135
randmicas, 117, 190
red-black, 144
representao de, 84, 112, 171
SBB, 118145
definio, 119
Trie, 128129
ASCII, tabela de caracteres, 253
Assinttica
complexidade, 14
dominao, 12
Assinttico
classes de comportamento, 14 18
funes que expressam, 14
Auto-ajustvel, rvores, 144 AVL,
rvores, 143
Baeza-Yates R., 4, 99, 118, 129, 143,
153, 192
Balanceada, intercalao, 9297
Balanceadas, rvores, 117127, 169
192
Barbosa E.F., 167, 168
Bayer R., 118-120, 127, 144, 147, 170,
185, 186, 188191 Binria
rvore, 83, 111127
NDICE
pesquisa, 110111
Blocos
em fitas, 93
ordenados, 92, 96
Bolha, mtodo de ordenao, 89
Bruta, fora, 16 Bubblesort, 89
Bucketsort, 71'
Cabea de lista, 38
Caminhamento em rvores, 115 Caminho
interno em rvores de pesquisa, 118,
143
Cartes, classificadora de, 71
Cartas, jogo de, 70, 73
Carvalho M.L.B., 33, 34
Casamento
de cadeias, 129
de padres, 129
Caso mdio, anlise de algoritmos, 6
CD-ROM (Compact Disk Read Only
Memory), 166
Central, caminhamento em rvores, 115
Chave
de ordenao, 69
de pesquisa, 6, 107
de tamanho varivel, 127
semi-infinita, 128, 152, 153
transformao de, 135143
Christodoulakis S., 167
Cilindro
em discos ticos, 167
em discos magnticos, 164, 167
Circulares, listas, 56
Clancy M., 25
Classes de comportamento assinttico,
1418
Classificao, vide Ordenao
Classificadoras de cartes, 71
Clustering, 141
263
NDICE
Colises, resoluo de, 135137, 140,
147149, 151
Comer D., 170, 192
Comparao
de algoritmos, 14
ordenao por, 70
Completa, rvore binria, 83
Complexidade
amortizada, 30, 144
anlise de, 324
assinttica, 14
constante, 15
cbica, 15
de algoritmos, 324
de espao, 5
de tempo, 5
exponencial, 16, 17
funo de, 5
linear, 15
logartmica, 15
nlogn, 15
quadrtica, 15
Concorrente, acesso em rvores B*,
184188
Conjuntos em Pascal, 27 Constante,
algoritmos de complexidade, 15
Cooper D., 25, 30
Cormen T.H., 30, 58, 99
Cbicos, algoritmos, 15
Custo
amortizado, 30, 144
funo de, 12
Dados
estruturas de
conceito, 1, 2530
escolha de, 1, 44
tipos. abstratos de, 23, 35, 42,
44, 47, 48, 53, 55, 82, 107,
108
tipos de, 2-3, 2530, 35, 42, 44,
47, 48, 53, 55, 82, 107,
108
Dahl O.J., 30
Deadlock, 188
Dicionrio, 108
Digital
rvores de pesquisa, 127135
ordenao, 71
Dijkstra E.W., 1, 2, 30, 187
Dinmica, alocao, 29, 189
Disco tico, 166168
cilindro tico, 167
feixe de laser, 166
ponto de ncora, 167
tempo de busca, 166
trilha, 166
varredura esttica, 166 Disco
magntico, 70, 91, 98, 164 cilindro,
164, 167
latncia rotacional, 164
tempo de busca, 164 trilha,
164
Distribuio, ordenao por, 70
Dominao assinttica, 12
Double hashing, vide Hashing duplo
Eisenbarth B., 190, 191
Encadeada, alocao, 29, 38, 49, 65
Equao de recorrncia, vide Relao de
recorrncia
Espao, complexidade, 5
Estvel, mtodo de ordenao, 69,
73, 75, 77, 81, 86
Estruturas de dados
conceito, 2530
escolha de, 1, 44
Execuo, tempo de, 324
Exponenciais, algoritmos, 16, 17
Externa
ordenao, 70, 9199, 104
pesquisa em memria, 155192
Feixe de laser, 166
NDICE
264
Feller W., 136
Fifo, (first-in-first-out), 55, 160
Filas, 55-58
Filas de prioridades, 81-83, 91, 94-96
Fitas magnticas, 70, 9194, 98
Flajolet P., 30
Floyd R.W., 84, 99
Fora bruta, 16
Ford D.A., 167
Funes
comportamento assinttico, 11 de
complexidade, 5, 1416 de
transformao, 135137 hashing,
135
piso (LJ), 8
teto ((I), 8
Furtado A.L., 42
Garey M.R., 16, 17
Gonnet G.H., 4, 99, 118, 129, 143-145,
153, 190, 192 Graham R.L., 30
Greene D.H., 30
Guibas L., 119, 144
Hashing, 135143
duplo, 148
funes de transformao, 136
137
linear, 140
listas encadeadas, 137138
open addressing, 140143
Heaps, 83-86, 91
Heapsort, 81-86, 90
Hibbard T.N., 143 Hoare
C.A.R., 78 Hoare, C.A.
R., 30, 99
Hoperoft J.E., 2, 13, 19, 30, 36, 47, 56,
58, 99, 143
Horowitz E., 10, 30
Indireta, ordenao, 90
Insero
em rvores de pesquisa
com balanceamento, 122
sem balanceamento, 113 em
rvores B, 172
em rvores B*, 184
em filas, 55, 57, 60
em listas lineares, 36
em pilhas, 48, 50, 52
em tabelas hashing, 138, 140
ordenao por, 73-75, 89, 91
Intercalao
balanceada, 92-97
de dois arquivos, 103
ordenao por, 91-99
ISAM, 189
Jensen K., 25, 30
Johnson D.S., 16, 17
Keehn D., 189
Knott G., 136
Knuth D.E., 3, 4, 13, 30, 36, 58, 73, 76,
96, 97, 99, 112, 129, 136, 137,
140, 141, 143, 170, 192
Lacy J., 189
Landis E.M., 143
Laser, feixe de, 166
Latncia, em disco magntico, 164
Leiserson C.E., 30, 58, 99
Lfu (least-frequently-used), 159
Lifo (last-in-first-out), 47
Limite inferior
conceito, 4, 10
orculo, 10
para obter o mximo de um
conjunto, 5
para obter o mximo e o mnimo de
um conjunto, 10 Lineares,
algoritmos, 15 Listas
cabea de, 38, 61
circulares, 56
NDICE
duplamente encadeadas, 59
encadeadas (em hashing), 137-138
lineares, 3558
Lister A.M., 157, 188, 192
Localidade de referncia, 160
Lock protocols, vide Protocolos para
travamento
Logartmicos, algoritmos., 15
Lru (least-recently-used), 159, 192
Lueker G.S., 30
Mximo de um conjunto, 5
Mximo e mnimo de um conjunto, 7
11, 2324
Manber U., 30, 154
Matrizes esparsas, 59
McAllister D.F., 5, 30
McCreight E.M., 118, 170, 189, 190, 192
Mehlhorn K., 143, 190
Melhor caso, anlise de algoritmos, 6
Memria virtual, 157163
Merge, vide intercalao
Mergesort, 103
Morrison D.R., 129
Muntz R., 170
Murta C.D., 152
Myers G., 154
Notao , definio, 14
Notao O,
definio, 13
Notao O, operaes, 12, 13
Olivi H., 144, 145, 147
Open addressing, 140143
Orculo, 10
Ordenao, 69106
externa, 70, 9199, 104 por
intercalao, 9199 interna,
7091
bolha, 89
bubblesort, 89
265
bucketsort, 71
comparao entre os mtodos, 87
91
digital, 71
estvel, 69, 73, 75, 77, 81, 86
heapsort, 8186, 90
indireta, 90
mergesort, 103
por insero, 7375, 89, 91 por
seleo, 7273, 89 quicksort,
7881, 90 radixsort, 71
shellsort, 7677, 89
por comparao, 70
por distribuio, 70
Ordenadas, listas, 75, 83
timo, algoritmo, 4, 5, 11, 24Overflow,
tcnica de insero em rvores B,
192
Pgina
de uma rvore B, 170
em sistemas de paginao, 157
segura, 191
tamanho em uma rvore B, 192
Paginao, 157163, 192
Pai, em estrutura de rvore, 83
Paradoxo do aniversrio, 136
Partio, Quicksort, 79
Pascal, linguagem de programao,
2530
Pat array, 153
Patashnik O., 30
Patricia, 129135
Pesquisa
com sucesso, 107
em listas lineares, 36
em memria externa, 155192 em
rvores B*, 182
em memria interna, 6, 107143
binria, 110111
266
digital, 127135
em rvores binrias, 111 em
rvores binrias com balanceamento, 117127
em rvores binrias sem balanceamento, 112117
em rvores Patricia, 129135
em rvores Trie, 128129
por comparao de chave, 108
127
por transformao de chave,
135143
seqencial, 6, 108110
seqencial rpida, 110
sem sucesso, 107
Peterson J., 157
Pilhas, 4753
Pior caso, anlise de algoritmos, 6
Piso, funo ([ J), 8
Polinomiais, algoritmos, 17
Ponto de ncora, em discos ticos, 167
Previso, tcnica de, 98
Prioridades, filas de, 8183, 9496
Processo
leitor, 186
modificador, 186
Programas, 2
Protocolos, 184
para processos leitores, 186 para
processos modificadores, 186
para travamento, 185
Quadrticos, algoritmos, 15
Quicksort, 7881, 90
mediana de trs, 81, 90
partio, 79
pequenos subarquivos, 90
piv, 7880, 90
Radixsort, 71
Randmica, rvore de pesquisa, 117, 190
NDICE
Recorrncia, relao de, 18, 21, 31, 33
Recursivos, algoritmos, 1924, 47, 79,
112135
Red-black, rvores, 144
Registros, 6, 27, 107
Relao de recorrncia, 18, 21, 31, 33
Retirada de itens
em rvores B, 177
em rvores B*, 184
em rvores de pesquisa
com balanceamento, 124
sem balanceamento, 113 em
filas, 55, 57, 60
em listas lineares, 36, 39, 41
em pilhas, 48, 50, 52
em tabelas hashing, 138, 140
Rivest R.L., 30, 58, 99
NDICE
Standish T.A., 143
Suffix array, 154
Tanenbaum A.S., 157
Tarjan R.E., 30, 143, 144
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
Ullman J.D., 2, 13, 19, 30, 36, 47, 56,
58, 99, 143 Uzgalis R., 170
Valor mdio de uma distribuio
de probabilidades, 6
Varredura esttica, em discos ticos, .
166
Virtual, memria, 157-163
Vitter J.S., 30
VSAM, 189
Vuillemin J., 83
Wagner R., 189
Weide B., 30
Williams 3.W.3., 83, 99
267
Wirth N., 2, 25, 30, 99, 115, 143,
144, 147, 170, 192 Wood D., 190
Ziviani N., vii, 127, 131, 144, 145,
167, 168, 190