Você está na página 1de 288

Maria, esposa e companheira,

Patricia e Paula, nossas filhas.

Dados Internacionais de Catalogao na Publicao (CIP)


( C i m a r a B r a s i l e i r a do L i v r o , S P, B r a s i l )
Ziviani, Nivio
Projeto de algoritmos c o m

implementaes

Pascal C / Nivio Ziviani. -- 4. ad. -- So Paulo :


Pioneira, 1999. -- (Pioneira Informtica)

Bibliografia.
ISBN 85-221-

1. Algoritmos 2. C (Linguagem de programao


para computadores) 3. Dados - Estruturas (Cincia da
computao). 4. PASCAL (Linguagem de programao
para computadores) I. Titulo. II. Srie

98-5286

CDD-005.1

ndices para catlogo sistemtico:


1. Algoritmos : Computadores : Programao : Processamento
de dados 005.1

Projeto
de
Algoritmos
Com Implementaes
em Pascal e C

PIONEIRA INFORMTICA
Coordenador:

Routo Terada
Conselho Diretor:
Lvio Giosa
Ulf Gregor Baranow

Projeto
de
Algoritmos
Com Implementaes
em Pascal e C

Nivio Ziviani, Ph.D.


Professor Titular
Universidade Federal de Minas Gerais
Departmento de Cincia d Computao

44 Edio

Este livro foi composto, revisado.


paginado pelo autor.
A Pioneira, a partir dos fotolitos, imprimiu-o.

Capa do
Riccardo Fanucchi

Nenhuma parte deste livro poder ser reproduzida sejam


quais forem os meios empregados
sem a permisso, por escrito, da Editora.
Aos infratores se aplicam as sanes previstas nos artigos 102,
104, 106 e 107 da Lei n 9.610 de 19 de fevereiro de 1998.

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

autocontida e exige muito pouco conhecimento matemtico prvio para ser


entendida.
A linguagem de programao utilizada para apresentao do refinamento
final dos algoritmos apresentados a linguagem Pascal. A vantagem de se
usar a linguagem Pascal que os programas se tornam fceis de ser lidos e de
ser traduzidos para outras linguagens. Alm disso, todos os algoritmos implementados na linguagem Pascal so tambm implementados na linguagem
C. Todo programa Pascal de um captulo tem um programa C correspondente no apndice.
Ao Leitor
O material apresentado adequado para ser utilizado como livro texto em
cursos de graduao em Cincia da Computao e em cursos de extenso para
formao de Programadores na rea de Algoritmos e Estruturas de Dados. E
recomendvel que o estudante j tenha tido um curso de programao (ou
experincia equivalente) em uma linguagem de alto nvel, tal como Pascal ou
C, assim como conhecimentos de utilizao de sistemas de computao.
Verses anteriores deste livro foram utilizadas na Universidade Federal
de Minas Gerais. A disciplina Algoritmos e Estruturas de Dados II do Curso
de Bacharelado em Cincia da Computao, com carga horria de 60 horas e
um semestre de durao, possui a seguinte ementa: tipos abstratos de dados;
introduo a anlise de algoritmos; listas lineares, pilhas e filas; ordenao:
seleo direta, insero direta, shellsort, quicksort, heapsort, mergesort e radixsort; pesquisa em tabelas: seqencial, binria e transformao de chave (
hashing); rvores de pesquisa: sem balanceamento, com balanceadamento,
tries e patricia. Os tpicos ordenao externa, pesquisa em memria secundria e um estudo mais elaborado de anlise de algoritmos fazem parte
da disciplina Algoritmos e Estruturas de Dados III, do mesmo Curso.
Ao final de cada captulo so includos exerccios. Alguns exerccios so
do tipo questes curtas, para testar os conhecimentos bsicos sobre o material apresentado. Outros exerccios so do tipo questes mais elaboradas,
podendo exigir do leitor um trabalho de vrios dias, devendo ser realizado em
casa ou em laboratrio. Assim, os exerccios propostos devem ser utilizados
em testes e trabalhos prticos para avaliao da aprendizagem.
Este texto pode tambm ser utilizado como manual para programadores
que j tenham familiaridade com o assunto, pois so apresentadas implementaes de algoritmos de utilidade geral. Os algoritmos propostos so
completamente implementados nas linguagens Pascal e C e as operaes envolvidas so descritas atravs da apresentao de exemplos de execuo.

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

Funo para obter o mximo de um conjunto .......................................5


Implementao direta para obter o mximo e o mnimo .
7
Implementao melhorada para obter o mximo e o mnimo
8
Outra implementao para obter o mximo e o mnimo ..................... 9
Programa para ordenar .......................................................................... 20
Algoritmo recursivo .............................................................................. 21
Verso recursiva para obter o mximo e o mnimo ........................... 23
Programa para copiar arquivo .............................................................. 29

2.1 Estrutura da lista usando arranjo ......................................................... 38


2.2 Operaes sobre listas usando posies contguas de memria 39
2.3 Estrutura da lista usando apontadores ................................................. 40
2.4 Operaes sobre listas usando apontadores ........................................ 41
2.5 Campos do registro de um candidato .................................................. 42
2.6 Primeiro refinamento do programa Vestibular ................................... 43
2.7 Segundo refinamento do programa Vestibular ................................... 44
2.8 Estrutura da lista .................................................................................... 45
2.9 Refinamento final do programa Vestibular ........................................ 46
2.10 Estrutura da pilha usando arranjo ...................................................... 49
2.11 Operaes sobre pilhas usando arranjos ........................................... 50
2.12 Estrutura da pilha usando apontadores ..............................................51
2.13 Operaes sobre pilhas usando apontadores .................................... 52
2.14 Implementao do ET ......................................................................... 54
2.15 Procedimento Imprime utilizado no programa ET ........................... 55
2.16 Estrutura da fila usando arranjo ......................................................... 57
2.17 Operaes sobre filas usando posies contguas de memria ...... 57
2.18 Estrutura da fila usando apontadores ................................................ 59
2.19 Operaes sobre filas usando apontadores ....................................... 60
3.1 Estrutura de um item do arquivo ..........................................................70
3.2 Tipos utilizados na implementao dos algoritmos ........................... 72
3.3 Ordenao por seleo .......................................................................... 73

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

5.10 Estrutura do dicionrio para rvore B* ..........................................183


5.11 Procedimento para pesquisar na rvore B* ................................... 183
A.1
A.2
A.3
A.4
A.5
A.6
A.7
A.8

Funo para obter o maior elemento de um vetor ..........................197


Implementao direta para obter o mximo e o mnimo ............... 197
Implementao melhorada para obter o mximo e o mnimo ....... 198
Outra implementao para obter o mximo e o mnimo ................199
Programa para ordenar ...................................................................... 199
Algoritmo recursivo ...........................................................................199
Verso recursiva para obter o mximo e o mnimo ....................... 200
Programa para copiar arquivo .......................................................... 201

B.1 Estrutura da lista usando arranjo ......................................................203


B.2 Operaes sobre listas usando posies contguas de memria... 204
B.3 Estrutura da lista usando apontadores ... . .......................................205
B.4 Operaes sobre listas usando apontadores .................................... 206
B.5 Campos do registro de um candidato ...............................................206
B.6 Primeiro refinamento do programa Vestibular ............................... 206
B.7 Segundo refinamento do programa Vestibular ............................... 207
B.8 Estrutura da lista ................................................................................ 208
B.9 Refinamento final do programa Vestibular .....................................209
B.10 Estrutura da pilha usando arranjo ....................................................209
B.11 Operaes sobre pilhas usando arranjos .........................................210
B.12 Estrutura da pilha usando apontadores ............................................ 210
B.13 Operaes sobre pilhas usando apontadores .................................. 211
B.14 Implementao do ET ....................................................................... 212
B.15 Procedimento Imprime utilizado no programa ET ........................ 213
B.16 Estrutura da fila usando arranjo ...................................................... 213
B.17 Operaes sobre filas usando posies contguas de memria .... 214
B.18 Estrutura da fila usando apontadores .............................................. 214
B.19 Operaes sobre filas usando apontadores .....................................215
C;1 Estrutura de um item do arquivo ....................................................... 217
C.2 Tipos utilizados na implementao dos algoritmos ....................... 217
C.3 Ordenao por seleo .......................................................................217
C.4 Ordenao por insero .....................................................................218
C.5 Algoritmo Shellsort ........................................................................... 218
C.6 Funo Partio ..................................................................................219
C.7 Funo Quicksort ............................................................................... 219
C.8 Funo para construir o heap ............................................................. 220
C.9 Funo Heapsort ................................................................................ 221
D.1 Estrutura do tipo dicionrio implementado como arranjo .............223

LISTA DE PROGRAMAS

D.2 Implementao das operaes usando arranjo ................................ 224


D.3 Pesquisa binria .................................................................................. 224
D.4 Estrutura do dicionrio .......................................................................225
D.5 Funo para pesquisar na rvore .......................................................225
D.6 Funo para inserir na rvore ............................................................226
D.7 Funo para inicializar .......................................................................226
D.8 Programa para criar a rvore .............................................................226
D.9 Funes para retirar x da rvore ....................................................... 227
D.10 Caminhamento central ......................................................................227
D.11 Estrutura do dicionrio para rvores SBB ..................................... 228
D.12 Procedimentos auxiliares para rvores SBB .................................. 229
D.13 Procedimento para inserir na rvore SBB ......................................230
D.14 Procedimento para inicializa a rvore SBB ................................... 231
D.15 Procedimento para retirar da rvore SBB ...................................... 234
D.16 Estrutura de dados ............................................................................ 234
D.17 Funes auxiliares ............................................................................ 235
D,18 Funo CrieNodos ............................................................................ 235
D.19 Algoritmo de pesquisa ......................................................................236
D.20 Inicializao da rvore ..................................................................... 236
D.21 Algoritmo de insero ...................................................................... 237
D.22 Implementao de funo de transformao ..................................238
D.23 Estrutura do dicionrio para listas encadeadas ..............................238
D.24 Operaes do dicionrio usando listas encadeadas .......................239
D.25 Estrutura do dicionrio usando open addressing .........................240
D.26 Operaes do dicionrio usando open addressing .......................241
E.1 Estrutura de dados para o sistema de paginao ............................. 243
E.2 Diferentes tipos de pginas para o sistema de paginao ...............243
E.3 Estrutura do dicionrio para rvore B .............................................. 244
E.4 Funo para inicializar uma vore B ................................................ 244
E.5 Funo para pesquisar na vore B .....................................................245
E.6 Primeiro refinamento do algoritmo Insere na rvore B .................. 246
E.7 Funo Insere Na Pgina ....................................................................246
E.8 Refinamento final do algoritmo Insere ............................................. 248
E.9 Funo Retira ...................................................................................... 250
E.10 Estrutura do dicionrio para rvore B* ...........................................251
E.11 Funo para pesquisar na rvore B* ............................................... 252

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

Programar basicamente estruturar dados e construir algoritmos. De


acordo com Wirth (1976, p.XII), programas so formulaes concretas de
algoritmos abstratos, baseados em representaes e estruturas especficas de
dados. Em outras palavras, programas representam uma classe especial de
algoritmos capazes de serem seguidos por computadores.
Entretanto, um computador s capaz de seguir programas em linguagem de mquina, que correspondem a uma seqncia de instrues obscuras
e desconfortveis. Para contornar tal problema necessrio construir linguagens mais adequadas para facilitar a tarefa de programar um computador.
Segundo Dijkstra (1976), uma linguagem de programao uma tcnica de
notao para programar, com a inteno de servir de veculo tanto para a
expresso do raciocnio algortmico quanto para a execuo automtica de
um algoritmo por um computador.

1.2 Tipos de Dados e Tipos Abstratos de Dados


Em linguagens de programao importante classificar constantes, variveis,
expresses e funes de acordo com certas caractersticas, as quais indicam o
seu tipo de dados. Este tipo deve caracterizar o conjunto de valores a que
uma constante pertence, ou que podem ser assumidos por uma varivel ou
expresso, ou que podem ser gerados por uma funo (Wirth, 1976, pp.440).
Tipos simples de dados so grupos de valores indivisveis, como os tipos
bsicos integer, boolean, char, e real do Pascal. Por exemplo, uma varivel
do tipo boolean pode assumir ou o valor verdadeiro ou o valor falso, e nenhum
outro valor. Os tipos estruturados em geral definem uma coleo de valores
simples, ou um agregado de valores de tipos diferentes. A linguagem Pascal
oferece uma grande variedade de tipos de dados, como ser mostrado na
Seo 1.5.
Um tipo abstrato de dados pode ser visto como um modelo matemtico, acompanhado das operaes definidas sobre o modelo. 0 conjunto
dos inteiros acompanhado das operaes de adio, subtrao e multiplicao
forma um exemplo de um tipo abstrato de dados. Aho, Hoperoft e Ullman (
1983), utilizam extensivamente tipos abstratos de dados como base para o
projeto de algoritmos. Nestes casos a implementao do algoritmo em uma
linguagem de programao especfica exige que se encontre alguma forma
de representar o tipo abstrato de dados, em termos dos tipos de dados e dos
operadores suportados pela linguagem considerada. A representao do
modelo matemtico por trs do tipo abstrato de dados realizada atravs de
uma estrutura de dados.
Tipos abstratos de dados podem ser considerados generalizaes de tipos
primitivos de dados, da mesma forma que procedimentos so generalizaes
de operaes. primitivas tais como adio, subtrao e multiplicao. Da

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA

mesma forma que um procedimento usado para encapsular partes de um


algoritmo, o tipo abstrato de dados pode ser usado para encapsular tipos de
dados. Neste caso a definio do tipo e todas as operaes definidas sabre
ele podem ser localizadas em uma nica seo do programa.
Como exemplo, considere uma aplicao que utilize uma lista de inteiros. Poderamos definir um tipo abstrato de dados Lista, com as seguintes
operaes sobre a lista:
1. faa a lista vazia,
2. obtenha o primeiro elemento da lista. Se a lista estiver vazia ento
retorne nulo,
3. insira um elemento na lista.
Existem vrias opes de estruturas de dados que permitem uma implementao eficiente para listas. Uma possvel implementao para o tipo
abstrato de dados Lista atravs do tipo estruturado arranjo. A seguir cada
operao do tipo abstrato de dados implementada como um procedimento
na linguagem de programao escolhida. Se existe necessidade de alterar a
implementao do tipo abstrato de dados, a alterao fica restrita parte
encapsulada, sem causar impactos em outras partes do cdigo..
Cabe ressaltar que cada conjunto diferente de operaes define um tipo
abstrato de dados diferente, mesmo que todos os conjuntos de operaes
atuem sobre um mesmo modelo matemtico. Uma razo forte para isto que
a escolha adequada de uma implementao depende fortemente das
operaes a serem realizadas sobre o modelo.

1.3 Medida do Tempo de Execuo de um Programa


0 projeto de algoritmos fortemente influenciado pelo estudo de seus comportamentos. Depois que um problema analisado e decises de projeto so
finalizadas, o algoritmo tem que ser implementado em um computador.
Neste momento o projetista tem que estudar as vrias opes de algoritmos
a serem utilizados, onde os aspectos de tempo de execuo e espao
ocupado so consideraes importantes. Muitos destes algoritmos so encontrados em reas tais como pesquisa operacional, otimizao, teoria dos
grafos, estatstica, probabilidades, entre outras.
Na rea de anlise de algoritmos, existem dois tipos de problemas bem
distintos, conforme apontou Knuth (1971):
(i) Anlise de um algoritmo particular. Qual o custo de usar um dado
algoritmo para resolver um problema especfico? Neste caso, caractersticas

CAPTULO 4. INTRODUO

importantes do algoritmo em questo devem ser investigadas, geralmente


uma anlise do nmero de vezes que cada parte do algoritmo deve ser executada, seguida do estudo da quantidade de memria necessria.
(ii) Anlise de uma classe de algoritmos. Qual o algoritmo de menor
custo possvel para resolver um problema particular? Neste caso, toda uma
famlia de algoritmos para resolver um problema especfico investigada com
o objetivo de identificar um que seja o melhor possvel. Isto significa colocar
limites para a complexidade computacional dos algoritmos pertencentes
classe. Por exemplo, possvel estimar o nmero mnimo de comparaes
necessrias para ordenar n nmeros atravs de comparaes sucessivas, conforme veremos mais adiante no Captulo 3.
Quando conseguimos determinar o menor custo possvel para resolver
problemas de uma determinada classe, como no caso de ordenao, temos a
medida da dificuldade inerente para resolver tais problemas. Ainda mais,
quando o custo de um algoritmo igual ao menor custo possvel, ento podemos concluir que o algoritmo timo para a medida de custo considerada.
Em muitas situaes podem existir vrios algoritmos para resolver o
mesmo problema, sendo pois necessrio escolher aquele que o melhor. Se
uma mesma medida de custo aplicada a diferentes algoritmos ento
possvel compar-los e escolher o mais adequado para resolver o problema em
questo.
O custo de utilizao de um algoritmo pode ser medido de vrias maneiras. Uma delas atravs da execuo do programa em um computador real,
sendo o tempo de execuo medido diretamente. As medidas de tempo obtidas desta forma so bastante inadequadas e os resultados jamais devem ser
generalizados. As principais objees so: (i) os resultados so dependentes
do compilador que pode favorecer algumas construes em detrimento de
outras; (ii) os resultados dependem do hardware; (iii) quando grandes quantidades de memria so utilizadas, as medidas de tempo podem depender
deste aspecto. Apesar disso, Gonnet e Baeza-Yates (1991, p.7) apresentam
argumentos a favor de se obter medidas reais de tempo para algumas situaes particulares como, por exemplo, quando existem vrios algoritmos
distintos para resolver um mesmo tipo de problema, todos com um custo de
execuo dentro de uma mesma ordem de grandeza. Assim os custos reais
das operaes so todos considerados, assim como os custos no aparentes
tais como alocao de memria, indexao, carga, etc.
Uma forma mais adequada de se medir o custo de utilizao de um algoritmo atravs do uso de um modelo matemtico, baseado em um computador idealizado como, por exemplo, o computador MIX proposto por Knuth (
1968). 0 conjunto de operaes a serem executadas deve ser especificado,
assim como o custo associado com a execuo de cada operao. Mais usual
ainda ignorar o custo de algumas das operaes envolvidas e considerar
apenas as operaes mais significativas. Por exemplo, para algoritmos de

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 5

CAPTULO 1. INTRODUO

A medida do custo de execuo de um algoritmo depende principalmente


do tamanho da entrada dos dados. Por isso comum considerar-se o tempo
de execuo de um programa como uma funo do tamanho da entrada.
Entretanto, para alguns algoritmos, o custo de execuo uma funo da
entrada particular dos dados, no apenas do tamanho da entrada. No caso da
funo Max do Programa 1.1 o algoritmo possui a propriedade de que o
custo uniforme sobre todos os problemas de tamanho n. J para um
algoritmo de ordenao isto no ocorre: se os dados de entrada j estiverem
quase ordenados ento o algoritmo pode ter que trabalhar menos.
Temos ento que distinguir trs cenrios: melhor caso, pior caso e caso
mdio. 0 melhor caso corresponde ao menor tempo de execuo sobre todas
as possveis entradas de tamanho n. 0 pior caso corresponde ao maior
tempo de execuo sobre todas as entradas de tamanho n . Se f uma funo
de complexidade baseada na anlise de pior caso ento o custo de aplicar o
algoritmo nunca. maior do que (n).
0 caso mdio (ou caso esperado) corresponde mdia dos tempos de
execuo de todas as entradas de tamanho n. Na anlise do caso esperado,
uma distribuio de probabilidades sobre o conjunto de entradas de
tamanho n suposta, e o custo mdio obtido com base nesta distribuio.
Por esta razo, a anlise do caso mdio geralmente muito mais difcil
de obter do que as anlises do melhor e do pior caso. comum supor uma
distribuio de probabilidades em que todas as entradas possveis so
igualmente provveis. Entretanto, na prtica isto nem sempre verdade. Por
isso a anlise do caso esperado dos algoritmos a serem estudados s ser
apresentada quando esta fizer sentido.
Para ilustrar estes conceitos considere o problema de acessar os registros
de um arquivo. Cada registro contm uma chave nica que utilizada para
recuperar registros do arquivo. Dada uma chave qualquer o problema
consiste em localizar o registro que contenha esta chave. 0 algoritmo de
pesquisa mais simples que existe o que faz uma pesquisa seqencial.
Este algoritmo examina os registros na ordem em que eles aparecem no
arquivo, at que o registro procurado seja encontrado ou fique determinado
que o mesmo no se encontra no arquivo.
Seja f uma funo de complexidade tal que (n) o nmero de registros
consultados no arquivo, isto , o nmero de vezes que a chave de consulta
comparada com a chave de cada registro. Os casos a considerar so:
melhor caso : (n) = 1
pior caso
: (n) = n
caso mdio :(n) = (n + 1)/2
0 melhor caso ocorre quando o registro procurado o primeiro consultado. 0 pior caso ocorre quando o registro procurado o ltimo consultado,

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 7

CAPTULO 1. I N T R O D U O

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 9

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

Comparao dos algoritmos para obter o mximo e o mnimo

Considerando novamente o nmero de comparaes realizadas, existe


possibilidade de obter um algoritmo mais eficiente para este problema? Para
responder a esta questo necessrio conhecer o limite inferior para a classe
de algoritmos para obter o maior e o menor elemento de um conjunto.
Uma tcnica muito utilizada para obter o limite inferior para uma classe
qualquer de algoritmos atravs da utilizao de um orculo.2 Dado um modelo de computao que expresse o comportamento do algoritmo o orculo
informa o resultado de cada passo possvel, que no nosso caso seria o resultado
de cada comparao. Para derivar o limite inferior o orculo procura sempre
fazer com que o algoritmo trabalhe o mximo, escolhendo como resultado da
prxima comparao aquele que cause o maior trabalho possvel que
necessrio para determinar a resposta final.
O teorema abaixo, apresentado por Horowitz e Sahni (1978, p.476), utiliza um orculo para derivar o limite inferior no nmero de comparaes
necessrias para obter o mximo e o mnimo de um conjunto com n elementos.
Teorema: Qualquer algoritmo para encontrar o maior elemento e o menor
elemento de um conjunto com n elementos no ordenados, n 1, faz pelo
menos [3n/2] 2 comparaes.
Prova: A tcnica utilizada define um orculo que descreve o comportamento
do algoritmo atravs de um conjunto de ntuplas, mais um conjunto de regras
associadas que mostram as tuplas possveis (estados) que um algoritmo pode
assumir a partir de uma dada tupla e uma nica comparao.

2De acordo com o Novo Dicionrio Aurlio da Lingua Portuguesa, um orculo : 1. Resposta de um deus a quem o
consultava. 2. Divindade que responde consultas e orienta o crente: o orculo de Delfos. 3. Fig. Palavra, sentena ou deciso inspirada,
infalvel ou que tem grande autoridade: os orculos dos profetas, os orculos da cincia.

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 11


O comportamento do algoritmo pode ser descrito por uma 4-tupla, representada por (a, b, c, d), onde a representa o nmero de elementos que nunca
foram comparados; b representa o nmero de elementos que foram vencedores
e nunca perderam em comparaes realizadas; c representa o nmero de elementos que foram perdedores e nunca venceram em comparaes realizadas; d
representa o nmero de elementos que foram vencedores e perdedores em
comparaes realizadas. O algoritmo inicia no estado (n, 0, 0, 0) e termina
com (0, 1,1, n 2). Desta forma, aps cada comparao a tupla (a, b, c, d)
consegue progredir apenas se ela assume um dentre os cinco estados possveis,
a saber:

1.3.1 Comportamento Assinttico de Funes


Como j foi observado anteriormente, o custo para obter uma soluo para
um dado problema aumenta cem o tamanho n do problema. O nmero de
comparaes para encontrar o maior elemento de um conjunto de n inteiros,
ou para ordenar os elementos de um conjunto com n elementos, aumenta
com n: 0 parmetro n fornece uma medida da dificuldade para se resolver

12

CAPITULO 1. INTRODUO

o problema, no sentido de que o tempo necessrio para resolver o problema


cresce quando n cresce.
Para valores suficientemente pequenos de n, qualquer algoritmo custa
pouco para ser executado, mesmo os algoritmos ineficientes. Em outras palavras, a escolha do algoritmo no um problema crtico para problemas de
tamanho pequeno. Logo, a anlise de algoritmos realizada para valores
grandes de n. Para tal considera-se o comportamento de suas funes de
custo para valores grandes de n, isto , estuda-se o comportamento assinttico das funes de custo. O comportamento assinttico de(n)
representa o limite do comportamento do custo quando n cresce.
A anlise de um algoritmo geralmente conta apenas algumas operaes
elementares e, em muitos casos, apenas uma operao elementar. A medida
de custo ou medida de complexidade relata o crescimento assinttico da
operao considerada. A definio seguinte relaciona o comportamento
assinttico de duas funes distintas.

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 13

14

CAPTULO 1. INTRODUO

1.3.2 Classes de Comportamento Assinttico


Se f uma funo de complexidade para um algoritmo F , ento 0 ( f )
considerada a complexidade assinttica ou o comportamento assinttico do
algoritmo F . Igualmente, se g uma funo para um algoritmo G, ento 0 (
g ) considerada a complexidade assinttica do algoritmo G. A relao de
dominao assinttica permite comparar funes de complexidade. Entretanto, se as funes f e g dominam assintoticamente uma a outra ento
os algoritmos associados so equivalentes. Nestes casos, o comportamento
assinttico no serve para comparar os algoritmos. Por exemplo, dois algoritmos F e G aplicados mesma classe de problemas, sendo que F leva
trs vezes o tempo de G ao serem executados, isto (n ) = 3 g ( n ) , sendo
que 0 ( f ( n ) ) = 0 ( g ( n ) ) . Logo o comportamento assinttico no serve
para comparar os algoritmos F e G porque eles diferem apenas por uma
constante.
Programas podem ser avaliados atravs da comparao de suas funes
de complexidade, negligenciando as constantes de proporcionalidade. Um
programa com tempo de execuo 0 ( n ) melhor que um programa com
tempo de execuo 0 ( n 2) . Entretanto, as constantes de proporcionalidade
em cada caso podem alterar esta considerao. Por exemplo, possvel que
um programa leve 100n unidades de tempo para ser executado enquanto um
outro leve 2 n 2 unidades de tempo. Qual dos dois programas melhor?
A resposta a esta pergunta depende do tamanho do problema a ser executado. Para problemas de tamanho n < 50, o programa com tempo de
execuo 2 n 2 melhor do que o programa com tempo de execuo 100n.
Para problemas com entrada de dados pequena prefervel usar o programa
cujo tempo de execuo 0 ( n 2) . Entretanto, quando n cresce, o programa
com tempo 0 ( n 2) leva muito mais tempo que o programa 0(n).

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 15


A maioria dos algoritmos possui um parmetro que afeta o tempo de
execuo de forma mais significativa, usualmente o nmero de itens a ser
processado. Este parmetro pode ser o nmero de registros de um arquivo a
ser ordenado, ou o nmero de ns de um grafo. As principais classes de
problemas possuem as funes de complexidade descritas abaixo.
1 . f (n) = 0(1). Algoritmos de complexidade 0(1) so ditos de complexidade constante. O uso do algoritmo independe do tamanho de n.
Neste caso as instrues do algoritmo so executadas um nmero fixo
de vezes.
2 . ( n ) = O(log n). Um algoritmo de complexidade O( logn) dito ter
complexidade logartmica. Este tempo de execuo ocorre tipicamente em algoritmos que resolvem um problema transformando-o em
problemas menores. Nestes casos, o tempo de execuo pode ser considerado como sendo menor do que uma constante grande. Quando n
mil e a base do logaritmo 2, log2n 10, quando n um milho, log2n
20. Para dobrar o valor de log n temos que considerar o quadrado de
n. A base do logaritmo muda pouco estes valores: quando n um
milho, o log2n 20 e o log10n 6.
3. f (n) = 0(n). Um algoritmo de complexidade 0(n) dito ter complexidade linear. Em geral um pequeno trabalho realizado sobre
cada elemento de entrada. Esta a melhor situao possvel para um
algoritmo que tem que processar n elementos de entrada ou produzir n
elementos de sada. Cada vez que n dobra de tamanho o tempo de
execuo dobra.
4 . f ( n ) = O ( n log n ) . Este tempo de execuo ocorre tipicamente
em algoritmos que resolvem um problema quebrando-o em problemas
menores, resolvendo cada um deles independentemente e depois
ajuntando as solues. Quando n um milho e a base do logaritmo
2, nlog2n cerca de 20 milhes. Quando n dois milhes, nlog2n
cerca de 42 milhes, pouco mais do que o dobro.
5 . f (n) = 0(n2). Um algoritmo de complexidade 0(n2) dito ter complexidade quadrtica. Algoritmos desta ordem de complexidade
ocorrem quando os itens de dados so processados aos pares, muitas
vezes em um anel dentro de outro. Quando n mil, o nmero de
operaes da ordem de 1 milho. Sempre que n dobra o tempo de
execuo multiplicado por 4. Algoritmos deste tipo so teis para
resolver problemas de tamanhos relativamente pequenos.
6 . f (n) = 0(n3). Um algoritmo de complexidade 0(n3) dito ter complexidade cbica. Algoritmos desta ordem de complexidade so teis

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.

7. (n) = 0(2n). Um algoritmo de complexidade 0(2n) dito ter complexidade


exponencial. Algoritmos desta ordem de complexidade geralmente no so
teis sob o ponto de vista prtico. Eles ocorrem na soluo de problemas
quando se usa fora bruta para resolv-los. Quando n vinte, o tempo de
execuo cerca de um milho. Quando n dobra, o tempo de execuo fica
elevado ao quadrado.
Para ilustrar melhor a diferena entre as classes de comportamento assinttico
Garey e Johnson (1979, p.7) apresentam o quadro mostrado na Ta-bela 1.2. Este
quadro mostra a razo de crescimento de vrias funes de complexidade para
tamanhos diferentes de n, onde cada funo expressa o tempo de execuo em
microsegundos. Um algoritmo linear executa em um segundo um milho de
operaes.

T a b e l a 1.2: Comparao de virias funes de complexidade

Um outro aspecto interessante o efeito causado pelo aumento da velocidade


dos computadores sobre os algoritmos com as funes de complexidade citadas
acima. A Tabela 1.3 mostra como um aumento de 100 ou de 1000 vezes na
velocidade de computao de um computador atual influi na soluo do maior
problema possvel de ser resolvido em uma hora. Note que um aumento de 1000
vezes na velocidade de computao resolve um problema dez vezes maior para um
algoritmo de complexidade 0(n3 ), enquanto um algoritmo de complexidade 0(2n)
apenas adiciona dez ao tamanho do maior problema possvel de ser resolvido em
uma hora.

1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 17


Funo de
custo de
de tempo

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

Tabela 1.3: Influncia do aumento de velocidade dos computadores no tamanho t do problema

Um algoritmo cuja funo de complexidade O(c n), c > 1, chamado de


algoritmo exponencial no tempo de execuo. Um algoritmo cuja funo de
complexidade O(p(n)), onde p(n) um polinmio, chamado de algoritmo
polinomial no tempo de execuo. A distino entre estes dois tipos de
algoritmos torna-se significativa quando o tamanho do problema a ser
resolvido cresce, conforme ilustra a Tabela 1.2. Esta a razo por que
algoritmos polinomiais so muito mais teis na prtica do que algoritmos
exponenciais.
Os algoritmos exponenciais so geralmente simples variaes de pesquisa
exaustiva, enquanto algoritmos polinomiais so geralmente obtidos atravs de
um entendimento mais profundo da estrutura do problema. Um problema
considerado intratvel se ele to difcil que no existe um algoritmo polinomial para resolv-lo, enquanto um problema considerado bem resolvido
quando existe um algoritmo polinomial para resolv-lo.
Entretanto, a distino entre algoritmos polinomiais eficientes e algoritmos exponenciais ineficientes possui vrias excees. Por exemplo, um
algoritmo com funo de complexidade n) = 2n mais rpido que um
algoritmo g(n) = n 5 para valores de n menores ou iguais a 20. Da mesma
forma, existem algoritmos exponenciais que so muito teis na prtica. Por
exemplo, o algoritmo Simplex para programao linear possui complexidade
de tempo exponencial para o pior caso (Garey e Johnson, 1979), mas executa
muito rpido na prtica.
Infelizmente, exemplos como o do algoritmo Simplex no ocorrem com
freqncia na prtica, e muitos algoritmos exponenciais conhecidos no so
muito teis. Considere, como exemplo, o seguinte problema: um caixeiro
viajante deseja visitar n cidades de tal forma que sua viagem inicie e ter-mine
em uma mesma cidade, e cada cidade deve ser visitada uma nica vez.
Supondo que sempre exista uma estrada entre duas cidades quaisquer, o
problema encontrar a menor rota que o caixeiro viajante possa utilizar na
sua viagem.
A Figura 1.4 ilustra o exemplo acima para quatro cidades cl, c2, c3,c4,
onde os nmeros nos arcos indicam a distncia entre duas cidades. O per-

18

CAPT ULO 1. INTRODUO

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.

Figura 1.4: Problema do caixeiro viajante

1.4 Tcnicas de Anlise de Algoritmos


A determinao do tempo de execuo de um programa qualquer pode se
tornar um problema matemtico complexo quando se deseja determinar o
valor exato da funo de complexidade. Entretanto, a determinao da ordem do tempo de execuo de um programa, sem haver preocupao com o
valor da constante envolvida, pode ser uma tarefa mais simples. E mais fcil
determinar que o nmero esperado de comparaes para recuperar um
registro de um arquivo utilizando pesquisa seqencial 0 ( n ) do que efetivamente determinar que este nmero ( n + 1)/2, quando cada registro tem a
mesma probabilidade de ser procurado.
A anlise de algoritmos ou programas utiliza tcnicas de matemtica
discreta, envolvendo contagem ou enumerao dos elementos de um conjunto que possuam uma propriedade comum. Estas tcnicas envolvem a
manipulao de somas, produtos, permutaes, fatoriais, coeficientes binomiais, soluo de equaes de recorrncia, entre outras. Algumas destas
tcnicas sero ilustradas informalmente atravs de exemplos.

1.4. TCNICAS DE ANLISE DE ALGORITMOS

19

Infelizmente no existe um conjunto completo de regras para analisar


programas. Aho, Hoperoft e Ullman (1983) enumeram alguns princpios a
serem seguidos. Muitos destes princpios utilizam as propriedades sobre a
notao O apresentadas na Figura 1.3. So eles:
1. 0 tempo de execuo de um comando de atribuio, de leitura ou de
escrita pode ser considerado como 0(1). Existem excees para as
linguagens que permitem a chamada de funes em comandos de
atribuio, ou quando atribuies envolvem vetores de tamanho arbitrariamente grandes.
2. 0 tempo de execuo de uma seqncia de comandos determinado
pelo maior tempo de execuo de qualquer comando da seqncia.
3. 0 tempo de execuo de um comando de deciso composto pelo
tempo de execuo dos comandos executados dentro do comando condicional, mais o tempo para avaliar a condio, que 0(1).
4. 0 tempo para executar um anel a soma do tempo de execuo do
corpo do anel mais o tempo de avaliar a condio para terminao,
multiplicado pelo nmero de iteraes do anel. Geralmente o tempo
para avaliar a condio para terminao 0(1).
5. Quando o programa possui procedimentos no recursivos, o tempo de
execuo de cada procedimento deve ser computado separadamente um
a um, iniciando com os procedimentos que no chamam outros procedimentos. A seguir devem ser avaliados os procedimentos que chamam
os procedimentos que no chamam outros procedimentos, utilizando
os tempos dos procedimentos j avaliados. Este processo repetido
at chegar no programa principal.
6. Quando o programa possui procedimentos recursivos, para cada
procedimento associada uma funo de complexidade f (n) desconhecida, onde n mede o tamanho dos argumentos para o procedimento,
conforme ser mostrado mais adiante.
Com o propsito de ilustrar os vrios conceitos apresentados acima, vamos apresentar alguns programas e, para cada um deles, mostrar com detalhes os passos envolvidos em sua anlise.
Exemplo: Considere o algoritmo para ordenar os n elementos de um conjunto A, cujo princpio o seguinte:
1. Selecione o menor elemento do conjunto
2. Troque este elemento com o primeiro elemento A[1].

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

1.4. TCNICAS DE ANLISE DE ALGORITMOS

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

F i g u r a 1.5: Estrutura de um programa Pascal

A regra geral para a linguagem Pascal tornar explcito o tipo associado


quando se declara uma constante, varivel ou funo, o que. permite testes
de consistncia durante o tempo de compilao. A definio de tipos permite
ao programador alterar o nome de tipos existentes, como tambm criar um
nmero ilimitado de outros tipos. No caso do Pascal os tipos podem ser
colocados em trs categorias: simples, estruturados, e apontadores.
Tipos simples so grupos de valores indivisveis, estando dentro desta
categoria os tipos bsicos integer, boolean, char, e real. Tipos simples adicionais podem ser enumerados atravs de uma listagem de novos grupos de

CAPTULO 1. INTRODUO

26

valores, ou atravs da indicao de subintervalos que restringem tipos a uma


subseqncia dos valores de um outro tipo simples previamente definido.
Exemplos de tipos enumerados
type cor
type sexo
type boolean

= (vermelho, azul, rosa);


= (mas, fern);
= (false, true);

Se as variveis c, s, e d so declaradas
var c
cor;
var s
sexo;
var b
boolean;

:
:
:

ento so possveis as seguintes atribuies


c :
=rosa;
s :
=fern;
b :
=true;
Exemplos de tipos com subintervalos
type ano =
1999; type letra
'A'..'Z';
Dadas as variveis
vara
:
ano; var b :
letra;

1900..
=

1.5. PASCAL

27

onde a constante n deve ser previamente declarada


const n = 20;
Dada a varivel
var x : coluna;
as atribuies x[1]:=0.75, x[2]:=0.85 e x[3]:=1.5 so possveis.
Um tipo estruturado registro uma unio de valores de tipos quaisquer,
cujos campos podem ser acessados pelos seus nomes.
Exemplos:
type data = record
dia : 1..31;
ms : 1..12;
end;
type pessoa = record
sobrenome
alfa;
primeironome
alfa;
aniversrio
data;
sexo
end;
Declarada a varivel

:
:
:
:

(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;

A Figura 1.6 ilustra este exemplo.


Um tipo estruturado conjunto define a coleo de todos os subconjuntos
de algum tipo simples, com operadores especiais * (interseo), + (unio),
(diferena) e in (pertence a) definidos para todos os tipos conjuntos.
Exemplos:
type conjint =
set of 1..9;
type conjcor =
set of cor;
type conjchar =
set of char;

28

CAPTULO 1. INTRODUO

1.5. PASCAL

29

Programa 1.8: Programa para copiar arquivo

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

Pascal marca registrada da Borland International

30

CAPTULO 1. INTRODUO
var Lista: Apontador;

possvel criar uma lista como ilustrada na Figura 1.7.

Figura 1.7: Lista encadeada

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

12) Apresente um algoritmo para obter o maior e o segundo maior elemento


de um conjunto. Apresente tambm uma anlise do algoritmo. Voc
acha o seu algoritmo eficiente? Por qu? Procure comprovar suas
respostas.
13) So dados 2n nmeros distintos distribuidos em dois arranjos com n
elementos A e B ordenados de maneira tal que (Carvalho, 1992):
A[1] > A[2] > A[3] > > A[n] e
B[1] > B[2] > B[3] > > B[n].
O problema achar o n-simo maior nmero dentre estes 2n elementos.
a) Obtenha um limite inferior para o nmero de comparaes necessrias para resolver este problema.
b) Apresente um algoritmo cuja complexidade no pior caso seja iqual
ao valor obtido na letra a), ou seja, um algoritmo timo.

Captulo 2

Estruturas de Dados Bsicas


2.1 Listas Lineares
Uma das formas mais simples de interligar os elementos de um conjunto
atravs de uma lista. Lista uma estrutura onde as operaes inserir, retirar
e localizar so definidas. Listas so estruturas muito flexveis porque podem
crescer ou diminuir de tamanho durante a execuo de um programa, de
acordo com a demanda. Itens podem ser acessados, inseridos ou retirados de
uma lista. Duas listas podem ser concatenadas para formar uma lista nica,
assim como uma lista pode ser partida em duas ou mais listas.
Listas so adequadas para aplicaes onde no possvel prever a demanda por memria, permitindo a manipulao de quantidades imprevisveis
de dados, de formato tambm imprevisvel. Listas so teis em aplicaes
tais como manipulao simblica, gerncia de memria, simulao e compiladores. Na manipulao simblica os termos de uma frmula podem crescer
sem limites. Em simulao dirigida por relgio pode ser criado um nmero
imprevisvel de processos, os quais tm que ser escalonados para execuo
de acordo com alguma ordem predefinida.
Uma lista linear uma seqncia de zero ou mais itens x1, x2,,xn, onde
xi de um determinado tipo e n representa o tamanho da lista linear. Sua
principal propriedade estrutural envolve as posies relativas dos itens em
uma dimenso. Assumindo n 1, xy1 o primeiro item da lista e xn o
ltimo item da lista. Em geral xi precede xi+1 para i = 1, 2, ,n 1, e xi
sucede xa_1 para i = 2, 3, , n. Em outras palavras, o elemento xi dito
estar na i-sima posio da lista.
Para criar um tipo abstrato de dados Lista, necessrio definir um
conjunto de operaes sobre os objetos do tipo Lista. 0 conjunto de
operaes a ser definido depende de cada aplicao, no existindo um conjunto de operaes que seja adequado a todas as aplicaes. Um conjunto
35

36

CAPTULO 36. ESTRUTURAS DE DADOS BSICAS

de operaes necessrio a uma maioria de aplicaes apresentado a seguir.


Outras sugestes para o conjunto de operaes podem ser encontradas em
Knuth (1968, p.235) e Aho, Hoperoft e Ullman (1983, pp.38-39).
1. Criar uma lista linear vazia.
2. Inserir um novo item imediatamente aps o i-simo item.
3. Retirar o i-simo item.
4. Localizar o i-simo item para examinar e/ou alterar o contedo de seus
componentes.
5. Combinar duas ou mais listas lineares em uma lista nica.
6. Partir uma lista linear em duas ou mais listas.
7. Fazer uma cpia da lista linear.
8. Ordenar os itens da lista em ordem ascendente ou descendente, de
acordo com alguns de seus componentes.
9. Pesquisar a ocorrncia de um item com um valor particular em algum
componente.
0 item 8 acima objeto de um estudo cuidadoso no Captulo 3, e o item 9
ser tratado nos Captulos 4 e 5.
Um conjunto de operaes necessrio para uma aplicao exemplo a ser
apresentada mais adiante apresentado a seguir.
1. FLVazia(Lista). Faz a lista ficar vazia.
2. Insere(x, Lista). Insere x aps o ltimo item da lista.
3. Retira(p, Lista, x). Retorna o item x que est na posio p da lista,
retirando-o da lista e deslocando os itens a partir da posio p+l para
as posies anteriores.
4. Vazia(Lista). Esta funo retorna true se a lista est vazia; seno
retorna false.
5. Imprime(Lista). Imprime os itens da lista na ordem de ocorrncia.
Existem vrias estruturas de dados que podem ser usadas para representar
listas lineares, cada uma com vantagens e desvantagens particulares. As duas
representaes mais utilizadas so as implementaes atravs de arranjos e de apontadores. A implementao atravs de cursores (Aho, Hoperoft e
Ullman, 1983, pp. 48) pode ser til em algumas aplicaes.

2.37. LISTAS LINEARES

37

2.1.1 Implementao de Listas A t r a v s de Arranjos


Em um tipo estruturado arranjo, os itens da lista so armazenados em
posies contguas de memria, conforme ilustra a Figura 2.1. Neste caso a
lista pode ser percorrida em qualquer direo. A insero de um novo item
pode ser realizada aps o ltimo item com custo constante. A insero de
um novo item no meio da lista requer um deslocamento de todos os itens
localizados aps o ponto de insero. Da mesma forma, retirar um item do
incio da lista requer um deslocamento de itens para preencher o espao
deixado vazio.

Figura 2.1: Implementao de uma lista atravs de arranjo

O campo Item o principal componente do registro TipoLista mostrado


no Programa 2.1. Os itens so armazenados em um array de tamanho
suficiente para armazenar a lista. 0 campo Ultimo do registro TipoLista
contm um apontador para a posio seguinte a do ltimo elemento da lista.
0 i-simo item da lista est armazenado na i-sima posio do array, 1 < i
<Ultimo. A constante MaxTam define o tamanho mximo permitido para a
lista.
Uma possvel implementao para as cinco operaes definidas anteriormente mostrada no Programa 2.2. Observe que Lista passada como var (
por referncia), mesmo nos procedimentos em que Lista no modificada (
como, por exemplo, a funo Vazia) por razes de eficincia, porque desta
forma a estrutura Lista no copiada a cada chamada do procedimento.
A implementao de listas atravs de arranjos tem como vantagem a
economia de memria, pois os apontadores so implcitos nesta estrutura.
Como desvantagens citamos: (i) o custo para inserir ou retirar itens da lista,
que pode causar um deslocamento de todos os itens, no pior caso; (ii) em
aplicaes em que no existe previso sobre o crescimento da lista, a
utilizao de arranjos em linguagens como o Pascal pode ser problemtica
porque neste caso o tamanho mximo da lista tem que ser definido em tempo
de compilao.

38

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Programa 2.1: Estrutura da lista usando arranjo

2.1.2 Implementao de Listas Atravs de Apontadores


Em uma implementao de listas atravs de apontadores, cada item da lista
encadeado com o seguinte atravs de uma varivel do tipo Apontador. Este
tipo de implementao permite utilizar posies no contguas de memria,
sendo possvel inserir e retirar elementos sem haver necessidade de deslocar
os itens seguintes da lista.
A Figura 2.2 ilustra uma lista representada desta forma. Observe que
existe uma clula cabea que aponta para a clula que contm x1. Apesar da
clula cabea no conter informao conveniente faz-la com a mesma
estrutura que uma outra clula qualquer para simplificar as operaes sobre a
lista.
A lista constituda de clulas, onde cada clula contm um item da lista
e um apontador para a clula seguinte, de acordo com o registro Clula
mostrado no Programa 2.3. O registro TipoLista contm um apontador para a
clula cabea e um apontador para a ltima clula da lista. Uma possvel
implementao para as cinco operaes definidas anteriormente mostrada
no Programa 2.4.
A implementao atravs de apontadores permite inserir ou retirar itens
do meio da lista a um custo constante, aspecto importante quando a lista tem
que ser mantida em ordem. Em aplicaes em que no existe previso sobre o
crescimento da lista conveniente usar listas encadeadas por apontadores,
porque neste caso o tamanho mximo da lista no precisa ser definido a
priori. A maior desvantagem deste tipo de implementao a utilizao de
memria extra para armazenar os apontadores.

2.1. LISTAS LINEARES

Programa 2.2: Operaes sobre listas usando posies contguas de memria

39

40

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Programa 2.3: Estrutura da lista usando apontadores

41.1. LISTAS LINEARES

Programa 2.4: Operaes sobre listas usando apontadores

41

42

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Chave

: 1..999;
NotaFinal : 0..10;
Opo
: array [1..3] of 1..7;
Programa 2.5: Campos do registro de um candidato

Exemplo: Considere o exemplo proposto por Furtado (1984), apresentado a


seguir. Durante o exame vestibular de uma universidade, cada candidato tem
direito a 3 opes para tentar uma vaga em um dos 7 cursos oferecidos. Para
cada candidato lido um registro contendo os campos mostrados no
Programa 2.5.
O campo Chave contm o nmero de inscrio do candidato (este campo
identifica de forma nica cada registro de entrada). O campo NotaFinal
contm a mdia das notas do candidato. O campo Opo um vetor contendo a primeira, a segunda e a terceira opes de curso do candidato (os
cursos so numerados de 1 a 7).
O problema consiste em distribuir os candidatos entre os cursos, de
acordo com a nota final e as opes apresentadas por cada candidato. No
caso de empate sero atendidos primeiro os candidatos que se inscreveram
mais cedo, isto , os candidatos com mesma nota final sero atendidos na
ordem de inscrio para os exames.
Um possvel caminho para resolver o problema de distribuir os alunos
entre os cursos contm duas etapas, a saber:
1. ordenar os registros pelo campo NotaFinal, respeitando-se a ordem de
inscrio dos candidatos;
2. percorrer cada conjunto de registros com mesma NotaFinal, iniciandose pelo conjunto de NotaFinal 10, seguido do conjunto da NotaFinal 9,
e assim por diante. Para um conjunto de mesma NotaFinal tenta-se
encaixar cada registro desse conjunto em um dos cursos, na primeira
das trs opes em que houver vaga (se houver).
Um primeiro refinamento do algoritmo pode ser visto no Programa 2.6.
Para prosseguirmos na descrio do algoritmo, ns somos forados a tomar algumas decises sobre representao de dados. Uma boa maneira de
representar um conjunto de registros atravs de listas. O tipo a b s t r a t o de
dados Lista definido anteriormente, acompanhado do conjunto de operaes
definido sobre os objetos do tipo lista, mostra-se bastante adequado ao nosso
problema.
O refinamento do comando "ordena os registros pelo campo NotaFinal"
do Programa 2.6 pode ser realizado da seguinte forma: os registros ao se-rem
lidos so armazenados em listas para cada nota, conforme ilustra a

2.43. LISTAS LINEARES

43

Programa 2.6: Primeiro refinamento do programa Vestibular

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.

Figura 2.3: Classificao dos alunos por NotaFinal


Dessa estrutura passa-se para a estrutura apresentada na Figura 2.4. As
listas de registros da Figura 2.3 so percorridas, inicialmente com a lista de
NotaFinal 10, seguida da lista de NotaFinal 9, e assim sucessivamente. Ao
percorrer uma lista, cada registro retirado e colocado em uma das listas da
Figura 2.4, na primeira das trs opes em que houver vaga. Se no houver
vaga o registro colocado em uma lista de reprovados. Ao final a estrutura
da Figura 2.4 conter uma relao de candidatos aprovados em cada curso.

44

CAPTULO 44. ESTRUTURAS DE DADOS BSICAS

Programa 2.7: Segundo refinamento do programa Vestibular

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

2.1. LISTAS LINEARES

45

Programa 2.8: Estrutura da lista

sobre a implementao atravs de apontadores. O Programa 2.8 apresenta a


definio dos tipos de dados a utilizar no ltimo refinamento do algoritmo.
O refinamento final de algoritmo, descrito em Pascal, pode ser visto no
Programa 2.9. Observe que o programa completamente independente da
implementao do tipo abstrato de dados Lista. Isto significa que podemos
trocar a implementao do tipo abstrato de dados Lista de apontador para
arranjo, bastando trocar a definio dos tipos apresentada no Programa 2.8
para uma definio similar definio mostrada no Programa 2.1, acompanhada da troca dos operadores apresentados no Programa 2.4 pelos operadores apresentados no Programa 2.2. Esta substituio pode ser realizada
sem causar impacto em nenhuma outra parte do cdigo.

46

CAPITULO 2. ESTRUTURAS DE DADOS BSICAS

2.2. PILHAS

47

Este exemplo mostra a importncia de se escrever programas em funo


das operaes para manipular tipos abstratos de dados, ao invs de utilizar
detalhes particulares de implementao. Desta forma possvel alterar a
implementao das operaes rapidamente, sem haver necessidade de procurar por toda parte do cdigo onde existe referncia direta s estruturas de
dados. Este aspecto particularmente importante em programas de grande
porte.

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

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Um tipo abstrato de dados Pilha, acompanhado de um conjunto de


operaes, apresentado a seguir.
1. FPVazia(Pilha). Faz a pilha ficar vazia.
2. Vazia(Pilha). Esta funo retorna true se a pilha est vazia; seno
retorna false.
3. Empilha(x, Pilha). Insere o item x no topo da pilha.
4. Desempilha(Pilha, x). Retorna o item x no topo da pilha, retirando-o
da pilha.
5. Tamanho(Pilha). Esta funo retorna o nmero de itens da pilha.
Como no caso do tipo abstrato de dados Lista apresentado na Seo 2.1,
existem vrias opes de estruturas de dados que podem ser usadas para
representar pilhas. As duas representaes mais utilizadas so as implementaes atravs de arranjos e de apontadores.

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.

Figura 2.5: Implementao de uma pilha atravs de arranjo


O campo Item o principal componente do registro TipoPilha mostrado
no Programa 2.10. Os itens so armazenados em um array de tamanho

2.2. PILHAS

49

Programa 2.10: Estrutura da pilha usando arranjo

suficiente para armazenar a pilha. 0 outro campo do mesmo registro contm


um apontador para o item no topo da pilha. A constante MaxTam define o
tamanho mximo permitido para a pilha.
As cinco operaes definidas sobre o TipoPilha podem ser implementadas
conforme ilustra o Programa 2.11. Observe que Pilha passada como var (
por referncia), mesmo nos procedimentos em que Pilha no modificada (
como, por exemplo, a funo Vazia) por razes de eficincia, pois desta
forma a estrutura Pilha no copiada a cada chamada do procedimento ou
funo.
2.2.2 Implementao de Pilhas Atravs de Apontadores
Assim como na implementao de listas lineares atravs de apontadores, uma
clula cabea mantida no topo da pilha para facilitar a implementao das
operaes empilha e desempilha quando a pilha est vazia, conforme ilustra a
Figura 2.6. Para desempilhar o item xn da Figura 2.6 basta desligar a clula
cabea da lista e a clula que contm xn passa a ser a clula cabea. Para
empilhar um novo item basta fazer a operao contrria, criando uma nova
clula cabea e colocando o novo item na antiga clula cabea. 0 campo
Tamanho existe no registro TipoPilha por questo de eficincia, para evitar
a contagem do nmero de itens da pilha na funo Tamanho.
Cada clula de uma pilha contm um item da pilha e um apontador para
outra clula, conforme ilustra o Programa 2.12. 0 registro TipoPilha contm
um apontador para o topo da pilha (clula cabea) e um apontador para o
fundo da pilha.
As cinco operaes definidas anteriormente podem ser implementadas
atravs de apontadores, conforme ilustra o Programa 2.13.

50

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

2.2. PILHAS

51

52

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Programa 2.13: Operaes sobre pilhas usando apontadores

2.2. PILHAS

53

Exemplo: Editor de Textos.


Alguns editores de texto permitem que algum caractere funcione como um "
cancela-caractere", cujo efeito o de cancelar o caractere anterior na linha
que est sendo editada. Por exemplo, se o cancela-caractere, ento a
seqncia de caracteres UEM##FMB#G corresponde seqncia UFMG.
Outro comando encontrado em editores de texto o "cancela-linha", cujo
efeito o de cancelar todos os caracteres anteriores na linha que est sendo
editada. Neste exemplo vamos considerar como o caractere cancela-linha.
Finalmente, outro comando encontrado em editores de texto o "salta-linha"
, cujo efeito o de causar a impresso dos caracteres que pertencem linha
que est sendo editada, iniciando uma nova linha de impresso a partir do
caractere imediatamente seguinte ao caractere salta-linha. Por exemplo, se `
@' o salta-linha, ento a seqncia de caracteres DCC@UFMG.@ corresponde s duas linhas abaixo:
DCC
UFMG.
Vamos escrever um Editor de Texto (ET) que aceite os trs comandos
descritos acima. O ET dever ler um caractere de cada vez do texto de
entrada e produzir a impresso linha a linha, cada linha contendo no mximo
70 caracteres de impresso. O ET dever utilizar o tipo abstrato de dados
Pilha definido anteriormente, implementado atravs de arranjo.
A implementao do programa ET apresentada no Programa 2.14. Da
mesma forma que o programa Vestibular, apresentado na Seo 2.1, este
programa utiliza um tipo abstrato de dados sem conhecer detalhes de sua
implementao. Isto significa que a implementao do tipo abstrato de dados
Pilha que utiliza arranjo pode ser substituda pela implementao que utiliza
apontadores mostrada no Programa 2.13, sem causar impacto no programa.
O procedimento Imprime, mostrado no Programa 2.15, utilizado pelo
programa ET.
A seguir sugerido um texto para testar o programa ET, cujas caractersticas permite exercitar todas as partes importantes do programa.

54

CAPITULO 4. ESTRUTURAS DE DADOS BSICAS

Programa 2.14: Implementao do ET

2.5. FILAS

55

Programa 2.15: Procedimento Imprime utilizado no programa ET

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

CAPTULO 6. ESTRUTURAS DE DADOS BSICAS

Figura 2.7: Implementao circular para filas

2.3.1 Implementao de Filas Atravs de Arranjos


Em uma implementao atravs de arranjos os itens so armazenados em
posies contguas de memria. Devido s caractersticas da fila, a operao
enfileira faz a parte de trs da fila expandir-se, e a operao Desenfileira
faz a parte da frente da fila contrair-se. Conseqentemente, a fila tende a
caminhar pela memria do computador, ocupando espao na parte de trs e
descartando espao na parte da frente. Com poucas inseres e retiradas de
itens a fila vai de encontro ao limite do espao da memria alocado para
ela.
A soluo para o problema de caminhar pelo espao alocado para uma fila
imaginar o array como um crculo, onde a primeira posio segue a ltima,
conforme ilustra a Figura 2.7. A fila se encontra em posies contguas de
memria, em alguma posio do crculo, delimitada pelos apontadores Frente
e Trs. Para enfileirar um item basta mover o apontador Trs uma posio
no sentido horrio; para desenfileirar um item basta mover o apontador
Frente uma posio no sentido horrio.
O campo Item o principal componente do registro TipoFila mostrado
no Programa 2.16. 0 tamanho mximo do array circular definido pela
constante MaxTam. Os outros campos do registro TipoPilha contm apontadores para a parte da frente e de trs da fila.
As quatro operaes definidas sobre o TipoFila podem ser implementadas
conforme ilustra o Programa 2.17. Observe que para a representao circular
da Figura 2.7 existe um pequeno problema: no h uma forma de distinguir
uma fila vazia de uma fila cheia, pois nos dois casos os apontadores Frente
e trs apontam para a mesma posio do crculo. Uma possvel sada para
este problema, utilizada por Aho, Hoperoft e Ullman (1983, p.58), no
utilizar todo o espao do array, deixando uma posio vazia. Neste caso a
fila est cheia quando Trs+1 for igual a Frente, o que significa que existe
uma clula vazia entre o fim e o incio da fila.
Observe que a implementao do vetor circular realizada atravs de
aritmtica modular. A aritmtica modular utilizada nos procedimentos
Enfileira e Desenfileira do Programa 2.17, atravs da funo mod do Pascal.

2.7. FILAS

57

58

CAPTULO 8. ESTRUTURAS DE DADOS BSICAS

2.3.2 Implementao de Filas Atravs de Apontadores


Assim como em todas as outras implementaes deste captulo, uma clula
cabea mantida para facilitar a implementao das operaes Enfileira e
Desenfileira quando a fila est vazia, conforme ilustra a Figura 2.8. Quando
a fila est vazia os apontadores Frente e trs apontam para a clula cabea.
Para enfileirar um novo item basta criar uma clula nova, lig-la aps a
clula que contm xn e colocar nela o novo item. Para desenfileirar o item x1
basta desligar a clula cabea da lista e a clula que contm x1 passa a ser a
clula cabea.

Figura 2.8: Implementao de uma fila atravs de apontadores

A fila implementada atravs de clulas, onde cada clula contm um


item da fila e um apontador para outra clula, conforme ilustra o Pro-grama
2.18. 0 registro TipoFila contm um apontador para a frente da fila (clula
cabea) e um apontador para a parte de trs da fila.
As quatro operaes definidas sobre o TipoFila podem ser implementadas
conforme ilustra o programa 2.19.

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

Programa 2.18: Estrutura da fila usando apontadores

2) Um problema que pode surgir na manipulao de listas lineares simples


o de "voltar" atrs na lista, ou seja, percorr-la no sentido inverso ao
dos apontadores. A soluo geralmente adotada a incorporao
clula de um apontador para o seu antecessor. Listas deste tipo so
chamadas de duplamente encadeadas. A Figura 2.9 mostra uma lista
deste tipo com estrutura circular e a presena de uma clula cabea.
a) Declare os tipos necessrios para a manipulao da lista.
b) Escreva um procedimento em Pascal para retirar da lista a clula
apontada por p:
procedure Retira (p: Apontador; var L: TipoLista);
No deixe de considerar eventuais casos especiais.
3) Matrizes Esparsas Utilizao de Listas Atravs de Apontadores (rabe, 1992)
Matrizes esparsas so matrizes nas quais a maioria das posies so
preenchidas por zeros. Para estas matrizes, podemos economizar um
espao significativo de memria se apenas os termos diferentes de zero
forem armazenados. As operaes usuais sobre estas matrizes (somar,
multiplicar, inverter, pivotar) tambm podem ser feitas em tempo
muito menor se no armazenarmos as posies que contm zeros.
Uma maneira eficiente de representar estruturas com tamanho varivel
e/ou desconhecido atravs de alocao encadeada, utilizando listas.
Vamos usar esta representao para armazenar as matrizes esparsas.

60

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Programa 2.19: Operaes sobre filas usando apontadores

EXERCCIOS

61

Figura 2.9: Lista circular duplamente encadeada

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

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

Figura 2.10: Exemplo de Matriz Esparsa

A representao da matriz A pode 'ser vista na Figura 2.10.


Com esta representao, uma matrix esparsa m x n com r elementos
diferentes de zero gastar (m+n+r) clulas. E bem verdade que cada
clula ocupa vrios bytes na memria; no entanto, o total de memria
usado ser menor do que as m x n posies necessrias para representar
a matriz toda, desde que r seja suficientemente pequeno.
Dada a representao acima, o trabalho consiste em desenvolver cinco
procedimentos em Pascal, conforme especificao abaixo:
a) procedure LeMatriz (var A: Matriz);
Este procedimento l de algum arquivo de entrada os elementos
diferentes de zero de uma matriz e monta a estrutura especificada
acima. Considere que a entrada consiste dos valores de m e n (
nmero de linhas e de colunas da matriz) seguidos de triplas (i, j,
valor) para os elementos diferentes de zero da matriz. Por

EXERCCIOS

63

exemplo, para a matriz acima, a entrada seria:


4,
1,
2,
2,
4,
4,
4,

4
1,
1,
3,
1,
3,
4,

50.0
10.0
20.0
-30.0
-60.0
5.0

b) procedure ApagaMatriz (var A: Matriz);


Este procedimento devolve todas as clulas da matriz A para a
rea de memria disponvel (use a procedure dispose).
c) procedure SomaMatriz (var A, B, C: Matriz);
Este procedimento recebe como parmetros as matrizes A e B,
devolvendo em C a soma de A com B.
d) procedure MultiplicaMatriz (var A, B, C: Matriz);
Este procedimento recebe como parmetros as matrizes A e B,
devolvendo em C o produto de A por B.
e) procedure ImprimeMatriz (var A: Matriz);
Este procedimento imprime (uma linha da matriz por linha da
sada) a matriz A, inclusive os elementos iguais a zero.
Para inserir e retirar clulas das listas que formam a matriz, crie procedimentos especiais para este fim. Por exemplo, um procedimento

procedure Insere (i, j: integer; v: real; var A: Matriz);


para inserir o valor v na linha i, coluna j da matriz A ser til tanto na
procedure LeMatriz quanto na procedure SomaMatriz.
As matrizes a serem lidas para testar os procedimentos so:
a) A mesma da Figura 2.10 deste enunciado;

64

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS


Os procedimentos devero ser testados com o seguinte programa:

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

e os dois testes P=vazio e F=vazio, escreva um algoritmo para reverter


a ordem dos elementos em F.

EXERCCIOS

65

5) Duas pilhas podem coexistir em um mesmo vetor, uma crescendo em


um sentido, e a outra no outro. Duas filas, ou uma pilha e uma fila
podem tambm ser alocadas no mesmo vetor com o mesmo grau de
eficincia ? Por qu ?
6) Como resolver o problema da representao por alocao seqencial
(usando uma regio fixa de memria) para mais de duas pilhas ?
7) Alterao do ET
Alterar a especificao do programa ET, apresentado na seo 2.2.2,
para aceitar o comando cancela palavra, cujo efeito cancelar a palavra
anterior na linha que est sendo editada. Por exemplo, se `$' o
CancelaPalavra, ento a seqncia de caracteres NO CANCELA$$
CANCELA LINHA$ PALAVRA corresponde seqncia CANCELA
PALAVRA.
Altere o programa de acordo com a nova especificao proposta. Para
testar o programa utilize o texto da pgina 53, com as seguintes alteraes:
a) insira o caractere $ aps a palavra "extras" na terceira linha,
b) insira dois caracteres $$ aps as palavras "Ser que" na penltima
linha do texto.
8) Existem partes de sistemas operacionais que cuidam da ordem em que
os programas devem ser executados. Por exemplo, em um sistema de
computao de tempo-compartilhado ("time-shared") existe a necessidade de manter um conjunto de processos em uma fila, esperando para
serem executados.
Escreva um programa em Pascal que seja capaz de ler uma srie de
solicitaes para: (i) incluir novos processos na fila de processos; (ii)
retirar da fila o processo com o maior tempo de espera; (iii) imprimir o
contedo da lista de processos em um determinado momento. Assuma
que cada processo representado por um registro composto por um
nmero identificador do processo. Utilize o tipo abstrato de dados Fila
apresentado na Seo 2.3.
9) Se voc tem que escolher entre uma representao por lista encadeada
ou uma representao usando posies contguas de memria para um
vetor, quais informaes so necessrias para voc selecionar uma
representao apropriada? Como estes fatores influenciam a escolha da
representao?

66

CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

10) Filas, Simulao (rabe, 1992)


O objetivo deste exerccio simular os padres de aterrissagem e decolagem em um aeroporto. Suponha um aeroporto que possui 3 pistas,
numeradas 1, 2 e 3. Existem 4 (quatro) "prateleiras" de espera para
aterrissagem, duas para cada uma das pistas 1 e 2. Aeronaves que se
aproximam do aeroporto devem se integrar a uma das prateleiras (filas)
de espera, sendo que estas filas devem procurar manter o mesmo
tamanho. Assim que um avio entra em uma fila de aterrissagem, ele
recebe um nmero de identificao ID e um outro nmero inteiro que
indica o nmero de unidades de tempo que o avio pode permanecer na
fila antes que ele tenha que descer (do contrrio seu combustvel
termina e ele cai).
Existem tambm filas para decolagem, uma para cada pista. Os avies
que chegam nestas filas tambm recebem uma identificao ID. Estas
filas tambm devem procurar manter o mesmo tamanho.
A cada unidade de tempo, de 0 a 3 aeronaves podem chegar nas filas
de decolagem e de 0 a 3 aeronaves podem chegar nas prateleiras. A
cada unidade de tempo, cada pista pode ser usada para um pouso ou
uma decolagem. A pista 3 em geral s usada para decolagens, a no
ser que um dos avies nas prateleiras fique sem combustvel, quando
ento ela deve ser imediatamente usada para pouso. Se apenas uma
aeronave est com falta de combustvel, ela pousar na pista 3; se mais
de um avio estiver nesta situao, as outras pistas podero ser
utilizadas (a cada unidade de tempo no mximo 3 avies podero estar
nesta desagradvel situao).
Utilize inteiros pares (mpares) sucessivos para a ID dos avies chegando nas filas de decolagem (aterrissagem). A cada unidade de tempo,
assuma que os avies entram nas filas antes que aterrissagem ou decolagens ocorram. Tente projetar um algoritmo que no permita o
crescimento excessivo das filas de aterrissagem ou decolagem. Coloque
os avies sempre no final das filas, que no devem ser reordenadas.
A sada do programa dever indicar o que ocorre a cada unidade de
tempo. Periodicamente imprima:
a) o contedo de cada fila;
b) o tempo mdio de espera para decolagem;
c) o tempo mdio de espera para aterrissagem; e
d) o nmero de avies que aterrissam sem reserva de combustvel.
Os itens b e c acima devem ser calculados para os avies que j decolaram ou pousaram, respectivamente. A sada do programa deve ser
auto-explicativa e fcil de entender.

EXERCCIOS

67

A entrada poderia ser criada manualmente, mas o melhor utilizar um


gerador de nmeros aleatrios. Para cada unidade de tempo, a entrada
deve ter as seguintes informaes:
a) nmero de avies (0-3) chegando nas filas de aterrissagem com
respectivas reservas de combustvel (de 1 a 20 em unidades de
tempo);
b) nmero de avies (0-3) chegando nas filas de decolagem.
0 que deve ser apresentado:
a) Listagem dos programas 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 dos programas como um todo (notao O).

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

CAPITULO 20. ORDENAO

Programa 3.1: Estrutura de um item do arquivo

em que os funcionrios com mesmo salrio aparecem em ordem alfabtica.


Alguns dos mtodos de ordenao mais eficientes no so estveis. Se a estabilidade importante ela pode ser forada quando o mtodo no-estvel.
Sedgewick (1988) sugere agregar um pequeno ndice a cada chave antes de
ordenar, ou ento aumentar a chave de alguma outra forma.
Os mtodos de ordenao so classificados em dois grandes grupos. Se o
arquivo a ser ordenado cabe todo na memria principal, ento o mtodo de
ordenao chamado de ordenao interna. Neste caso o nmero de
registros a ser ordenado pequeno o bastante para caber em um array do
Pascal. Se o arquivo a ser ordenado no cabe na memria principal e, por
isso, tem que ser armazenado em fita ou disco, ento o mtodo de ordenao
chamado de ordenao externa. A principal diferena entre os dois
mtodos que, em um mtodo de ordenao interna, qualquer registro pode
ser imediatamente acessado, enquanto, em um mtodo de ordenao externa,
os registros so acessados seqencialmente ou em grandes blocos.
A grande maioria dos mtodos de ordenao so baseados em comparaes das chaves. Os mtodos a serem apresentados a seguir so deste
tipo. Entretanto, existem mtodos de ordenao que utilizam o princpio da
distribuio. Por exemplo, considere o problema de ordenar um baralho
com 52 cartas no ordenadas. Suponha que ordenar o baralho implica em
colocar as cartas de acordo com a ordem

Para ordenar por distribuio, basta seguir os passos abaixo:


1. Distribuir as cartas abertas em 13 montes, colocando em cada monte
todos os ases, todos os dois, todos os trs, ..., todos os reis.
2. Colete os montes na ordem acima (s no fundo, depois os dois, etc.),
at o rei ficar no topo).
3. Distribua novamente as cartas abertas em 4 montes, colocando em
cada monte todas as cartas de paus, todas as cartas de ouros, todas as
cartas de copas e todas as cartas de espadas.

3.21. ORDENAO INTERNA

71

4. Colete os montes na ordem indicada acima (paus, ouros, copas e espadas).


Mtodos como o ilustrado acima so tambm conhecidos como ordenao digital, radixsort ou bucketsort. Neste caso no existe comparao entre
chaves. As antigas classificadoras de cartes perfurados tambm utilizam o
princpio da distribuio para ordenar uma massa de cartes. Uma das
dificuldades de implementar este mtodo est relacionada com o problema
de lidar com cada monte. Se para cada monte ns reservarmos uma rea,
ento a demanda por memria extra pode se tornar proibitiva. 0 custo para
ordenar um arquivo com n elementos da ordem de 0(n), pois cada elemento
manipulado algumas vezes.
0 principal objetivo deste captulo apresentar os mtodos de ordenao
mais importantes sob o ponto de vista prtico. Cada mtodo ser apresentado atravs de um exemplo, e o algoritmo associado ser refinado at o nvel
de um procedimento Pascal executvel. A seguir vamos estudar os principais
mtodos de ordenao atravs de comparaes de chaves.

3.1 Ordenao Interna


0 aspecto predominante na escolha de um algoritmo de ordenao o tempo
gasto para ordenar um arquivo. Para algoritmos de ordenao interna as
medidas de complexidade relevantes contam o nmero de comparaes entre
chaves e o nmero de movimentaes (ou trocas) de itens do arquivo. Seja C
uma funo de complexidade tal que C(n) o nmero de comparaes entre
chaves, e seja M uma funo de complexidade tal que M(n) o nmero de
movimentaes de itens no arquivo, onde n o nmero de itens do arquivo.
A quantidade extra de memria auxiliar utilizada pelo algoritmo tambm um aspecto importante. 0 uso econmico da memria disponvel um
requisito primordial na ordenao interna. Os mtodos que utilizam a
estrutura vetor e que executam a permutao dos itens no prprio vetor,
exceto para a utilizao de uma pequena tabela ou -pilha, so os preferidos.
Os mtodos que utilizam listas encadeadas necessitam n palavras extras de
memria para os apontadores, e so utilizados apenas em algumas situaes
especiais. Os mtodos que necessitam de uma quantidade extra de memria
para armazenar uma outra cpia dos itens a serem ordenados possuem menor
importncia.
Os mtodos de ordenao interna so classificados em mtodos simples e
mtodos eficientes. Os mtodos simples so adequados para pequenos arquivos e requerem 0(n2) comparaes, enquanto os mtodos eficientes so
adequados para arquivos maiores e requerem 0 ( n log n) comparaes. Os
mtodos simples produzem programas pequenos, fceis de entender, ilustrando com simplicidade os princpios de ordenao por comparao. Alm

C A P T U L O 2 2 . ORDENAO

72

Programa 3.2: Tipos utilizados na implementao dos algoritmos

do mais, existe um grande nmero de situaes em que melhor usar os


mtodos simples do que usar os mtodos mais sofisticados. Apesar de os
mtodos mais sofisticados usarem menos comparaes, estas comparaes
so mais complexas nos detalhes, o que torna os mtodos simples mais eficientes para pequenos arquivos.
Na implementao dos algoritmos de ordenao interna, sero utilizados o
tipo de dados ndice, o tipo de dados Vetor e a varivel A apresentados no
Programa 3.2. 0 tipo Vetor do tipo estruturado arranjo, composto por uma
repetio do tipo de dados Item apresentado anteriormente no Programa 3.1.
Repare que o ndice do vetor vai de 0 at n , para poder armazenar chaves
especiais chamadas sentinelas.

3.1.1 Ordenao por Seleo


Um dos algoritmos mais simples de ordenao o mtodo j apresentado na
Seo 1.4, cujo princpio de funcionamento o seguinte: 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, at que reste apenas um elemento. 0 mtodo ilustrado para o
conjunto de seis chaves apresentado na Figura 3.1. As chaves em negrito
sofreram uma troca entre si.
1
Chaves iniciais: O
i= 2
A
i=3
A
i=4
A
i=5
A
i=6
A

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

Figura 3.1: Exemplo de ordenao por seleo

O Programa 3.3 mostra a implementao do algoritmo, para um conjunto


de itens implementado como um tipo Vetor.

3.1. ORDENAO INTERNA

73

O comando de atribuio Min := j executado em mdia cerca de n log


n vezes, conforme pode ser verificado em Knuth (1973, exerccios 5.2.3.3-6)
. Este valor difcil de obter exatamente: ele depende do nmero de vezes que
c, menor do que todas as chaves anteriores cl, c2, ..., quando estamos
percorrendo as chaves c1, c2, ... , c, .
0 algoritmo de ordenao por seleo um dos mtodos de ordenao
mais simples que existem. Alm disso, o mtodo possui um comportamento
espetacular quanto ao nmero de movimentos de registros, cujo tempo de
execuo linear no tamanho da entrada, o que muito difcil de ser batido
por qualquer outro mtodo. Conseqentemente, este o algoritmo a ser
utilizado para arquivos com registros muito grandes. Em condies normais,
com chaves do tamanho de uma palavra, este mtodo bastante interessante
para arquivos com at 1000 registros.
Como aspectos negativos cabe registrar que: (i) o fato do arquivo j estar
ordenado no ajuda em nada pois o custo continua quadrtico; (ii) o
algoritmo no estvel, pois ele nem sempre deixa os registros com chaves
iguais na mesma posio relativa.

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

ilustrado para as mesmas seis chaves utilizadas anteriormente, conforme


apresentado na Figura 3.2. As chaves em negrito representam a seqncia
destino.

Figura 3.2: Exemplo de ordenao por insero


0 Programa 3.4 mostra a implementao do algoritmo, para um conjunto
de itens implementado como um tipo Vetor. A colocao do item no seu lugar
apropriado na seqncia destino realizada movendo-se itens com chaves
maiores para a direita e ento inserindo o item na posio deixada vazia.
Neste processo de alternar comparaes e movimentos de registros existem
duas condies distintas que podem causar a terminao do processo: (i) um
item com chave menor que o item em considerao encontrado; (ii) o final
da seqncia destino atingido esquerda. A melhor soluo para a situao
de um anel com duas condies de terminao a utilizao de um registro
sentinela: na posio zero do vetor colocamos o prprio registro em
considerao. Para tal o ndice do vetor tem que ser estendido para 0..n.
Anlise
No anel mais interno, na i-sima iterao o valor de Ci :

3.1. ORDENAO INTERNA

75

O nmero mnimo de comparaes e movimentos ocorre quando os itens


esto originalmente em ordem, e o nmero mximo ocorre quando os itens
esto originalmente na ordem reversa, o que indica um comportamento natural para o algoritmo. Para arquivos j ordenados o algoritmo descobre a
um custo 0(n) que cada item j est no seu lugar. Logo, o mtodo da
insero o mtodo a ser utilizado quando o arquivo est "quase" ordenado. E
tambm um bom mtodo quando se deseja adicionar uns poucos itens a um
arquivo j ordenado e depois obter um outro arquivo ordenado: neste caso o
custo linear. O algoritmo de ordenao por insero quase to simples
quanto o algoritmo de ordenao por seleo. Alm disso, o mtodo de
ordenao por insero estvel, pois ele deixa os registros com chaves
iguais na mesma posio relativa.

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.

Figura 3.3: Exemplo de ordenao usando Shellsort

Na primeira passada (h = 4), o O comparado com o N (posies 1 e 5) e


trocados; a seguir o R comparado com o A (posies 2 e 6) e trocados. Na
segunda passada (h = 2), N, D e O, nas posies 1, 3 e 5, so rearranjados
para resultar em D, N e O nestas mesmas posies; da mesma forma A, E e
R, nas posies 2, 4 e 6, so comparados e mantidos nos seus lugares. A
ltima passada (h = 1) corresponde ao algoritmo de insero: entretanto,
nenhum item tem que se mover para posies muito distantes.
Vrias seqncias para h tm sido experimentadas. Knuth (1973, p.95)
mostrou experimentalmente que a escolha do incremento para h, mostrada
abaixo, difcil de ser batida por mais de 20% em eficincia no tempo de
execuo:

A seqncia para h corresponde a 1, 4, 13, 40, 121, 364, 1093, 3280, .... O
Programa 3.5 mostra a implementao do algoritmo, para a seqncia
mostrada acima. Observe que no foram utilizados registros sentinelas
porque teramos que utilizar h sentinelas, uma para cada h-ordenaes.

Anlise
A razo pela qual este mtodo eficiente ainda no conhecida, porque
ningum ainda foi capaz de analisar o algoritmo. A sua anlise contm al-

3.1. ORDENAO INTERNA

77

guns problemas matemticos muito difceis, a comear pela prpria seqncia


de incrementos: o pouco que se sabe que cada incremento no deve ser
mltiplo do anterior. Para a seqncia de incrementos utilizada no Programa 3.5 existem duas conjeturas para o nmero de comparaes, a saber:

Shellsort uma tima opo para arquivos de tamanho moderado (da


ordem de 5000 registros), mesmo porque sua implementao simples e
requer uma quantidade de cdigo pequena. Existem mtodos de ordenao
mais eficientes, mas so tambm muito mais complicados para implementar.
O tempo de execuo do algoritmo sensvel ordem inicial do arquivo.
Alm disso o mtodo no estvel, pois ele nem sempre deixa registros com
chaves iguais na mesma posio relativa.

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:

3.29. ORDENAO INTERNA

79

80

CAPITULO 30. ORDENAO

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.

3.31. ORDENAO INTERNA

81

A melhor situao possvel ocorre quando cada partio divide o arquivo


em duas partes iguais. Logo,
C(n) = 2C(n/2) + n
onde C ( n / 2 ) representa o custo de ordenar uma das metades e n o custo
de examinar cada item. A soluo para esta recorrncia
C ( n ) 1 , 4 n logn
o que significa que em mdia o tempo de execuo do Quicksort O ( n log n ) .
Quicksort extremamente eficiente para ordenar arquivos de dados. O
mtodo necessita de apenas uma pequena pilha como memria auxiliar, e
requer cerca de n log n operaes em mdia para ordenar n itens. Como
aspectos negativos cabe ressaltar que: (i) a verso recursiva do algoritmo
tem um pior caso que 0(n2) operaes; (ii) a implementao do algoritmo
muito delicada e :difcil: um pequeno engano pode levar a efeitos inesperados
para algumas entradas de dados; (iii) o mtodo no estvel.
Uma vez que se consiga uma implementao robusta para o Quicksort,
este deve ser o algoritmo preferido para a maioria das aplicaes. No caso
de se necessitar de um programa utilitrio para uso freqente, ento vale a
pena investir na obteno de uma implementao do algoritmo. Por exemplo,
como evitar o pior caso do algoritmo? A melhor soluo para este caso
escolher trs itens quaisquer do arquivo e usar a mediana dos trs como o
item divisor na partio.

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

CAPTULO 32. ORDENAO

82

(o mais velho). Em muitas situaes necessrio uma estrutura de dados que


suporte as operaes de inserir um novo item e retirar o item com a maior
chave. Tal estrutura de dados chamada fila de prioridades, porque a chave
de cada item reflete sua habilidade relativa de abandonar o conjunto de itens
rapidamente.
Filas de prioridades so utilizadas em um grande nmero de aplicaes.
Sistemas operacionais usam filas de prioridades, onde as chaves representam o
tempo em que eventos devem ocorrer. Alguns mtodos numricos iterativos
so baseados na seleo repetida de um item com maior (menor) valor.
Sistemas de gerncia de memria usam a tcnica de substituir a pgina menos utilizada na memria principal do computador por uma nova pgina.
As operaes mais comuns sobre o tipo fila de prioridades so: adicionar
um novo item ao conjunto e extrair o item do conjunto que contenha o maior
(menor) valor. Entretanto, filas de prioridades permitem a execuo de um
grande nmero de operaes de forma eficiente. Um tipo abstrato de dados
Fila de Prioridades, contendo registros com chaves numricas (prioridades),
deve suportar algumas das seguintes operaes:
1. Constri uma fila de prioridades a partir de um conjunto com n itens.
2. Insere um novo item.
3. Retira o item com maior chave.
4. Substitui o maior item por um novo item, a no ser que o novo item
seja maior.
5. Altera a prioridade de um item.
6. Remove um item qualquer.
7. Ajunta duas filas de prioridades em uma nica.
A nica diferena entre a operao substitui e as operaes encadeadas
insere/retira que as operaes encadeadas fazem com que a fila de prioridades aumente temporariamente de tamanho. A operao constri equivalente ao uso repetido da operao insere, e a operao altera equivalente
a operao remove seguida de insere.
Uma representao bvia para uma fila de prioridades uma lista linear
ordenada. Neste caso Constri leva tempo O(n log n), insere 0(n) e retira 0(
1). Outra representao atravs de uma lista linear no ordenada, na qual a
operao constri tem custo linear, insere 0(1), retira 0(n) e ajunta 0(1)
para implementaes atravs de apontadores e 0(n) para implementaes
atravs de arranjos, onde n representa o tamanho da menor fila de
prioridades.

3.33. ORDENAO INTERNA

83

Filas de prioridades podem ser melhor representadas por estruturas de


dados chamadas heaps. A operao constri tem custo linear, e insere, retira,
substitui e altera tem custo logartmico. Para implementar a operao ajunta
de forma eficiente e ainda preservar um custo logartmico para as operaes
insere, retira, substitui e altera necessrio utilizar estruturas de dados mais
sofisticados, tais como rvores binomiais (Vuillemin, 1978).
Qualquer algoritmo para filas de prioridades pode ser transformado em
um algoritmo de ordenao, atravs do uso repetido da operao insere para
construir a fila de prioridades, seguido do uso repetido da operao retira
para receber os itens na ordem reversa. Neste esquema, o uso de listas
lineares no ordenadas corresponde ao mtodo da seleo; o uso de listas
lineares ordenadas corresponde ao mtodo da insero; o uso de heaps
corresponde ao mtodo Heapsort.
Heaps
Uma estrutura de dados eficiente para suportar as operaes constri, insere,
retira, substitui e altera o heap, proposta por Williams (1964). Um heap
definido como uma seqncia de itens com chaves
c[1], c[2], ... , c[
n] tal que
c[i] > c[2i]
c[i] > c[2i + 1]
para todo i = 1, 2, ... , n / 2 . Esta ordem pode ser facilmente visualizada se a
seqncia de chaves for desenhada em uma rvore binria, onde as linhas que
saem de uma chave levam a duas chaves menores no nvel inferior, conforme
ilustra a Figura. 3.6. Esta estrutura conhecida como uma rvore binria
completa1: o primeiro nodo chamado raiz, os nodos abaixo de cada nodo
so chamados nodos filhos, e o nodo acima de cada nodo chamado nodo
pai. Um estudo mais detalhado de rvores ser apresentado no Captulo 4.
Observe que as chaves na rvore da Figura 3.6 satisfazem a condio do
heap: a chave em cada nodo maior do que as chaves em seus filhos, se eles
existirem. Conseqentemente, a chave no nodo raiz a maior chave do
conjunto.
' Uma rvore binria completa uma rvore binria com os nodos numerados de 1 a n, onde o nodo Lk/2
j o pai do nodo k, para 1 < k < n. Em outras palavras, em uma rvore binria completa os nodos externos
aparecem em dois nveis adjacentes e os nodos no nvel mais baixo esto posicionados mais esquerda.

84

CAPITULO 3. ORDENAO

Figura 3.6: rvore binria completa

Uma rvore binria completa pode ser representada por um array,


conforme ilustra a Figura 3.7. Esta representao extremamente compacta
e, alm disso, permite caminhar pelos nodos da rvore facilmente: os filhos
de um nodo i esto nas posies 2i e 2i + 1 (caso existam), e o pai de um
nodo i est na posio i div 2.

Figura 3.7: rvore binria completa representada por um arranjo


Um heap uma rvore binria completa na qual cada nodo satisfaz a
condio do heap apresentada acima. No caso da representao do heap por
um arranjo, a maior chave est sempre na posio 1 do vetor. Os algoritmos
para implementar as operaes sobre o heap operam ao longo de um dos
caminhos da rvore, a partir da raiz at o nvel inferior da rvore.

3.1. ORDENAO INTERNA

85

86

CAPTULO 3. ORDENAO

A partir do heap obtido pelo procedimento Constri, pega-se o item na


posio 1 do vetor (raiz do heap) e troca-se com o item que est na posio n
do vetor. A seguir, basta usar o procedimento Refaz para reconstituir o heap
para os itens A[1], A[2], ..., A[n -1]. Repita estas duas operaes com os n
1 itens restantes, depois com os n 2 itens, at que reste apenas um item.
Este mtodo exatamente o que o Heapsort faz, conforme ilustra a Figura 3.
9. 0 caminho seguido pelo procedimento Refaz para reconstituir a condio
do heap est em negrito. Por exemplo, aps a troca dos itens S e D na
segunda linha da Figura 3.9, o item D volta para a posio 5 aps passar
pelas posies 1 e 2.

Figura 3.9: Exemplo de ordenao usando Heapsort

O Programa 3.9 mostra a implementao do algoritmo, para um conjunto


de itens implementado como um tipo Vetor.

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.

3.37. ORDENAO INTERNA

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

CAPTULO 38. ORDENAO

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

Tabela 3.1: Ordem aleatria dos registros

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

Tabela 3.2: Ordem ascendente dos registros

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

Tabela 3.3: Ordem descendente dos registros

A seguir, apresentamos algumas observaes sobre cada um dos mtodos.


1. Shellsort, Quicksort e Heapsort tm a mesma ordem de grandeza.
2. O Quicksort o mais rpido para todos os tamanhos aleatrios experimentados.
3. A relao Heapsort/Quicksort se mantm constante para todos os tamanhos, sendo o Heapsort mais lento.
4. A relao Shellsort/Quicksort aumenta medida que o nmero de elementos aumenta; para arquivos pequenos (500 elementos) o Shellsort
mais rpido que o Heapsort, porm quando o tamanho da entrada cresce,
esta relao se inverte.
5. O Insero o mais rpido para qualquer tamanho se os elementos esto
ordenados; este seu melhor caso, que 0(n). Ele o mais lento para
qualquer tamanho se os elementos esto em ordem descendente; este o
seu pior caso.

3.1. ORDENAO INTERNA

89

6. Entre os algoritmos de custo 0(n2) o Insero melhor para todos os


tamanhos aleatrios experimentados.
A Tabela 3.4 mostra a influncia da ordem inicial do arquivo sobre cada
um dos trs mtodos mais eficientes. Ao observar a tabela podemos notar
que:
Shellsort
Asc
Des
Ale

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

T a b e l a 3.4: Influncia da ordem inicial

1. O Shellsort bastante sensvel ordenao ascendente ou descendente


da entrada; para arquivos do mesmo tamanho executa mais rpido se o
arquivo estiver ordenado do que se os elementos forem aleatrios.
2. O Quicksort sensvel ordenao ascendente ou descendente da entrada; para arquivos do mesmo tamanho executa mais rpido se o
arquivo estiver ordenado do que se os elementos forem aleatrios. Ele
o mais rpido para qualquer tamanho se os elementos esto em ordem
ascendente.
3. O Heapsort praticamente no sensvel ordenao da entrada; para
arquivos do mesmo tamanho executa 10% mais rpido se o arquivo
estiver ordenado do que se os elementos forem aleatrios.
O mtodo da Insero o mais interessante para arquivos com menos do
que 20 elementos, podendo ser mais eficiente do que algoritmos que tenham
comportamento assinttico mais eficiente. O mtodo estvel e seu comportamento melhor do que outro mtodo estvel muito citado na literatura, o
Bubblesort ou mtodo da bolha. Alm disso, sua implemento to simples
quanto 'as implementaes do Bubblesort e Seleo. Para arquivos j
ordenados o mtodo 0(n): quando se deseja adicionar alguns elementos a
um arquivo j ordenado e depois obter um outro arquivo ordenado o custo
linear.
O mtodo da Seleo somente vantajoso quanto ao nmero de movimentos de registros, que 0(n). Logo, ele deve ser usado para arquivos com
registros muito grandes, desde que o tamanho do arquivo no seja maior do
que 1.000 elementos.
O Shellsort o mtodo a ser escolhido para a maioria das aplicaes por
ser muito eficiente para arquivos de at 10.000 elementos. Mesmo para

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

3.41. ORDENAO EXTERNA

91

para fins de comparaes e toda movimentao realizada apenas sobre os


apontadores. Ao final P[1] contm o ndice do menor elemento de A, P[2]
contm o ndice do segundo menor elemento de A, e assim sucessivamente.
Esta estratgia pode ser utilizada para qualquer dos mtodos de ordenao
interna vistos anteriormente. Sedgewick (1988) mostra como implementar
esta estratgia para o mtodo da Insero e para aplicaes de filas de
prioridades usando Heaps.

3.2 Ordenao Externa


A ordenao externa envolve arquivos compostos por um nmero de registros que maior do que a memria interna do computador pode armazenar.
Os mtodos de ordenao externa so muito diferentes dos mtodos de ordenao interna. Em ambos os casos o problema o mesmo: rearranjar os
registros de um arquivo em ordem ascendente ou descendente. Entre-tanto,
na ordenao externa as estruturas de dados tm que levar em conta o fato de
que os dados esto armazenados em unidades de memria externa,
relativamente muito mais lentas do que a memria principal.
Nas memrias externas, tais como fitas, discos e tambores magnticos,
os dados so armazenados como um arquivo seqencial, onde apenas um
registro pode ser acessado em um dado momento. Esta uma restrio forte
se comparada com as possibilidades de acesso da estrutura de dados do tipo
vetor. Conseqentemente, os mtodos de ordenao interna apresentados na
Seo 3.1 so inadequados para ordenao externa, e ento tnicas de
ordenao completamente diferentes tm que ser usadas. Existem trs importantes fatores que fazem os algoritmos para ordenao externa diferentes
dos algoritmos para ordenao interna, a saber:
1. O custo para acessar um item algumas ordens de grandeza maior do
que os custos de processamento na memria interna. 0 custo principal
na ordenao externa est relacionado com o custo de transferir dados
entre a memria interna e a memria externa.
2. Existem restries severas de acesso aos dados. Por exemplo, os itens
armazenados em fita magntica s podem ser acessados de forma seq
uencial. Os itens armazenados em disco magntico podem ser acessados diretamente, mas a um custo maior do que o custo para acessar
seqencialmente, o que contra-indica o uso do acesso direto.
3. O desenvolvimento de mtodos de ordenao externa muito dependente do estado atual da tecnologia. A grande variedade de tipos de
unidades de memria externa pode tornar os mtodos de ordenao externa dependentes de vrios parmetros que afetam seus desempenhos.

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.

3.43. ORDENAO EXTERNA

93

Figura 3.10: Arquivo exemplo com 22 registros

Assuma que a memria interna do computador a ser utilizado s tem espao


para trs registros, e o nmero de unidades de fita magntica seis.
Na primeira etapa o arquivo lido de trs em trs registros. Cada bloco
de trs registros ordenado e escrito em uma das fitas de sada. No exemplo
da Figura 3.10 so lidos os registros INT e escrito o bloco INT na fita 1, a
seguir so lidos os registros ERC e escrito o bloco CER na fita 2, e assim por
diante, conforme ilustra a Figura 3.11. Trs fitas so utilizadas em uma
intercalao-de-3-caminhos.

Figura 3.11: Formao dos blocos ordenados iniciais

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.

Figura 3.12: Intercalao-de-3-caminhos

A seguir mais uma intercalao-de-3-caminhos das fitas 4, 5 e 6 para as


fitas 1, 2 e 3 completa a ordenao. Se o arquivo exemplo tivesse um nmero
maior de registros, ento vrios blocos ordenados de 9 registros seriam formados nas fitas 4, 5 e 6. Neste caso, a segunda passada produziria blocos
ordenados de 27 registros nas fitas 1, 2 e 3; a terceira passada produziria blocos ordenados de 81 registros nas fitas 4, 5 e 6, e assim sucessivamente, at
obter-se um nico bloco ordenado. Neste ponto cabe a seguinte pergunta:

94

CAPTULO 3. ORDENAO

quantas passadas so necessrias para ordenar um arquivo de tamanho arbitrrio?


Considere um arquivo contendo n registros (neste caso cada registro
contm apenas uma palavra) e uma memria interna de m palavras. A
passada inicial sobre o arquivo produz n/m blocos ordenados (se cada registro contiver k palavras, k > 1, ento teramos n/m/k blocos ordenados.)
Seja P uma funo de complexidade tal que P(n) o nmero de passadas
para a fase de intercalao dos blocos ordenados, e seja f o nmero de fitas
utilizadas em cada passada. Para uma intercalao-de- f -caminhos o nmero
de passadas

Considere um exemplo de um arquivo de tamanho muito grande, tal


como 1 bilho de palavras. Considere uma memria interna disponvel de 2
milhes de palavras e 4 unidades de fitas magnticas. Neste caso P(n) = 5, e
o nmero total de passadas, incluindo a primeira passada para obter os n/m
blocos ordenados, 6. Uma estimativa do tempo total gasto para ordenar
este arquivo pode ser obtido multiplicando-se por 6 o tempo gasto para
transferir o arquivo de uma fita para outra.
Para uma intercalao-de- f -caminhos foram utilizadas 2f fitas nos exem
plos acima. Para usar apenas f + 1 fitas basta encaminhar todos os blocos
para uma nica fita e, com mais uma passada, redistribuir estes blocos entre
as fitas de onde eles foram lidos. No caso do exemplo de 22 registros apenas
4 fitas seriam suficientes: a intercalao dos blocos a partir das fitas 1, 2 e 3
seria toda dirigida para a fita 4; ao final, o segundo e o terceiro blocos ordenados de 9 registros seriam transferidos, de volta para as fitas 1 e 2, e assim
por diante. O custo envolvido uma passada a mais em cada intercalao.

3.2.2 Implementao Atravs de Seleo por Substituio


A implementao do mtodo de intercalao balanceada pode ser realizada
utilizando-se filas de prioridades. Tanto a passada inicial para quebrar
o arquivo em blocos ordenados quanto a fase de intercalao podem ser
implementadas de forma eficiente e elegante utilizando-se filas de prioridades.
A operao bsica necessria para formar os blocos ordenados iniciais
corresponde a obter o menor dentre os registros presentes na memria interna, o qual deve ser substitudo pelo prximo registro da fita de entrada.
A operao de substituio do menor item de uma fila de prioridades implementada atravs de um h e a p a operao ideal para resolver o problema.

3.45. ORDENAO EXTERNA

95

A operao de substituio corresponde a retirar o menor item da fila de


prioridades, colocando no seu lugar um novo item, seguido da reconstituio
da propriedade do heap.
Para cumprir esta primeira passada ns iniciamos o processo fazendo m
inseres na fila de prioridades inicialmente vazia. A seguir o menor item da
fila de prioridades substitudo pelo prximo item do arquivo de entrada,
com o seguinte passo adicional: se o prximo item menor que o que est
saindo (o que significa que este item no pode fazer parte do bloco ordenado
corrente), ento ele deve ser marcado como membro do prximo bloco e
tratado como maior do que todos os itens do bloco corrente. Quando um item
marcado vai para o topo da fila de prioridades, o bloco corrente
encerrado e um novo bloco ordenado iniciado. A Figura 3.13 mostra o
resultado da primeira passada sobre o arquivo da Figura 3.10. Os asteriscos
indicam quais chaves na fila de prioridades pertencem a blocos diferentes.

Figura 3.13: Resultado da primeira passada usando seleo por substituio


Cada linha da Figura 3.13 representa o contedo de um heap de tamanho
trs. A condio do heap que a primeira chave tem que ser menor do que a
segunda e a terceira chaves. Ns iniciamos com as trs primeiras chaves do
arquivo, as quais j formam um heap. A seguir, o registro I sai e substitudo

96

CAPTULO 46. ORDENAO

pelo registro E, que menor do que a chave I. Neste caso, o registro E no


pode ser includo no bloco corrente: ele marcado e considerado maior do
que os outros registros do heap. Isto viola a condio do heap, e o registro E*
trocado com o registro N para reconstituir o heap. A seguir, o registro N sai
e substitudo pelo registro R, o que no viola a condio do heap. Ao final
do processo vrios blocos ordenados so obtidos. Esta forma de utilizar filas
de prioridades chamada seleo por substituio (vide Knuth, 1973, Seo
5.4.1; Sedgewick, 1988, p.180).
Para uma memria interna capaz de reter apenas 3 registros possvel
produzir os blocos ordenados INRT, ACEL, AABCLO, AACEN e AAD, de
tamanhos 4, 4, 6, 5 e 3, respectivamente. Knuth (1973, pp. 254-256) mostra
que, se as chaves so randmicas, os blocos ordenados produzidos so cerca
de duas vezes o tamanho dos blocos produzidos por ordenao interna. Assim,
a fase de intercalao inicia com blocos ordenados em mdia duas vezes
maiores do que o tamanho da memria interna, o que pode salvar uma
passada na fase de intercalao. Se houver alguma ordem nas chaves ento os
blocos ordenados podem ser ainda maiores. Ainda mais, se nenhuma chave
possui mais do que m chaves maiores do que ela, antes dela, ento o arquivo
ordenado j na primeira passada. Por exemplo, o conjunto de registros
RAPAZ ordenado pela primeira passada, conforme ilustra a Figura 3.14.

Figura 3.14: Conjunto ordenado na primeira passada


A fase de intercalao dos blocos ordenados obtidos na primeira fase
tambm pode ser implementada utilizando-se uma fila de prioridades. A
operao bsica para fazer a intercalao-de- f -caminhos obter o menor
item dentre os itens ainda no retirados dos f blocos a serem intercalados.
Para tal basta montar uma fila de prioridades de tamanho f a partir de cada
uma das f entradas. Repetidamente, substitua o item no topo da fila de
prioridades (no caso o menor item) pelo prximo item do mesmo bloco do
item que est sendo substitudo, e imprima em outra fita o elemento
substitudo. A Figura 3.15 mostra o resultado da intercalao de INT com
CER com AAL, os quais correspondem aos blocos iniciais das fitas 1, 2 e 3
mostrados na Figura 3.11.
Quando f no muito grande no h vantagem em utilizar seleo por
substituio para intercalar os blocos, pois possvel obter o menor item

3.47. ORDENAO EXTERNA

97

Figura 3.15: Intercalao usando seleo por substituio

fazendo f 1 comparaes. Quando f 8 ou mais, possvel ganhar tempo


usando um heap como mostrado acima. Neste caso cerca de log 2 f comparaes so necessrias para obter o menor item.

3.2.3 C o n s i d e r a e s P r t i c a s
Para implementar o mtodo de ordenao externa descrito anteriormente
muito importante implementar de forma eficiente as operaes de entrada
sada de dados. Estas operaes compreendem a transferncia dos dados
entre a memria interna e as unidades externas onde esto armazenadas os
registros a serem ordenados. Deve-se procurar realizar a leitura, a escrita o
processamento interno dos dados de forma simultnea. Os computa-dores
de maior porte possuem uma ou mais unidades independentes para
processamento de entrada e sada que permitem realizar simultaneamente
as operaes de entrada, sada e processamento interno.
Knuth (1973) discute vrias tcnicas para obter superposio de entrada
sada com processamento interno. Uma tcnica comum a de utilizar 2 f
reas de entrada e 2 f reas de sada. Para cada unidade de entrada ou sada
so mantidas duas reas de armazenamento: uma para uso do processador
central e outra para uso do processador de entrada ou sada. Para entrada, o
processador central usa uma das duas reas enquanto a unidade de entrada
est preenchendo a outra rea. No momento que o processador central
termina a leitura de uma rea, ele espera que a unidade de entrada acabe de
preencher a outra rea e ento passa a ler dela, enquanto a unidade de
entrada passa a preencher a outra. Para sada, a mesma tcnica utilizada.
Existem dois problemas relacionados com a tcnica de utilizao de duas
reas de. armazenamento. Primeiro, apenas metade da memria disponvel
utilizada, o que pode levar a uma ineficincia se o nmero de reas for grande,
como no caso de uma intercalao-de- f -caminhos para f grande. Segundo,

98

CAPTULO 48. ORDENAO

em uma intercalao-de- f -caminhos existem f reas correntes de entrada; se


todas as reas se tornarem vazias aproximadamente ao mesmo tempo, muita
leitura ser necessria antes de podermos continuar o processamento, a no
ser que haja uma previso de que esta eventualidade possa ocorrer.
Os dois problemas podem ser resolvidos com a utilizao de uma tcnica
chamada previso, a qual requer a utilizao de apenas uma rea extra de
armazenamento (e no f reas) durante o processo de intercalao. A
melhor forma de superpor a entrada com processamento interno durante o
processo de seleo por substituio superpor a entrada da prxima rea
que precisa ser preenchida a seguir com a parte de processamento interno
do algoritmo. Felizmente, fcil saber qual rea ficar vazia primeiro, simplesmente olhando para o ltimo registro de cada rea. A rea cujo ltimo
registro o menor, ser a primeira a se esvaziar; assim ns sempre sabemos
qual conjunto de registros deve ser o prximo a ser transferido para a rea.
Por exemplo, na intercalao de INT com CER com AAL ns sabemos que
a terceira rea ser a primeira a se esvaziar.
Uma forma simples de superpor processamento com entrada na intercalao de vrios caminhos manter uma rea extra de armazenamento, a
qual preenchida de acordo com a regra descrita acima. Enquanto os blocos
INT, CER e AAL da Figura 3.11 esto sendo intercalados o processador de
entrada est preenchendo a rea extra com o bloco ACN. Quando o processador central encontrar uma rea vazia, ele espera at que a rea de entrada
seja preenchida caso isto ainda no tenha ocorrido, e ento aciona o processador de entrada para comear a preencher a rea vazia com o prximo
bloco, no caso ABL.
Outra considerao prtica importante est na escolha do valor de f , que
a ordem da intercalao. No caso de fita magntica a escolha do valor de f
deve ser igual ao nmero de unidades de fita disponveis menos um. A fase
de intercalao usa f fitas de entrada e uma fita de sada. 0 nmero de fitas
de entrada deve ser no mnimo dois pois no faz sentido fazer intercalao
com menos de duas fitas de entrada.
No caso de disco magntico o mesmo raciocnio acima vlido. Apesar
do disco magntico permitir acesso direto a posies arbitrrias do arquivo, o
acesso seqencial mais eficiente. Logo, o valor de f deve ser igual ao
nmero de unidades de disco disponveis menos um, para evitar o maior
custo envolvido se dois arquivos diferentes estiverem em um mesmo disco.
Sedegwick (1983) apresenta outra alternativa: considerar f grande o suficiente para completar a ordenao em um nmero pequeno de passadas.
Uma intercalao de duas passadas em geral pode ser realizada com um
nmero razovel para f . A primeira passada no arquivo utilizando seleo
por substituio produz cerca de n / 2 m blocos ordenados. Na fase de intercalao cada etapa divide o nmero de passadas por f . Logo, f deve ser
escolhido tal que

EXERCCIOS

99

Para n igual a 200 milhes e m igual a 1 milho ento f = 11 suficiente


para garantir a ordenao em duas passadas. Entretanto, a melhor escolha
para f entre estas duas alternativas muito dependente de vrios parmetros
relacionados com o sistema de computao disponvel.

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

4) Ordenao Ps-Catstrofe (rabe, 1992)


Imagine que voc estava trabalhando na Universidade da California,
em Berkeley. Logo depois que voc tinha acabado de ordenar um conjunto muito grande de n nmeros inteiros, cada nmero de grande
magnitude (com muitos dgitos), usando o seu mtodo O(n log n) favorito, aconteceu um terremoto de grandes propores. Milagrosamente, o computador no destrudo (nem voc), mas, por algum
motivo, cada um dos 4 bits menos significativos de cada nmero inteiro aleatriamente alterado. Voc quer, agora, ordenar os novos
nmeros inteiros. Escolha um algoritmo capaz de ordenar os novos
nmeros em 0(n). Justifique.
5) Algoritmos de Ordenao: Estudos Comparativos
Considere os seguintes algoritmos de ordenao interna: Insero, Seleo, Shellsort, Quicksort, Heapsort.
a) Determine experimentalmente o nmero esperado de (i) comparaes e (ii) movimento-de-registros para cada um dos cinco
mtodos de ordenao indicados acima.
Use um gerador de nmeros aleatrios para gerar as chaves. Utilize arquivos de diferentes tamanhos com chaves geradas randomicamente. Repita cada experimento algumas vezes e obtenha a
mdia para cada medida de complexidade. Utilize o tipo de da-dos
array do Pascal. D a sua interpretao dos dados obtidos,
comparando-os com resultados analticos.
b) Uma opo alternativa, para o caso do uso de mquinas que permitem medir o tempo de execuo de um programa, considerar
os mesmos algoritmos propostos e determinar experimentalmente
o tempo de execuo de cada um dos cinco mtodos de ordenao
indicados acima.
Use um gerador de nmeros aleatrios para gerar arquivos de
tamanhos 500, 2000 e 10.000 registros. Para cada tamanho de
arquivo utilize dois tamanhos de registros, a saber: um registro
contendo apenas a chave e outro registro de tamanho 11 vezes o
tamanho da chave (isto , a chave acompanhada de "outros
componentes" cujo tamanho seja equivalente a 10 chaves). Repita
cada experimento algumas vezes e obtenha a mdia dos tempos de
execuo. Utilize o tipo de dados array do Pascal. D a sua
interpretao dos dados obtidos.
6) Considere a estrutura de dados heap. Determine empiricamente o
nmero esperado de trocas para:

EXERCCIOS

101

a) construir um heap atravs de n inseres sucessivas a partir de um


heap vazio;
b) inserir um novo elemento em um heap contendo n elementos;
c) extrair o elemento maior de um heap contendo n + 1 elementos.
Use um gerador de nmeros aleatrios para gerar as chaves. Repita o
experimento para diferentes tamanhos de n. A estrutura de dados
utilizada deve usar o mnimo possvel de memria para armazenar o
heap. Utilize o Pascal para implementar o algoritmo. Finalmente, d a
sua interpretao dos resultados obtidos. Como estes resultados se
comparam com os resultados analticos?
7) Quicksort
a) Mostre como o vetor A B A B A B A particionado quando se
escolhe o elemento do meio, A[(esq + dir) div 2], como piv.
b) Mostre as etapas de funcionamento do Quicksort para ordenar as
chaves Q U I C K S O R T . Considere que o piv escolhido o
elemento do meio, A[(esq + dir) div 2].
8) Quicksort
a) Descreva uma maneira para manter o tamanho da pilha de recurso o menor possvel na implementao do Quicksort.
b) Se voc no se preocupasse com o uso deste artifcio, at que
tamanho a pilha poderia crescer, no pior caso? Por qu?
9) O objetivo deste trabalho fazer um estudo comparativo de diversas
implementaes do algoritmo Quicksort. Para tanto, voc dever
implementar as seguintes verses do algoritmo:
a) Quicksort recursivo;
b) Quicksort recursivo com interrupo da partio para a ordenao
de sub-vetores menores que M elementos. Determine empiricamente o melhor valor de M para um arquivo gerado aleatoriamente com 1000 (mil) elementos;
c) Melhore a verso 2 utilizando a tcnica de mediana-de-trs elementos para escolha do piv.
Gere massas de testes para testar e comparar cada uma das implementaes. Use sua criatividade para criar arquivos de teste interessantes. Faa tabelas e/ou grficos para mostrar e explicar os resultados
obtidos. .
O que deve ser apresentado:

102

CAPTULO 3. ORDENAO

a) Listagem dos programas em Pascal. Vo valer pontos clareza,


indentao e comentrios no programa.
b) Listagem dos testes executados.
c) Descrio sucinta dos arquivos de teste utilizados, relatrio comparativo dos testes executados 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 de cada uma das
implementaes para diversos cenrios de teste.
Algumas sugestes:
a) determine o tempo de processamento necessrio na fase de classificao utilizando o relgio da mquina;
b) mantenha contadores (que devem ser atualizados pelos procedimentos de ordenao) para armazenar o nmero de comparaes
e de trocas de elementos executados pelos algoritmos;
c) execute o programa algumas vezes, com cada algoritmo, com
massas de dados diferentes, para obter a mdia dos tempos de
execuo e dos nmeros de comparaes e trocas;
d) outro experimento interessante executar o programa uma vez
com uma massa de dados que force o pior caso do algoritmo.
10) Considere o seguinte vetor de entrada: H E A P S O R T
a) Utilizando o algoritmo Heapsort rearranje os elementos do vetor
para formar a representao de um heap utilizando o prprio vetor
de entrada. 0 heap deve conter o mximo do conjunto na raiz.
b) A partir do heap criado execute trs iteraes do anel principal do
Heapsort para extrair os trs maiores elementos. Mostre os
desenhos heap-vetor.
11) Suponha que voc tenha que ordenar vrios arquivos de 100, 5.000 e
2 0 . 0 0 0 nmeros inteiros. Para todos os trs tamanhos de arquivos
necessrio realizar a ordenao no menor tempo possvel.
a) Que algoritmo de ordenao voc usaria para cada tamanho de
arquivo? Justifique.
b) Se for necessrio manter a ordem relativa dos itens com chaves
iguais (isto , manter estabilidade), que algoritmo voc usaria
para cada tamanho de arquivo? Justifique.

EXERCCIOS

103

c) Suponha que as ordenaes tenham que ser realizadas em um


ambiente em que uma configurao dos dados de entrada que
leve a um pior caso no possa ser tolerada, mesmo que este pior
caso possa acontecer muito raramente (em outras palavras, voc
no quer que o pior tempo de execuo seja muito maior que o
caso mdio). Ainda assim, continua sendo importante realizar a
ordenao no menor tempo possvel. Que algoritmo de ordenao
voc usaria em cada tamanho de arquivo? Justifique.
12) 0 objetivo deste problema projetar uma estrutura de dados para um
conjunto S (Arabe, 1992). S conter elementos retirados de algum
universo U; S pode conter elementos duplicados. A estrutura de dados
projetada deve implementar eficientemente as seguintes operaes:
a) Insere (b, S): Insere o elemento b em S (isto vai adicionar uma
nova cpia de b em S se j existia alguma).
b) RetiraMin (x, S): retira de S o menor elemento (pode haver mais
de um), retornando seu valor em x.
Descreva uma estrutura de dados e como implementar as operaes
Insere e RetiraMin de modo que estas operaes sejam executadas, no
pior caso, em O(log n).
13) A operao de unir dois arquivos ordenados gerando um terceiro arquivo ordenado denominada intercalao (merge). Esta operao
consiste em colocar no terceiro arquivo a cada passo sempre o menor
elemento entre os menores dos dois arquivos iniciais, desconsiderando
este mesmo elemento nos passos posteriores. Este processo deve ser
repetido at que todos os elementos dos arquivos de entrada sejam
escolhidos.
Esta idia pode ser utilizada para construir um algoritmo de ordenao.
0 processo o seguinte: dividir recursivamente o vetor a ser ordenado
em dois vetores at obter n vetores de 1 nico elemento. Aplicar o
algoritmo de merge tendo como entrada 2 vetores de um elemento e
formando um vetor ordenado de dois elementos. Repetir este processo
formando vetores ordenados cada vez maiores at que todo o vetor esteja ordenado. Escrever um algoritmo para implementar este mtodo,
conhecido na literatura como mergesort.
14) Considere o arquivo de 10 registros: B A L A N C E A D A
a) Vamos considerar o mtodo de ordenao externa usando intercalao-balanceada-de-2-caminhos, utilizando apenas 3 fitas magnticas e uma memria interna com capacidade para armazenar

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?

15) Ordenao Externa


O objetivo deste trabalho projetar e implementar um sistema de
programas para ordenar arquivos que no cabem na memria primria, o
que nos obriga a utilizar um algoritmo de ordenao externa.
Existem muitos mtodos para ordenao externa. Entretanto, a gran-de
maioria utiliza a seguinte estratgia geral: blocos de entrada to
grandes quanto possvel so ordenados internamente e copiados em arquivos intermedirios de trabalho. A seguir os arquivos intermedirios
so intercalados e copiados em outros arquivos de trabalho, at que todos os registros so intercalados em um nico bloco final representando
o arquivo ordenado.
Um procedimento simples e eficiente para realizar esta tarefa o de
colocar cada bloco ordenado em um arquivo separado at que a entrada
toda lida. A seguir os N primeiros arquivos so intercalados em um
novo arquivo e esses N arquivos removidos. N uma constante que
pode ter valores entre 2 e 10, chamada Ordem de Intercalao. Este
processo repetido at que fique apenas um arquivo, o arquivo final
ordenado. A cada passo o procedimento de intercalao nunca tem que
lidar com mais do que N arquivos de intercalao mais um nico
arquivo de sada.
Para tornar mais claro o que cada aluno tem que realizar apresentamos
abaixo um primeiro refinamento do procedimento que permite implementar a estratgia descrita acima. Pode-se observar que grande parte
do procedimento lida com criao, abertura, fechamento e remoo de
arquivos em momentos adequados.
A fase de intercalao utiliza dois ndices, Low e High, para indicar o
intervalo de arquivos ativos. 0 ndice High incrementado de 1,
OrdemIntercalConst arquivos so intercalados a partir de Low e armazenados no arquivo High e, finalmente, Low incrementado de
OrdemIntercalConst. Quando Low fica igual ou maior do que High a
intercalao termina com o ltimo bloco resultante High totalmente
ordenado.
importante observar que as interfaces dos vrios procedimentos presentes no cdigo abaixo no esto completamente especificadas.

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

CAPTULO 8. PESQUISA EM MEMRIA PRIMRIA

3. Inserir um novo registro.


4. Retirar um registro especfico.
5. Ordenar um arquivo para obter todos os registros em ordem de acordo
com a chave.
6. Ajuntar dois arquivos para formar um arquivo maior.
A operao 5 foi objeto de estudo no Captulo 3. A operao 6 demanda
a utilizao de tcnicas sofisticadas e no ser tratada neste texto.
Um nome comumente utilizado para descrever uma estrutura de dados
para pesquisa dicionrio. Um dicionrio um tipo abstrato de dados com
as operaes Inicializa, Pesquisa, Insere e Retira. Em uma analogia com um
dicionrio da lngua portuguesa, as chaves so as palavras e os registros so
as entradas associadas com cada palavra, onde cada entrada contm a
pronncia, definio, sinnimos e outras informaes associadas com a
palavra.
Para alguns dos mtodos de pesquisa a serem estudados a seguir, vamos
implementar o mtodo como um dicionrio, como o caso das Arvores de
Pesquisa (Seo 4.3) e Hashing (Seo 4.5). Para os mtodos Pesquisa
Seqencial e Pesquisa Digital vamos implementar as operaes Inicializa,
Pesquisa e Insere e para o mtodo Pesquisa Binria vamos implementar apenas a operao Pesquisa.

4.1 Pesquisa Seqencial


O mtodo de pesquisa mais simples que existe funciona da seguinte forma: a
partir do primeiro registro, pesquise seqencialmente at encontrar a chave
procurada; ento pare. Apesar de sua simplicidade, a pesquisa seqencial
envolve algumas idias interessantes, servindo para ilustrar vrios aspectos
e convenes a serem utilizadas nos outros mtodos de pesquisa a serem
apresentados.
Uma forma possvel de armazenar um conjunto de registros atravs do
tipo estruturado arranjo, conforme ilustra o Programa 4.1. Cada registro
contm um campo chave que identifica o registro. Alm da chave, podem
existir outros componentes em um registro, os quais no tm influncia muito
grande nos algoritmos. Por exemplo, os outros componentes de um registro
podem ser substitudos por um apontador contendo o endereo de um outro
local que os contenha.
Uma possvel implementao para as operaes Inicializa, Pesquisa e
Insere mostrada no Programa 4.2.
A funo Pesquisa retorna o ndice do registro que contm a chave x; caso
no esteja presente o valor retornado zero. Observe que esta implementao

4.1. PESQUISA SEQENCIAL

109

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

110

no suporta mais de um registro com uma mesma chave. Para aplicaes


com esta caracterstica necessrio incluir um argumento a mais na funo
Pesquisa para conter o ndice a partir do qual se quer pesquisar, e alterar a
implementao de acordo.
Um registro sentinela contendo a chave de pesquisa colocado na posio zero do array. Esta tcnica garante que a pesquisa sempre termina. Aps
a chamada da funo Pesquisa, se o ndice zero, significa que a pesquisa
foi sem sucesso.

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.

4.2 Pesquisa Binria


A pesquisa em uma tabela pode ser muito mais eficiente se os registros forem
mantidos em ordem. Para saber se uma chave est presente na tabela,
compare a chave com o registro que est na posio do meio da tabela. Se a
chave menor, ento o registro procurado est na primeira metade da tabela;
se a chave maior, ento o registro procurado est na segunda metade da
tabela. Repita o processo at que a chave seja encontrada, ou fique apenas
um registro cuja chave diferente da procurada, significando uma pesquisa
sem sucesso. A Figura 4.1 mostra os subconjuntos pesquisados para.
recuperar o ndice da chave G .
O Programa 4.3 mostra a implementao do algoritmo para um conjunto
de registros implementado como uma tabela.

4.3. RVORES DE PESQUISA

111

P r o g r a m a 4.3: Pesquisa binria

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.

4.3 rvores de Pesquisa


A rvore de pesquisa uma estrutura de dados muito eficiente para armazenar informao. Ela particularmente adequada quando existe necessidade de
considerar todos ou alguma combinao de requisitos tais como: (i) acesso
direto e seqencial eficientes; (ii) facilidade de insero e retirada de registros; (iii) boa taxa de utilizao de memria; (iv) utilizao de memria
primria e secundria.

112

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

Se algum considerar separadamente qualquer um dos requisitos acima,


possvel encontrar uma estrutura de dados que seja superior rvore de
pesquisa. Por exemplo, tabelas hashing possuem tempos mdios de pesquisa melhores e tabelas usando posies contguas de memria possuem
melhores taxas de utilizao de memria. Entretanto, uma tabela usando
hashing precisa ser ordenada se existir necessidade de processar os registros
seqencialmente em ordem lexicogrfica, e a insero/retirada de registros
em tabelas usando posies contguas de memria tem custo alto. As rvores
de pesquisa representam um compromisso entre estes requisitos
conflitantes.

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.

4.3. RVORES DE PESQUISA

113

Programa 4.4: Estrutura do dicionrio para rvores sem balanceamento

Atingir um apontador nulo em um processo de pesquisa significa uma


pesquisa sem sucesso (o registro procurado no est na rvore). Caso se
queira inseri-lo na rvore, o apontador nulo atingido justamente o ponto de
insero, conforme ilustra a implementao do procedimento Insere do
Programa 4.6.
0 procedimento Inicializa extremamente simples, conforme ilustra o
Programa 4.7. A rvore de pesquisa mostrada na Figura 4.2 pode ser obtida
quando as chaves so lidas pelo Programa 4.8, na ordem 5, 3, 2, 7, 6, 4, 1, 0,
sendo 0 a marca de fim de arquivo.
A ltima operao a ser estudada Retira. Se o nodo que contm o
registro a ser retirado possui no mximo um descendente ento a operao
simples. No caso do nodo conter dois descendentes, o registro a ser retirado
deve ser primeiro substitudo pelo registro mais direita na subrvore esquerda, ou pelo registro mais esquerda na subrvore direita. Assim, para
retirar o registro com chave 5 na rvore da Figura 4.2, basta troc-lo pelo
registro com chave 4 ou pelo registro com chave 6, e ento retirar o nodo que
recebeu o registro com chave 5.

114

CAPITULO 14. PESQUISA EM MEMRIA PRIMRIA

4.15. RVORES DE PESQUISA

Programa

4.8:

115

Programa para criar a rvore

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

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

Programa 4.9: Procedimento para retirar x da rvore

4.3. RVORES DE PESQUISA

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).

4.3.2 rvores B i n r i a s de P e s q u i s a Com Balanceamento


Para uma distribuio uniforme das chaves, onde cada chave igualmente
provvel de ser usada em uma pesquisa, a rvore completamente balanceada 2 minimiza o tempo mdio de pesquisa. Entretanto, o custo para
manter a rvore completamente balanceada aps cada insero tem um custo
muito alto. Por exemplo, para inserir a chave 1 na rvore esquerda na
1 Uma rvore A com n chaves possui n + 1 nodos externos e estas n chaves dividem todos os valores
possveis em n+1 intervalos. Uma insero em A considerada randmica se ela tem probabilidade igual de
acontecer em qualquer um dos n + 1 intervalos. Uma rvore de pesquisa randmica com n chaves uma
rvore construda atravs de n inseres randmicas sucessivas em uma rvore inicialmente vazia
2 Em uma rvore completamente balanceada os nodos externos aparecem em no mximo dois nveis
adjacentes.

118

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

Figura 4.3 e obter a rvore direita na mesma figura necessrio movimentar todos os nodos
da rvore original.

Figura 4.3: Arvore binria de pesquisa completamente balanceada

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).

4.3. RVORES DE PESQUISA

119

Figura 4.4: Uma rvore 2-3 e a rvore B binria correspondente

cujo nome foi abreviado para rvores SBB (Symmetric Binary B-trees) por
Bayer (1972). A Figura 4.5 apresenta uma rvore SBB.

Figura 4.5: rvore SBB

A rvore SBB uma rvore binria com dois tipos de apontadores,


chamados apontadores verticais e apontadores horizontais, tal que:
1. todos os caminhos da raiz at cada nodo externo possuem o mesmo
nmero de apontadores verticais, e
2. no podem existir dois apontadores horizontais sucessivos.
Uma rvore SBB pode tambm ser vista como uma representao binria
da rvore 2-3-4 apresentada por Guibas e Sedgewick (1978) e mostrada em
detalhes em Sedgewick (1988), na qual "supernodos" podem conter at trs
chaves e quatro filhos. Por exemplo, tal "supernodo", com chaves 3, 5 e 9,
pode ser visto na rvore SBB da Figura 4.5.
Transformaes para Manuteno da Propriedade SBB
0 algoritmo para rvores SBB usa transformaes locais no caminho de
insero (retirada) para preservar o balanceamento. A chave a ser inserida (
retirada) sempre inserida (retirada) aps o apontador vertical mais baixo
na rvore. Dependendo da situao anterior insero (retirada), podem
aparecer dois apontadores horizontais sucessivos e, neste caso, necessrio

120

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

realizar uma transformao. Se uma transformao realizada, a altura da


subrvore transformada um mais do que a altura da subrvore original, o
que pode provocar outras transformaes ao longo do caminho de pesquisa,
at a raiz da rvore. A Figura 4.6 mostra as transformaes propostas por
Bayer (1972), onde transformaes simtricas podem ocorrer.

Figura 4.6: Transformaes propostas por Bayer (1972)

A estrutura de dados rvore SBB ser utilizada para implementar o tipo


abstrato de dados Dicionrio. A estrutura do Dicionrio apresentada no
Programa 4.11. A nica diferena da estrutura utilizada para implementar a
rvore de pesquisa sem balanceamento (vide Programa 4.4) est nos campos
BitE e BitD dentro do registro Nodo, usados para indicar o tipo de apontador (
horizontal ou vertical) que sai do nodo.

P r o g r a m a 4.11: Estrutura do dicionrio para rvores SBB

4.3. RVORES DE PESQUISA

121

O procedimento Pesquisa para rvores SBB idntico ao procedimento


Pesquisa para rvores sem balanceamento mostrado no Programa 4.5, porque
o procedimento Pesquisa ignora completamente os campos BitE e BitD.
Logo, nenhum tempo adicional necessrio para pesquisar na rvore SBB.
Os quatro procedimentos EE, ED, DD e DE so utilizados nos procedimentos Insere e Retira, com o objetivo de eliminar dois apontadores horizontais sucessivos. 0 Programa 4.12 mostra a implementao destes procedimentos.

122

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

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.

4.3. RVORES DE PESQUISA

123

Programa 4.13: Procedimento para inserir na rvore SBB

A Figura 4.7 mostra o resultado obtido quando se insere uma seqncia


de chaves em uma rvore SBB inicialmente vazia: a rvore esquerda
obtida aps a insero das chaves 7, 10, 5; a rvore do meio obtida aps a
insero das chaves 2, 4 na rvore anterior; a rvore direita obtida aps a
insero das chaves 9, 3, 6 na rvore anterior. A rvore de pesquisa mostrada
na Figura 4.5 pode ser obtida quando as chaves 1, 8 so inseridas na rvore
direita na Figura 4.7.

Programa 4.14: Procedimento para inicializar a rvore SBB

124

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

O procedimento Retira pode ser visto no Programa 4.15. Assim como o


procedimento Insere mostrado acima, o procedimento Retira contm um
outro procedimento interno de nome IRetira, cuja interface interface contm
um parmetro a mais que o procedimento Retira, a saber: o parmetro Fim
toma o valor true quando a propriedade SBB reestabelecida e nada mais
necessrio fazer.
Por sua vez, o procedimento IRetira utiliza trs procedimentos internos,
a saber:
EsqCurto (DirCurto) chamado quando um nodo folha (que referendado por um apontador vertical) retirado da subrvore esquerda (
direita), tornando-a menor na altura aps a retirada;
Quando o nodo a ser retirado possui dois descendentes, o procedimento
Antecessor localiza o nodo antecessor para ser trocado com o nodo a
ser retirado.

4.25. RVORES DE PESQUISA

125

126

CAPTULO 26. PESQUISA EM MEMRIA PRIMRIA

Programa 4.15: Procedimento para retirar da rvore SBB

A Figura 4.8 mostra o resultado obtido quando se retira uma seqncia


de chaves da rvore SBB: a rvore esquerda obtida aps a retirada da
chave 7 da rvore direita na Figura 4.7 acima; a rvore do meio obtida
aps a retirada da chave 5 da rvore anterior; a rvore direita obtida
aps a retirada da chave 9 da rvore anterior.

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-

4.4. PESQUISA DIGITAL

127

4.4 Pesquisa Digital


A pesquisa digital baseada na representao das chaves como uma seqncia
de caracteres ou de dgitos. Grosso modo, o mtodo de pesquisa digital
realizado da mesma forma que uma pesquisa em dicionrios que possuem
aqueles "ndices de dedo". Com a primeira letra da palavra so determinadas todas as pginas que contm as palavras iniciadas por aquela letra.
Os mtodos de pesquisa digital so particularmente vantajosos quando as
chaves so grandes e de tamanho varivel. No problema de casamento

128

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

de cadeias, trabalha-se com chaves semi-infinitas4, isto , sem limitao


explicita quanto ao tamanho delas. Um aspecto interessante quanto aos
mtodos de pesquisa digital a possibilidade de localizar todas as ocorrncias
de uma determinada cadeia em um texto, com tempo de resposta logartmico
em relao ao tamanho do texto.

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.

4.4. PESQUISA DIGITAL

129

tries a formao de caminhos de uma s direo para chaves com um


grande nmero de bits em comum. Por exemplo, se duas chaves diferirem
somente no ltimo bit, elas formaro um caminho cujo comprimento igual
ao tamanho delas, no importando quantas chaves existem na rvore. Veja o
caminho gerado pelas chaves B e C na Figura 4.10.

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

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

O algoritmo para construo da rvore Patricia baseado no mtodo de


pesquisa digital, mas sem apresentar o inconveniente citado para o caso das
tries. 0 problema de caminhos de uma s direo eliminado por meio de
uma soluo simples e elegante: cada nodo interno da rvore contm o ndice
do bit a ser testado para decidir qual ramo tomar. A Figura 4.11 apresenta a
rvore Patricia gerada a partir das chaves B, C, H, J e Q apresentadas acima.

Para inserir a chave K = 100010 na rvore da Figura 4.11, a pesquisa


inicia pela raiz e termina quando se chega ao nodo externo contendo J. Os
ndices dos bits nas chaves esto ordenados da esquerda para a direita.
Assim, o bit de ndice 1 de K 1, indicando a subrvore direita, e o bit de
ndice 3 indica a subrvore esquerda que, neste caso, um nodo externo.
Isto significa que as chaves J e K mantm o padro de bits 1xOxxx, assim
como qualquer outra chave que seguir este caminho de pesquisa. Um novo
nodo interno repe o nodo J, e este juntamente com o nodo K sero os nodos
externos descendentes. 0 ndice do novo nodo interno dado pelo primeiro
bit diferente das duas chaves em questo, que o bit de ndice 5. Para
determinar qual ser o descendente esquerdo e o direito, s verificar o
valor do bit 5 de ambas as chaves, conforme mostrado na Figura 4.12.

4.4. PESQUISA DIGITAL

131

A insero da chave W = 110110 ilustra um outro aspecto. A pesquisa


sem sucesso na rvore da Figura 4.13 realizada de maneira anloga. Os bits
das chaves K e W so comparados a partir do primeiro para determinar em
qual ndice eles diferem, sendo, neste caso, os de ndice 2. Portanto o ponto
de insero agora ser no caminho de pesquisa entre os nodos internos de
ndice 1 e 3. Cria-se a um novo nodo interno de ndice 2, cujo descendente
direito um nodo externo contendo W e cujo descendente esquerdo a
subrvore de raiz de ndice 3, conforme ilustra a Figura 4.13.

132

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

33.4. PESQUISA DIGITAL

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

Cada chave k inserida de acordo com os passos abaixo, partindo da raiz:


1. Se a subrvore corrente for vazia, ento criado um nodo externo
contendo a chave k (isto ocorre somente na insero da primeira chave)
e o algoritmo termina.
2. Se a subrvore corrente for simplesmente um nodo externo, os bits da
chave k so comparados, a partir do bit de ndice imediatamente aps o
ltimo ndice da seqncia de ndices consecutivos do caminho de
pesquisa, com os bits correspondentes da chave k' deste nodo externo
at encontrar um ndice i cujos bits difiram. A comparao dos bits

134

CAPTULO 34. PESQUISA EM MEMRIA PRIMRIA

4.35. TRANSFORMAO DE CHAVE (HASHING)

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.

4.5 Transformao de Chave (Hashing)


Os mtodos de pesquisa apresentados anteriormente so baseados na comparao da chave de pesquisa com as chaves armazenadas na tabela, ou na
utilizao dos bits da chave de pesquisa para escolher o caminho a seguir. 0
mtodo de transformao de chave (ou hashing) completamente diferente:
os registros armazenados em uma tabela so diretamente endereados a partir de uma transformao aritmtica sobre a chave de pesquisa. De acordo
com o Webster's New World Dictionary, a palavra hash significa: (i) fazer
picadinho de carne e vegetais para cozinhar; (ii) fazer uma baguna. Como
veremos a seguir, o termo hashing um nome apropriado pata o mtodo.
Um mtodo de pesquisa atravs da transformao de chave constitudo
de duas etapas principais:
1. Computar o valor da funo de transformao (tambm conhecida
por funo hashing), a qual transforma a chave de pesquisa em um
endereo da tabela;
2. Considerando que duas ou mais chaves podem ser transformadas em
um mesmo endereo de tabela, necessrio existir um mtodo para
lidar com colises.
Se porventura as chaves fossem inteiros de 1 a n, ento poderamos armazenar o registro com chave i na posio i da tabela, e qualquer registro
poderia ser imediatamente acessado a partir do valor da chave. Por outro

136

CAPTULO 36. PESQUISA EM MEMRIA PRIMRIA

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

4.5. TRANSFORMAO DE CHAVE (HASHING)

137

138

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

Programa 4.23: Estrutura do dicionrio para listas encadeadas

liza, Pesquisa, Insere, Retira. A estrutura do dicionrio apresentada no


Programa 4.23.
A implementao das operaes sobre o Dicionrio so mostradas no
Programa 4.24. As operaes FLVazia, Insere e Retira, definidas sobre o
TipoLista, mostradas no Programa 2.4 do Captulo 2, podem ser utilizadas
para manipular as listas encadeadas. Entretanto, ser necessrio alterar os
nomes do procedimentos Insere e Retira do Programa 2.4 para Ins e Ret
respectivamente, para no haver conflito com os nomes dos procedimentos
Insere e Retira do Dicionrio (vide procedimentos Insere e Retira no Programa 4.24).

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 .

4.5. TRANSFORMAO DE CHAVE (HASHING)

Programa 4.24: Operaes do Dicionrio usando listas encadeadas

139

140

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

4.5.3 Open Addressing


Quando o nmero de registros a serem armazenados na tabela puder ser previamente estimado, ento no haver necessidade de usar apontadores para
armazenar os registros. Existem vrios mtodos para armazenar N registros
em uma tabela de tamanho M > N, os quais utilizam os lugares vazios na
prpria tabela para resolver as colises. Tais mtodos so chamados
Open-addressing (Knuth, 1973, p.518).
Em outras palavras, todas as chaves so armazenadas na prpria tabela,
sem o uso de apontadores explcitos. Quando uma chave x endereada para
uma entrada da tabela que j esteja ocupada, uma seqncia de localizaes
alternativas h1 (x), h2 (x), ... escolhida dentro da tabela. Se nenhuma das h1 (
x), h2 (x), ... posies est vazia ento a tabela est cheia e no podemos
inserir x.
Existem vrias propostas para a escolha de localizaes alternativas. A
mais simples chamada de hashing linear, onde a posio hi na tabela
dada por:

A estrutura de dados open addressing ser utilizada para implementar o


tipo abstrato de dados Dicionrio, com as operaes Inicializa, Pesquisa,
Insere, Retira. A estrutura do dicionrio apresentada no Programa 4.25.
A implementao das operaes sobre o Dicionrio so mostradas no
Programa 4.26.

4.5. TRANSFORMAO DE CHAVE (HASHING)

141

O hashing linear sofre de um mal chamado agrupamento (clustering) (


Knuth, 1973, pp.520521). Este fenmeno ocorre na medida em que a tabela
comea a ficar cheia, pois a insero de uma nova chave tende a ocupar uma
posio na tabela que esteja contgua a outras posies j ocupadas, o que
deteriora o tempo necessrio para novas pesquisas. Entretanto, apesar do
hashing linear ser um mtodo relativamente pobre para resolver colises os
resultados apresentados so bons. A tabela 4.1 mostra alguns valores para C(
n) para diferentes valores de a.

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

0 aspecto negativo do mtodo, seja listas encadeadas ou open addresstng,


est relacionado com o pior caso, que O(N). Se a funo de transformao
no conseguir espalhar os registros de forma razovel pelas entradas da tabela, ento uma longa lista linear pode ser formada, deteriorando o tempo
mdio de pesquisa. 0 melhor caso, assim como o caso mdio, 0(1).

142

CAPTULO 42. PESQUISA EM MEMRIA PRIMRIA

4.43. TRANSFORMAO DE CHAVE (HASHING)

143

Como vantagens na utilizao do mtodo de transformao da chave


citamos: (i) alta eficincia no custo de pesquisa, que 0(1) para o caso mdio
e, (ii) simplicidade de implementao. Como aspectos negativos citamos: (i)
o custo para recuperar os registros na ordem lexicogrfica das chaves alto,
sendo necessrio ordenar o arquivo e, (ii) o pior caso O(N).

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.

Figura 4.16: Arvore AVL

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

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

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

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA

apontadores, e a operao aumenta altura requer apenas a modificao


de dois bits. Transformaes simtricas tambm podem ocorrer.
Quando ocorre uma transformao do tipo aumenta altura, a altura da
subrvore transformada um mais do que a altura da subrvore original, o que pode provocar outras transformaes ao longo do caminho
de pesquisa at a raiz da rvore. Usualmente, o retorno ao longo do
caminho de pesquisa termina quando um apontador vertical encontrado ou uma transformao do tipo divide realizada. Como a altura
da subrvore que sofreu a diviso a mesma que a altura da subrvore
original, apenas uma transformao do tipo divide suficiente para
restaurar a propriedade SBB da rvore.

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

CAPITULO 4. PESQUISA EM MEMRIA PRIMRIA

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

b) rvore binria de pesquisa


c) vetor ordenado
d) tabela hash com soluo para colises usando "open addressing"
e) tabela hash com soluo para colises usando "listas encadeadas".
Para cada um dos problemas abaixo, sugira a estrutura de dados mais
apropriada dentre as listadas acima, de forma a minimizar tempo esperado e espao necessrio. Indique o tempo e o espao necessrio em
cada escolha e por que superior aos outros.
i) inserir/retirar/encontrar um elemento dado;
ii) inserir/retirar/encontrar o elemento de valor mais prximo ao solicitado;
iii) coletar um conjunto de registros, processar o maior elemento,
coletar mais registros, processar o maior elemento, e assim por
diante.
iv) mesma situao descrita no item anterior adicionada da operao
extra de ajuntar ("merge") duas estruturas.
14) 0 objetivo deste trabalho o de projetar e implementar um sistema de
programas, incluindo as estruturas de dados e os algoritmos. Neste
trabalho, o aluno ter a oportunidade de exercitar parcialmente o conceito de independncia de implementao, atravs da utilizao de
duas estruturas de dados distintas para implementar o mesmo problema. Neste caso, o mdulo que implementa cada uma das estruturas
de dados dever permitir o intercmbio entre uma estrutura e outra,
causando o menor impacto possvel em outras partes do programa.
Problema: Criao de ndice remissivo
Vrias aplicaes necessitam de um relatrio de referncias cruzadas.
Por exemplo, a maioria dos livros apresentam um ndice remissivo que
corresponde a uma lista alfabtica de palavras chave ou palavras relevantes do texto com a indicao dos locais no texto onde cada palavra
chave ocorre.
Como exemplo, suponha um arquivo contendo um texto constitudo
como abaixo:

Linha 1: Good programming is not learned from


Linha 2: generalities, but by seeing how significant
Linha 3: programs can be made clean, easy to Linha
4: read, easy to maintain and modify,

150

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA


Linha 5: human-engineered, efficient, and reliable,
Linha 6: by the application of common sense and
Linha 7: by the use of good programming practices.
Assumindo que o ndice remissivo seja constitudo das palavras chave:
programming, programs, easy, by, human-engineered, and, be, to, o
programa para criao do ndice deve produzir a seguinte sada:

and
be
by
easy
human-engineered
programming
programs
to

4
3
2
3
5
1
3
3

5 6
6 7
4
7
4

Note que a lista de palavras chave est em ordem alfabtica. Adjacente


a cada palavra est uma lista de nmeros de linhas, um para cada vez
que a palavra ocorre no texto.
Projete um sistema para produzir um ndice remissivo. O sistema
dever ler um nmero arbitrrio de palavras chave que devero constituir o ndice remissivo, seguido da leitura de um texto de tamanho
arbitrrio, o qual dever ser esquadrinhado procura de palavras que
pertenam ao ndice remissivo.
Cabe ressaltar que:
a) Uma palavra considerada como uma seqncia de letras e dgitos, comeando com uma letra;
b) Apenas os primeiros cl caracteres devem ser retidos nas chaves.
Assim, duas palavras que no diferem nos primeiros cl caracteres
so consideradas idnticas;
c) Palavras constitudas por menos do que c1 caracteres devem ser
preenchidas por um nmero apropriado de brancos.
Utilize um mtodo eficiente para verificar se uma palavra lida do texto
pertence ao ndice. Para resolver este problema, voc deve utilizar
duas estruturas de dados distintas:

EXERCCIOS

151

a) Implementar o ndice como uma rvore de pesquisa;


b) Implementar o ndice como uma tabela hash, usando o mtodo
hashing linear para resolver colises.
Observe que, apesar do hashing ser mais eficiente do que rvores de
pesquisa, existe uma desvantagem na sua utilizao: aps atualizado
todo o ndice remissivo, necessrio imprimir suas palavras em ordem
alfabtica. Isto imediato em rvores de pesquisa, mas, quando se usa
hashing, isto problemtico, sendo necessrio ordenar a tabela hash
que contm o ndice remissivo.
Utilize o exemplo acima para testar seu programa. Comece a pensar to
logo seja possvel, enquanto o problema est fresco na memria e o
prazo para termin-lo est to longe quanto jamais poder estar.
15) Considere duas listas ordenadas de nmeros. Determine para cada
elemento da lista menor se ele est presente tambm na lista maior.
(Pode assumir que no existem duplicaes em nenhuma das duas listas.) Considere os seguintes casos:
uma lista contm apenas 1 elemento, a outra n
as duas listas contm n elementos

a) Sugira algoritmos eficientes para resolver o problema


b) Apresente o nmero de comparaes necessrio
c) Mostre que cada algoritmo minimiza o nmero de comparaes.
16) rvore Patricia Desenhe a rvore Patricia que resulta da insero
sucessiva das chaves
QUESTAOFCIL
numa rvore inicialmente vazia.
17) rvore Patricia
a) Desenhe a rvore Patricia que resulta da insero sucessiva das
chaves
MULTICS
numa rvore inicialmente vazia.
b) Qual o custo para pesquisar em uma rvore Patricia construda
atravs de n inseres randmicas? Explique.

152

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA


c) Qual o custo para construir uma rvore Patricia atravs de n
inseres randmicas? Explique.
i) Sob o ponto de vista prtico, quando n muito grande (digamos 100 milhes), qual a maior dificuldade para construir
a rvore Patricia?
ii) Como a dificuldade apontada no item anterior pode ser superada?

18) rvore Patricia (Murta, 1992)


Considere o seguinte trecho do poema "Quadrilha" de Carlos Drummond de Andrade:
"Joo amava Teresa que amava Raimundo que amava
Maria que amava Joaquim que amava Lill que no
amava ningum."
Construa uma rvore Patricia para indexar o texto acima. Considere
a seguinte codificao para as palavras do texto:
Joo
amava
Teresa
que
Raimundo

01001011
00011101
11101011
10100101
11011010

Maria
Joaquim
Lili
no
ningum

01100101
00101110
01010011
10011100
10110010

a) Faa uma pesquisa pelas chaves "amava", "que amava" e "Lill".


Mostre o caminho percorrido para cada pesquisa e as ocorrncias
do termo pesquisado.
b) Aponte a maior sequncia de palavras que se repete no banco de
dados e mostre como localizar, em qualquer rvore Patricia, este
tipo de ocorrncia.
19) rvore Patricia
Construa, passo a passo, a rvore Patricia para as seis primeiras chaves semi-infinitas do texto abaixo, representado como uma seqncia
de bits:
0 1 1 0 0 1 1 0 1 1 0 0 1 Texto
1 2 3 4 5 6 7 8 9 Posio

EXERCCIOS

153

20) rvore Patricia


Projete e implemente um sistema de programas para recuperao eficiente de informao em bancos de dados constitudos de textos. Tais
bancos de dados geralmente recebem adies peridicas, mas nenhuma
atualizao do que j existe realizada. Alm disso, o tipo de consulta aos dados totalmente imprevisvel. Estes conjuntos de dados
aparecem em sistemas legislativos, judicirios, bibliotecas, jornalismo,
automao de escritrio, dentre outros.
Neste trabalho voc deve utilizar um mtodo que cria um ndice cuja
estrutura uma rvore Patricia, construda a partir de uma sequncia
de chaves semi-infinitas.
O sistema de programas dever ser capaz de:
a) construir a rvore Patricia sobre um texto de tamanho arbitrrio,
representado como um conjunto de palavras;
b) ler um conjunto de palavras de tamanho arbitrrio;
c) encontrar todas as ocorrncias do conjunto de palavras no texto,
imprimindo junto com o conjunto algumas palavras anteriores e
posteriores no texto;
d) informar o nmero de ocorrncias do conjunto de palavras no
texto;
e) encontrar o maior conjunto de palavras que se repete pelo menos
uma vez no texto e informar o seu tamanho;
f) dado um inteiro encontrar, se houver, todas as ocorrncias de
conjuntos de palavras no texto cujo tamanho seja igual ao inteiro
dado.
21) Pat Array
Projete e implemente um sistema de programas para recuperao eficiente de informao em bancos de dados constitudos de textos. Tais
bancos de dados geralmente recebem adies peridicas, mas nenhuma
atualizao do que j existe realizada. Alm disso, o tipo de consulta aos dados totalmente imprevisvel. Estes conjuntos de dados
aparecem em sistemas legislativos, judicirios, bibliotecas, jornalismo,
automao de escritrio, dentre outros.
Neste trabalho voc deve utilizar uma estrutura de dados chamada
PAT array, (Gonnet e Baeza-Yates, 1991) construda a partir de uma
seqncia de chaves semi-infinitas. 0 PAT array uma representao
compacta da rvore Patricia (Seo 4.4), por armazenar

154

CAPTULO 4. PESQUISA EM MEMRIA PRIMRIA


apenas os nodos externos da rvore. 0 arranjo constitudo de apontadores para o incio de cada palavra de um arquivo de texto. Logo, necessrio apenas um apontador para cada ponto de indexao no texto.
Este arranjo dever estar indiretamente ordenado pela ordem lexicogrfica das chaves semi-infinitas, conforme mostrado na Figura 4.18.

A construo de um Pat array equivalente a ordenao de registros


de tamanhos variveis, representados pelas chaves semi-infinitas. Qualquer operao sobre a rvore Patricia poder ser simulada sobre o Pat
array a um custo adicional de O(log n). Mais ainda, para a operao
de pesquisa de prefixo a rvore Patricia no precisa de fato ser simulada, sendo possvel obter algoritmos de custo O(log n) ao invs de O(
log2 n) para esta operao. Esta operao pode ser implementada
atravs de uma pesquisa binria indireta sobre o arranjo, com o resultado de cada comparao sendo menor que, igual ou menor que. Pat
arrays so tambm chamados Suffix arrays (Manber e Myers, 1990).
O sistema de programas dever ser capaz de:
a) Construir o PAT array sobre um texto de tamanho arbitrrio,
representado como um conjunto de palavras;
b) Ler um conjunto de caracteres de tamanho arbitrrio. Este conjunto poder ser uma palavra ou um prefixo de palavra;
c) Informar o nmero de ocorrncias do conjunto de caracteres no
texto;
d) Encontrar todas as ocorrncias do conjunto de caracteres no texto,
imprimindo junto com o conjunto algumas palavras anteriores e
posteriores no texto;
e) Apresente a complexidade de pior caso para a letra c);
f) Mostre a relao entre o PAT array e a rvore Patricia.

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

CAPTULO 6. PESQUISA EM MEMRIA SECUNDRIA


um nico registro implica na transferncia de todos os registros de um
bloco para a memria principal.
A escrita de registros em um arquivo segue caminho contrrio. Na medida em que registros so escritos no arquivo eles vo sendo colocados
em posies contguas de memria na rea de armazenamento. Quando
a rea de armazenamento no possui espao suficiente para armazenar
mais um registro o bloco copiado para a memria secundria, deixando a rea de armazenamento vazia e pronta para receber novos
registros.
A tcnica de utilizao de reas de armazenamento evita que um processo que esteja realizando mltiplas transferncias de dados de forma
seqencial tenha que ficar esperando que as transferncias se realizem
para prosseguir o processamento. As transferncias so realizadas em
blocos pelo sistema operacional diretamente para uma rea de armazenamento. 0 processo usurio pega o dado nesta rea e somente
obrigado a esperar quando a rea se esvazia. Quando isto ocorre, o sistema operacional enche novamente a rea e o processo continua. Esta
tcnica pode ser aprimorada com o uso de duas ou mais reas de armazenamento. Neste caso, enquanto um processo est operando em
uma rea o sistema operacional enche a outra.

3. Para desenvolver um mtodo eficiente de pesquisa o aspecto sistema


de computao da maior importncia. As caractersticas da arquitetura e do sistema operacional da mquina tornam os mtodos de pesquisa dependentes de parmetros que afetam seus desempenhos. Assim, a transferncia de blocos entre as memrias primria e secundria
deve ser to eficiente quanto as caractersticas dos equipamentos disponveis o permitam. Tipicamente, a transferncia se torna mais eficiente quando o tamanho dos blocos de 512 bytes ou mltiplos deste
valor, at 4096 bytes.
Na prxima seo apresentamos um modelo de computao para memria
secundria que transforma o endereo usado pelo programador no endereo
fsico alocado para o dado a ser acessado. Este mecanismo utilizado pela
maioria dos sistemas atuais para controlar o trnsito de dados entre o disco e a
memria principal. A seguir, apresentamos o mtodo de acesso seqencial
indexado e mostramos sua utilizao para manipular grandes arquivos em
discos ticos de apenas leitura. Finalmente, apresentamos um mtodo eficiente para manipular grandes arquivos em discos magnticos que a rvore
n-ria de pesquisa.

5.1. MODELO DE COMPUTAO PARA MEM. SECUNDRIA

157

5.1 Modelo de Computao para Memria Secundria


Esta seo apresenta um modelo de computao para memria secundria
conhecido como memria virtual. Este modelo normalmente implementado como uma funo do sistema operacional. Uma exceo o sistema
operacional DOS para microcomputadores do tipo IBM-PC, que, apesar de
muito vendido no mundo inteiro, no oferece um sistema de memria virtual. Por essa razo, vamos apresentar o conceito e mostrar uma das formas
possveis de se implementar um sistema de memria virtual. Alm disso, o
conhecimento de seu funcionamento facilita a implementao eficiente dos
algoritmos para pesquisa em memria secundria tambm em ambientes que
j ofeream esta facilidade. Maiores detalhes sobre este tpico podem ser
obtidos em livros da rea de sistemas operacionais, tais como Lister (1975),
Peterson e Silberschatz (1983) e Tanenbaum (1987).
Memria Virtual
A necessidade de grandes quantidades de memria e o alto custo da memria
principal tm levado ao modelo de sistemas de armazenamento em dois
nveis. O compromisso entre velocidade e custo encontrado atravs do uso
de uma pequena quantidade de memria principal (at 640 kbytes em
microcomputadores do tipo IBM-PC usando sistema operacional DOS) e de
uma memria secundria muito maior (vrios milhes de bytes).
Como apenas a informao que est na memria principal pode ser acessada diretamente, a organizao do fluxo de informao entre as memrias
primria e secundria extremamente importante. A organizao desse
fluxo pode ser realizada utilizando-se um mecanismo simples e elegante para
transformar o endereo usado pelo programador na correspondente localizao fsica de memria. 0 ponto crucial a distino entre espao de endereamento endereos usados pelo programador e espao de memria
localizaes de memria no computador. O espao de endereamento N e
o espao de memria M pode ser visto como um mapeamento de endereos
do tipo
f:NM.
O mapeamento de endereos permite ao programador usar um espao de
endereamento que pode ser maior que o espao de memria primria disponvel. Em outras palavras, o programador enxerga uma memria virtual
cujas caractersticas diferem das caractersticas da memria primria.
Existem vrias formas de implementar sistemas de memria virtual. Um
dos meios mais utilizados o sistema de paginao no qual o espao de
endereamento dividido em pginas de igual tamanho, em geral mltiplos

158

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

de 512 bytes, e a memria principal dividida de forma semelhante em


Molduras_de_Pginas de igual tamanho. As Molduras de_Pginas contm
algumas pginas ativas enquanto o restante das pginas esto residentes em
memria secundria (pginas inativas). O mecanismo de paginao possui
duas funes, a saber:
a) realizar o mapeamento de endereos, isto , determinar qual pgina um
programa est endereando, e encontrar a moldura, se existir, que
contenha a pgina;
b) transferir pginas da memria secundria para a memria primria
quando necessrio, e transferi-las de volta para a memria secundria
quando no esto mais sendo utilizadas.
Para determinar a qual pgina um programa est se referindo, uma parte
dos bits que compe o endereo interpretada como um nmero de pgina
e a outra parte como o nmero do byte dentro da pgina. Por exemplo, se
o espao de endereamento possui 24 bits ento a memria virtual de 224
bytes; se o tamanho da pgina de 512 bytes (29) ento 9 bits so utilizados
para representar o nmero do byte dentro da pgina e os restantes 15 bits so
utilizados para representar o nmero da pgina.
O mapeamento de endereos a partir do espao de endereamento (nme
ro da pgina mais nmero do byte) para o espao de memria (localizao
fsica da memria) realizado atravs de uma Tabela_de_Pginas, cuja psima entrada contm a localizao p/ da Moldura_de_Pgina contendo a
pgina nmero p, desde que esteja na memria principal (a possibilidade de
que p no esteja na memria principal ser tratada logo frente). Logo, o
mapeamento de endereos
f(e)=f(p,b)=p/+b
onde o endereo de programa e (nmero da pgina p e nmero do byte b)
pode ser visto na Figura 5.1.
A Tabela_de_Pginas pode ser um arranjo do tamanho do nmero de
pginas possveis. Quando acontecer do programa enderear um nmero de
pgina que no esteja na memria principal, a entrada correspondente na
Tabela_de_Pginas estar vazia (p/ = nil) e a pgina correspondente ter que
ser trazida da memria secundria para a memria primria, atualizando a
Tabela_de_Pginas.
Se no existir uma Moldura_de_Pgina vazia no momento de trazer uma
nova pgina do disco ento alguma outra pgina tem que ser removida da
memria principal para abrir espao para a nova pgina. O ideal remover a
pgina que no ser referenciada pelo perodo de tempo mais longo no
futuro. Entretanto, no h meios de se prever o futuro. O que normalmente

MODELO DE COMPUTAO PARA MEM. SECUNDRIA

159

F i g u r a 5.1: Mapeamento de endereos para paginao

feito tentar inferir o futuro a partir do comportamento passado. Existem


vrios algoritmos propostos na literatura para a escolha da pgina a ser
removida. Os mais comuns so:
Menos Recentemente Utilizada (LRU). Um dos algoritmos mais utilizados o LRU (Least Recently Used), o qual remove a pgina menos
recentemente utilizada, partindo do princpio que o comportamento
futuro deve seguir o passado recente. Neste caso, temos que registrar a
seqncia de acesso a todas as pginas.
Uma forma possvel de implementar a poltica LRU para sistemas paginados atravs do uso de uma fila de Molduras_de_Pginas, conforme
ilustrado na Figura 5.2. Toda vez que uma pgina utilizada (para
leitura apenas, para leitura e escrita ou para escrita apenas), ela
removida para o fim da fila (o que implica na alterao de cinco apontadores). A pgina que est na moldura do incio da fila a pgina
LRU. Quando uma nova pgina tem que ser trazida da memria secundria ela deve ser colocada na moldura que contm a pgina LRU.
Menos Freqentemente Utilizada (LFU). 0 algoritmo LFU (Least Frequently Used) remove a pgina menos freqentemente utilizada. A
justificativa semelhante ao caso anterior, e o custo o de registrar o
nmero de acessos a todas as pginas. Um inconveniente que uma
pgina recentemente trazida da memria secundria tem um baixo
nmero de acessos registrados e, por isso, pode ser removida.

160

CAPTULO 5. PESQUISA EM MEMRIA SECUNDARIA

Figura 5.2: Fila de Molduras_de_Pginas

Ordem de Chegada (FIFO). 0 algoritmo FIFO (First In First Out)


remove a pgina que est residente h mais tempo. Este algoritmo o
mais simples e o mais barato de se manter. A desvantagem que ele
ignora o fato de que a pgina mais antiga pode ser a mais referenciada.
Toda informao necessria ao algoritmo escolhido para remoo de pginas pode ser armazenada em cada Moldura_de_Pgina. Para registrar o
fato de que uma pgina sofreu alterao no seu contedo (para sabermos se
ela ter que ser reescrita na memria secundria) basta manter um bit na
Moldura_de_Pgina correspondente.
Resumindo, em um sistema de memria virtual o programador pode
enderear grandes quantidades de dados, deixando para o sistema a responsabilidade de transferir o dado endereado da memria secundria para a
memria principal. Esta estratgia funciona muito bem para os algoritmos
que possuam uma localidade de referncia pequena, isto , cada referncia a
uma localidade de memria tem grande chance de ocorrer em uma rea que
relativamente perto de outras reas que foram recentemente referenciadas.
Isto faz com que o nmero de transferncias de pginas entre a memria
principal e a memria secundria diminua muito. Por exemplo, a maioria de
referncias a dados no Quicksort ocorre perto de um dos dois apontadores
que realizam a partio do conjunto, o que pode fazer com que este
algoritmo de ordenao interna funcione muito bem em um ambiente de
memria virtual para uma ordenao externa.

MODELO DE COMPUTAO PARA MEMRIA SECUNDRIA

161

P r o g r a m a 5.1: Estrutura de dados para o sistema de paginao

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

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

O diagrama da Figura 5.3 mostra a transformao do endereo virtual


para o endereo real de memria do sistema de paginao, tornando disponvel
na memria principal o registro endereado pelo programador. Os quadrados
representam resultados de processos ou arquivos, e os retngulos representam
os processos transformadores de informao.
A partir do endereo p o processo P1 verifica se a pgina que contm o
registro solicitado se encontra na memria principal. Caso a pgina esteja
na memria principal o processo P2 simplesmente retorna esta informao
para o programa usurio. Se a pgina est ausente o processo P3 determina
uma moldura para receber a pgina solicitada que dever ser trazida da
memria secundria. Caso no haja nenhuma moldura disponvel, alguma
pgina dever ser removida da memria principal para ceder lugar para a
nova pgina, de acordo com o algoritmo adotado para remoo de pginas.
Neste caso estamos assumindo o algoritmo mais simples de ser implementado, o FIFO, onde a pgina a ser removida a pgina que est na cabea da
fila de Molduras_de_Pginas. Se a pgina a ser substituda sofreu algum tipo

5.2. ACESSO SEQENCIAL INDEXADO

163

Figura 5.3: Endereamento no sistema de paginao

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

CAPTULO 5. PESQUISA EM MEMRIA SECUNDARIA

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.

Figura 5.4: Estrutura de um arquivo seqencial indexado


Em um disco magntico vrias superfcies de gravao so utilizadas,
conforme ilustra a Figura 5.5. 0 disco magntico dividido em crculos
concntricos chamados trilhas. Quando o mecanismo de acesso est posicionado em uma determinada trilha, todas as trilhas que esto verticalmente
alinhadas e possuem mesmo dimetro formam um cilindro. Neste caso, uma
referncia a um registro que se encontre em uma pgina de qualquer trilha do
cilindro no requer o deslocamento do mecanismo de acesso e o nico tempo
necessrio o de latncia rotacional, que o tempo necessrio para que o
incio do bloco que contenha o registro a ser lido passe pela cabea de leitura/gravao. A necessidade de deslocamento do mecanismo de acesso de
uma trilha para outra responsvel pela parte maior do custo para acessar os
dados e chamado de tempo de busca (seek time).
Pelo fato de combinar acesso indexado com a organizao seqencial o
mtodo chamado de acesso seqencial indexado. Para aproveitar as caractersticas do disco magntico e procurar minimizar o nmero de deslocamentos do mecanismo de acesso utiliza-se um esquema de ndices de cilindros e de
pginas. Dependendo do tamanho do arquivo e da capacidade da memria
principal disponvel possvel acessar qualquer registro do arquivo de dados
realizando apenas um deslocamento do mecanismo de acesso. Para tal, um
ndice de cilindros contendo o valor de chave mais alto dentre os registros

5.2. ACESSO SEQENCIAL INDEXADO

165

Figura 5.5: Disco magntico

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

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

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

5.2. ACESSO SEQENCIAL INDEXADO

167

de ponto de ncora. Neste caso, o tempo de procura desprezvel se


comparado com o tempo de latncia rotacional. Para acessar trilhas fora da
varredura esttica o tempo de procura varia de 200 at 600 milissegundos.
Conforme mostrado na seo imediatamente anterior, a estrutura seqencial indexada permite tanto o acesso seqencial quanto o acesso randmico
aos dados. Nos discos magnticos a estrutura seqencial indexada implementada mantendo-se um ndice de cilindros na memria principal. Neste
caso, cada acesso demanda apenas um deslocamento do mecanismo de acesso,
desde que cada cilindro contm um ndice de pginas com o maior valor de
chave em cada pgina daquele cilindro. Entretanto, para aplicaes
dinmicas esta condio no pode ser mantida se um nmero grande de
registros tem que ser adicionado ao arquivo. No caso dos discos CD-ROM
esta organizao particularmente interessante devido natureza esttica da
informao.
O conceito de cilindro em discos magnticos pode ser estendido para os
discos CD-ROM. Barbosa e Ziviani (1992) denominaram o conjunto de
trilhas cobertas.por uma varredura esttica de cilindro tico. 0 cilindro tico
difere do cilindro de um disco magntico em dois aspectos: (i) as trilhas de
uma varredura esttica que compem um cilindro tico podem se sobrepor a
trilhas de outro cilindro tico com ponto de ncora prximo; (ii) como as
trilhas tm capacidade varivel, os cilindros ticos com ponto de ncora em
trilhas mais internas tm capacidade menor do que cilindros ticos com
ponto de ncora em trilhas mais externas.
Em um trabalho analtico sobre discos ticos Christodoulakis e Ford (
1988) demonstraram que o nmero de deslocamentos e a distncia total
percorrida pela cabea tica de leitura so minimizados quando (i) as trilhas
de duas varreduras estticas consecutivas no se sobrepem, (ii) a cabea de
leitura se movimenta apenas em uma direo durante a recuperao de um
conjunto de dados.
A estrutura seqencial indexada pode ser implementada eficientemente
no CD-ROM considerando a natureza esttica da informao e a capacidade
de varredura esttica do mecanismo de leitura. A partir destas observaes,
Barbosa e Ziviani (1992) propuseram uma estrutura seqencial indexada
para discos CD-ROM na qual o mecanismo de leitura posicionado em
cilindros ticos pr-selecionados, com o objetivo de evitar sobreposio de
varreduras e minimizar o nmero de deslocamentos da cabea de leitura.
Para tal, a estrutura de ndices construda de maneira que cada pgina de
ndices faa referncia ao maior nmero possvel de pginas de dados de um
cilindro tico.
A Figura 5.6 mostra esta organizao para um arquivo exemplo de 3
Megabytes, alocado a partir da trilha 1940 do disco, no qual cada pgina
ocupa 2 Kbytes (equivalente a 1 setor do disco). Supondo que o mecanismo
de leitura tenha uma amplitude de varredura esttica de 8 trilhas, na posio

168

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

Figura 5.6: Organizao de urn arquivo indexado seqencial para o CD-ROM

de trilha nmero 1940 possvel acessar aproximadamente 78 setores sem


deslocamento da cabea de leitura. Assim sendo, para obter uma organizao
seqencial indexada para este arquivo so necessrios os seguintes passos:
1. Alocar o arquivo no disco determinando a trilha inicial e calculando a
trilha final que ele deve ocupar;
2. Computar o nmero total de cilindros ticos para cobrir todas as trilhas do arquivo sem que haja sobreposio de trilhas. Determine os
respectivos pontos de ncora;
3. Construir um ndice de cilindros ticos, o qual dever conter o valor de
chave mais alto associado aos registros que esto dentro de cada
cilindro tico. 0 ndice de cilindros ticos deve ser mantido na memria
principal;
4. Construir um ndice de pginas para cada cilindro tico. Este ndice
dever conter o valor de chave mais alto de cada pgina e deve ser
armazenado na trilha central ou ponto de ncora de cada cilindro tico.
Para recuperar uma dada chave de pesquisa o primeiro passo obter o
endereo do cilindro tico que contm a chave consultando o ndice de cilindros ticos na memria principal. 0 mecanismo de leitura ento deslocado
para o ponto de ncora selecionado na nica operao de busca necessria. A
seguir, o ndice de pginas lido e a pgina de dados contendo a chave de
pesquisa poder ser encontrada dentro dos limites da varredura esttica. Os
detalhes para obteno do nmero de trilhas que um arquivo deve ocupar a
partir de determinada posio no disco, os pontos de ncora dos cilindros
ticos, ou quaisquer outros, podem ser obtidos em Barbosa e Ziviani (1992).

5.19. RVORES DE PESQUISA

169

5.3 rvores de Pesquisa


As rvores binrias de pesquisa introduzidas na Seo 4.3 so estruturas de
dados muito eficientes quando se deseja trabalhar com tabelas que caibam inteiramente na memria principal do computador. Elas satisfazem condies e
requisitos diversificados e conflitantes, tais como acesso direto e seqencial,
facilidade de insero e retirada de registros e boa utilizao de memria.
Vamos agora considerar o problema de recuperar informao em grandes
arquivos de dados que estejam armazenados em memria secundria do tipo
disco magntico. Uma forma simplista de resolver este problema utilizando
rvores binrias de pesquisa armazenar os nodos da rvore no disco e os
apontadores esquerda e direita de cada nodo se tornam endereos de disco
ao invs de endereos de memria principal. Se a pesquisa for realizada utilizando o algoritmo de pesquisa para memria principal visto anteriormente
sero necessrios da ordem de log2 n acessos a disco, significando que um
arquivo com n = 106 registros necessita aproximadamente log2 106 20
buscas no disco.
Para diminuir o nmero de acessos a disco, os nodos da rvore podem ser
agrupados em pginas, conforme ilustra a Figura 5.7. Neste exemplo, o
formato da rvore muda de binrio para quaternrio, com quatro filhos por
pgina, onde o nmero de acessos a pginas cai para metade no pior caso.
Para arquivos divididos em pginas de 127 registros, possvel recuperar
qualquer registro do arquivo com trs acessos a disco no pior caso.

Figura 5.7: rvore binria dividida em pginas


A forma de organizar os nodos da rvore dentro de pginas muito importante sob o ponto de vista do nmero esperado de pginas lidas quando se
realiza uma pesquisa na rvore. A rvore da Figura 5.7 tima sob este
aspecto. Entretanto, a organizao tima difcil de ser obtida durante a
construo da rvore, tornando-se um problema de otimizao muito com-

170

CAPTULO 20. PESQUISA EM MEMRIA SECUNDRIA

plexo. Um algoritmo bem simples, o da alocao seqencial, armazena os


nodos em posies consecutivas na pgina medida em que vo chegando,
sem considerar o formato fsico da rvore. Este algoritmo utiliza todo o
espao disponvel na pgina, mas os nodos dentro da pgina esto relacionados pela localidade da ordem de entrada das chaves e no pela localidade
dentro da rvore, o que torna o tempo de pesquisa muito pior do que o tempo
da rvore tima.
Um mtodo de alocao de nodos em pginas que leva em considerao a
relao de proximidade dos nodos dentro da estrutura da rvore foi proposto
por Muntz e Uzgalis (1970). No mtodo proposto, o novo nodo a ser inserido
sempre colocado na mesma pgina do nodo pai. Se o nodo pai estiver em uma
pgina cheia, ento uma nova pgina criada e o novo nodo colocado no
incio da nova pgina. Knuth (1973) mostrou que o nmero esperado de
acessos a pginas em uma pesquisa na rvore muito prxih (1973) mostrou
que o nmero esperado de acessos a pginas em uma pesquisa na rvore
muito prximo do timo. Entretanto, a ocupao mdia das pginas
extremamente baixa, da ordem de 10%, o que torna o algoritmo invivel para
aplicaes prticas.
Uma soluo brilhante para este problema, simultaneamente com uma
proposta para manter equilibrado o crescimento da rvore e permitir inseres e retiradas a vontade, o assunto da prxima seo.

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

5.3. RVORES DE PESQUISA

171

no mximo 2m registros (e 2m + 1 descendentes), exceto a pgina raiz


que pode conter entre 1 e 2m registros;
2. todas as pginas folha aparecem no mesmo nvel.
Uma rvore B de ordem m = 2 com 3 nveis pode ser vista na Figura 5.8.
Todas as pginas contm 2, 3, ou 4 registros, exceto a raiz que pode conter um
registro apenas. Os registros aparecem em ordem crescente da esquerda para
a direita. Este esquema representa uma extenso natural da organizao da
rvore binria de pesquisa. A Figura 5.9 apresenta a forma geral de uma
pgina de uma rvore B de ordem m.

Figura 5.9: Nodo de uma rvore B de ordem m com 2m registros

A estrutura de dados rvore B ser utilizada para implementar o tipo


abstrato de dados Dicionrio, com as operaes Inicializa, Pesquisa, Insere e
Retira. A estrutura e a representao do Dicionrio apresentada no
Programa 5.3, onde mm significa 2m. 0 procedimento Inicializa extremamente simples, conforme ilustra o Programa 5.4.
Um procedimento Pesquisa para rvore B semelhante ao algoritmo
Pesquisa para rvore binria de pesquisa, conforme pode ser visto no Programa 5.5. Para encontrar um registro x, primeiro compare a chave que
rotula o registro com as chaves que esto na pgina raiz, at encontrar o
intervalo onde ela se encaixa. Depois, siga o apontador para a subrvore
correspondente ao intervalo citado e repita o processo recursivamente, at
que a chave procurada seja encontrada ou ento uma pgina folha seja atingida (no caso um apontador nulo). Na implementao do Programa 5.5 a

172

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

Programa 5.4: Procedimento para inicializar uma rvore B

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.

5.3. RVORES DE PESQUISA

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

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

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);

Programa 5.G: Primeiro refinamento do algoritmo Insere na rvore B

O procedimento Insere utiliza o procedimento auxiliar InsereNaPgina


mostrado no Programa 5.7.

5.3. RVORES DE PESQUISA

175

176

CAPITULO 5. PESQUISA EM MEMRIA SECUNDRIA

P r o g r a m a 5.8: Refinamento final do algoritmo Insere

A Figura 5.11 mostra o resultado obtido quando se insere uma seqncia


de chaves em uma rvore B de ordem 2: A rvore da Figura 5.11, parte (a),
obtida aps a insero da chave 20, a rvore da parte (b) obtida aps a
insero das chaves 10, 40, 50 e 30 na rvore da parte (a), a rvore da parte

5.3. RVORES DE PESQUISA

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.

Figura 5.11: Crescimento de uma rvore B de ordem 2

A ltima operao a ser estudada de retirada. Quando a pgina que


contm o registro a ser retirado uma pgina folha a operao simples. No
caso de no ser uma pgina folha, o registro a ser retirado deve ser primeiro
substitudo por um registro contendo uma chave adjacente (antecessora ou
sucessora), como no caso da operao de retirada de registros em rvores
binrias de pesquisa, conforme mostrado na Seo 4.3. Para localizar uma
chave lexicograficamente antecessora, basta procurar pela pgina folha mais
direita na subrvore esquerda. Por exemplo, a antecessora da chave 30
na rvore da Figura 5.11 (d) a chave 28.
To logo o registro seja retirado da pgina folha, necessrio verificar se
pelo menos m registros passam a ocupar a pgina. Quando menos do que m
registros passam a ocupar a pgina significa que a propriedade rvore B
violada. Para reconstituir a propriedade rvore B necessrio tomar
emprestado um registro da pgina vizinha. Conforme pode ser verificado na
Figura 5.12, existem duas possibilidades:
1. O nmero de registros na pgina vizinha maior do que m: basta tomar
um registro emprestado e traz-lo para a pgina em questo via pgina
pai. A Figura 5.12 (a) mostra a retirada da chave 3.

178

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

2. No existe um nmero suficiente de registros na pgina vizinha (a pgina


vizinha possui exatamente m registros): neste caso o nmero total de
registros nas duas pginas 2m 1 e, conseqentemente, as duas
pginas tm que ser fundidas em uma s, tomando emprestado da pgina
pai o registro do meio, o que permite liberar uma das pginas. Este
processo pode se propagar at a pgina raiz e no caso em que o nmero
de registros da pgina raiz fica reduzido a zero ela eliminada, causando
reduo na altura da rvore. A Figura 5.12 (b) mostra a retirada da chave
3.

(b) Pgina vizinha possui exatamente m registros


Figura 5.12: Retirada da chave 3 na rvore B de ordem m = 1

O procedimento Retira apresentado no Programa 5.9. 0 procedimento


contm um outro procedimento interno recursivo, de nome Ret. No procedimento Ret, quando a pgina que contm o registro a ser retirado uma
pgina folha a operao simples. No caso de no ser uma pgina folha, a
tarefa de localizar o registro antecessor realizada pelo procedimento Antecessor. A condio de que menos do que m registros passam a ocupar a
pgina sinalizada pelo parmetro Diminuiu, fazendo com que o procedimento Reconstitui seja ativado.
procedure Retira (Ch : TipoChave; var Ap : Apontador);
var Diminuiu : Boolean;
Aux
: Apontador;
procedure Ret(Ch:TipoChave; var Ap:Apontador; var Diminuiu:Boolean);
var Ind, j : integer;

5.29. RVORES DE PESQUISA

179

180

CAPTULO 30. PESQUISA EM MEMRIA SECUNDARIA

5.3. RVORES DE PESQUISA

181

182

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

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.

Para recuperar um registro, o processo de pesquisa inicia-se na raiz da


rvore e continua at uma pgina folha. Como todos os registros residem nas
folhas, a pesquisa no pra se a chave procurada for encontrada em uma
pgina do ndice. Neste caso o apontador direita seguido at que uma
pgina folha seja encontrada. Esta caracterstica pode ser vista na rvore B*
da Figura 5.15 onde as chaves 29, 60, e 75 aparecem no ndice e em registros
do arquivo. Os valores encontrados ao longo do caminho so irrelevantes
desde que eles conduzam pgina folha correta.
Como no h necessidade do uso de apontadores nas pginas folha
possvel utilizar este espao para armazenar uma quantidade maior de registros em cada pgina folha. Para tal devemos utilizar um valor de m
diferente para para as pginas folha. Isto no cria nenhum problema para os
algoritmos de insero pois as metades de uma pgina que est sendo particionada permanecem no mesmo nvel da pgina original antes da partio (
algo semelhante acontece com a retirada de registros).
A estrutura de dados rvore B* apresentada no Programa 5.10.
O procedimento Pesquisa deve ser implementado como no Programa 5.11.

33.3. RVORES DE PESQUISA

183

184

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA

Figura 5.15: Exemplo de uma rvore B"

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

5.35. RVORES DE PESQUISA

185

F i g u r a 5.16: Retirada de registros em rvores B*

de pginas no mesmo caminho da rvore. Pode acontecer que o processo que


est percorrendo a pgina pode obter um apontador que fica apontando para
uma subrvore errada ou para um endereo inexistente.
Uma pgina chamada segura quando se sabe que no existe possibilidade de modificaes na estrutura da rvore, como conseqncia de uma
operao de insero ou de retirada naquela pgina. Cabe lembrar que a
operao de recuperao no altera a estrutura da rvore, ao contrrio das
operaes de insero ou retirada, que podem provocar modificaes na estrutura da rvore. No caso de operaes de insero, uma pgina considerada segura se o nmero atual de chaves naquela pgina menor do que 2m.
No caso de operaes de retirada, uma pgina considerada segura quando o
nmero de chaves na pgina maior do que m. Os algoritmos para acesso
concorrente fazem uso destes fatos para aumentar o nvel de concorrncia em
uma rvore B*.
Bayer e Schkolnick (1977) apresentam um conjunto de trs diferentes
alternativas de protocolos para travamentos1 (lock protocols) que asseguram
a integridade dos caminhos de acesso aos dados da rvore B*, e, ao mesmo
tempo, permitem acesso concorrente. Em uma das alternativas pro-postas a
operao de recuperao trava (ou retm) uma pgina to logo ela seja lida,
de modo que outros processos no possam interferir com a pgina. Na
medida em que a pesquisa continua em direo ao nvel seguinte
1 Um protocolo para travamento um mecanismo que assegura a modificao de apenas
uma pgina de cada vez na rvore.

186

CAPTULO 36. PESQUISA EM MEMRIA SECUNDARIA

da rvore, a trava aplicada na pgina antecessora liberada, permitindo a


leitura das pginas por outros processos.
Um processo executando uma operao de recuperao chamado processo leitor, enquanto um processo executando uma operao de insero ou
de retirada chamado processo modificador. A operao de modificao
requer protocolos mais sofisticados, porque tal operao pode modificar as
pginas antecessoras nos nveis acima. Em uma das alternativas apresentadas
por Bayer e Schkolnick (1977), o processo modificador coloca um
travamento exclusivo em cada pgina acessada, podendo mais tarde liberar
o travamento caso a pgina seja segura.
Vamos apresentar a seguir o protocolo para processos leitores e o
protocolo para processos modificadores relativos alternativa mais
simples dentre as trs alternativas apresentadas por Bayer e Schkolnick
(1977). Estes protocolos utilizam dois tipos de travamento:
1. o travamento-para-leitura, que permite um ou mais leitores acessarem
os dados, mas no permite insero ou retirada de chaves;
2. o travamento-exclusivo, que permite qualquer tipo de operao na
pgina (quando um processo recebe este tipo de travamento, nenhum
outro processo pode operar na pgina).
O protocolo para processos leitores :
(0) Coloque um travamento-para-leitura na raiz;
(1) Leia a pgina raiz e faa-a pgina corrente;
(2) Enquanto a pgina corrente no uma pgina folha faa {o n de
travamentos-para-leitura mantidos pelo processo = 1 }
(3) Coloque um travamento-para-leitura no descendente apropriado;
(4) Libere o travamento-para-leitura na pgina corrente;
(5) Leia a descendente cia pgina corrente e faa-a pgina corrente.
O protocolo para processos modificadores :
(0) Coloque um travamento-exclusivo na raiz;
(1) Leia a pgina raiz e faa-a pgina corrente;
(2) Enquanto a pgina corrente no uma pgina folha faa {o nmero
de travamentos-exclusivos mantidos pelo processo 1 }
(3) Coloque um travamento-exclusivo no descendente apropriado;
(4) Leia a descendente da pgina corrente e faa-a pgina corrente;
(5) Se a pgina corrente segura ento libere todos os travamentos
mantidos sobre as pginas antecessoras da pgina corrente.

5.37. RVORES DE PESQUISA

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

CAPTULO 38. PESQUISA EM MEMRIA SECUNDARIA

Figura 5.17: Parte de uma rvore B*

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.

5.3 . RVORES DE PESQUISA

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

O custo para processar uma operao de recuperao de um registro


cresce com o logaritmo base m do tamanho do arquivo. Para se ter uma idia
do significado da frmula acima, considere a Tabela 5.1. Uma rvore B de
ordem 50, representando um ndice de um arquivo de um milho de registros,
permite a recuperao de qualquer registro com 4 acessos ao disco, no pior
caso. Na realidade o nmero de acessos no caso mdio e 3.
A altura esperada de uma rvore B no conhecida analiticamente, pois
ningum foi capaz de apresentar um resultado analtico. A partir do clculo
analtico do nmero esperado de pginas para os quatro primeiros nveis

190

CAPTULO 5. PESQUISA EM MEMRIA SECUNDRIA


Tamanho
Tamanho do arquivo
da pgina 1 . 0 0 0 10.000 100.000 1.000.000
10
3
4
5
6
50
2
3
3
4
100
2
2
3
3
150
2
2
3
3

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

Outras medidas de complexidade relevantes para as rvores B randmicas


so:
1. A utilizao de memria cerca de ln 2 para o algoritmo original proposto por Bayer e McCreight (1972). Isto significa que as pginas tm
uma ocupao de aproximadamente 69% da rea reservada aps N
inseres randmicas em uma rvore B inicialmente vazia.
2. No momento da insero, a operao mais cara a partio da pgina
quando ela passa a ter mais do que 2m chaves, desde que a operao
envolve a criao de uma nova pgina, o rearranjo das chaves e a insero da chave do meio na pgina pai localizada no nvel acima. Uma
medida de complexidade de interesse Pr{j parties}, que corresponde probabilidade de que j parties ocorram durante a N-sima
insero randmica. No caso da rvore 2-3

5.3. RVORES DE PESQUISA

191

No caso de uma rvore B de ordem m = 70, Pr{1 ou mais parties}


0, 01. Em outras palavras, em 99% das vezes nada acontece em termos
de parties durante uma insero.
3. Considere o acesso concorrente em rvores B. Bayer e Schkolnick (1977)
propuseram a tcnica de aplicar um travamento na pgina segura mais
profunda (Psmp) no caminho de insero. De acordo com o que foi
mostrado na Seo 5.3.3, uma pgina segura se ela contm menos do
que 2m chaves. Uma pgina segura a mais profunda de um caminho
de insero se no existir outra pgina segura abaixo dela.
Desde que o travamento da pgina impede o acesso de outros processos
interessante saber qual a probabilidade de que a pgina segura mais
profunda esteja no primeiro nvel. Estas medidas esto relacionadas
com as do item anterior. No caso da rvore 2-3

Novamente, no caso de uma rvore B de ordem m = 70, em 99% das


vezes a pgina segura mais profunda (Psmp) est localizada em uma
pgina folha, o que permite um alto grau de concorrncia para processos modificadores. Estes resultados mostram que solues muito complicadas para permitir o uso de concorrncia de operaes em rvores
B no trazem grandes benefcios porque, na maioria das vezes, o travamento ocorrer em pginas folha, o que permite alto grau de concorrncia mesmo para os protocolos mais simples.
Maiores detalhes sobre os resultados analticos apresentados acima podem ser obtidos em Eisenbarth et al. (1982).

192

CAPTULO 5. PESQUISA EM MEMRIA SECUNDARIA

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

CAPTULO 5. PESQUISA EM MEMRIA SECUNDARIA

Para mostrar o pleno funcionamento do sistema importante criar


procedimentos para mostrar o contedo de todas as pginas em
disco, da fila de Moldura_de_Pginas e da Tabela_de_Pginas. Estes procedimentos devem ser invocados pelo programa de teste
nos momentos mais interessantes para se ver o comportamento do
sistema (talvez seja interessante realizar uma adaptao do
programa DEMO para fins de testar o SMV conforme descrito
acima). A impresso de todos estes momentos deve ser fornecida
junto com a listagem do programa de teste.
3) O objetivo deste trabalho projetar e implementar um sistema de
programas para recuperar, inserir e retirar registros de um arquivo que
pode conter at alguns poucos milhes de registros. A aplicao que
utiliza o arquivo bastante dinmica, existindo um grande nmero de
consultas e atualizaes (inseres, retiradas e alteraes de registros).
Alm do mais a aplicao requer periodicamente a recuperao total ou
parcial dos registros na ordem lexicogrfica das chaves. Es-tas
caractersticas sugerem fortemente a utilizao de rvore B como
estrutura de dados. 0 que fazer:
a) Para implementar os algoritmos de pesquisa, insero e retirada em
uma rvore B de ordem m utilize o pacote SMV.PAS proposto em
exerccio acima, para criar um ambiente de memria virtual e
resolver o problema de fluxo de dados entre as memrias primria
e secundria.
b) Para testar o seu sistema de programas para uma rvore B de
ordem m = 2, utilize a seguinte seqncia de chaves: Insero:
20; 10 40 50 30; 55 3 11 4 28; 36; 33 52 17 25 13; 45 9 43 8 48;
A cada ponto-e-vrgula voc dever imprimir a rvore. Retirada:
45 30 28; 50 8; 10 4 20 40 55; 17 33 11 36; 3 11 52; A cada
ponto-e-vrgula voc dever imprimir a rvore.
c) Para termos uma idia da eficincia do mtodo de acesso construdo faa a medida do tempo de execuo para:
a) Construir rvores B de tamanhos 1.000, 10.000 e 50.000 chaves geradas randomicamente atravs de um gerador de nmeros aleatrios. A medida de tempo deve ser tomada de forma
independente para cada uma das trs rvores. A ordem m das
rvores deve ser tal que o tamanho da pgina seja igual ou
menor do que 512 bytes.

EXERCCIOS

19 5

b) Para a maior das trs rvores que voc conseguiu construir


gere aleatoriamente um conjunto de 200 chaves e realize uma
pesquisa na rvore para cada chave. Caso haja chaves que
no estejam presentes no arquivo informe quantas pesquisas
foram com sucesso e quantas foram sem sucesso. Com esta
medida podemos ter uma idia do tempo aproximado para
pesquisar um registro no arquivo.
Ateno: procure interpretar os resultados obtidos. Por exemplo,
voc deve informar qual foi o nmero de Molduras_de_Pginas
utilizadas para os experimentos acima (com 256 Kbytes de
memria real disponvel possvel manter cerca de 120 molduras
na memria principal). Quaisquer outras observaes relevantes
devem ser relatadas.
Observaes:
a) A pesquisa da chave de um registro dentro de uma pgina da
rvore B pode ser feita atravs de uma pesquisa seqencial.
b) A deciso sobre a documentao a ser apresentada fica por conta
do aluno.
4) Modifique a implementao do procedimento original apresentado no
Programa 5.5 para que a pesquisa da chave dentro de uma pgina da
rvore B seja realizada atravs de um pesquisa binria.

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

Bayer, R. e Schkolnick, M. (1977) "Concurrency of Operations on B-trees:


Acta Informatica 9(1), 1-21.
Carvalho, M.L.B. (1992) Comunicao Pessoal, Belo Horizonte, MG.
Clancy, M. e Cooper, D. (1982) Oh! Pascal. W . W. Norton, New York, NY.
Comer, D. (1979) "The Ubiquitous B-tree," ACM Computing Surveys 11(2),
121-137.
Cooper, D. (1983) Standard Pascal User Reference Manual. W . W . Norton,
New York, NY.
Cormem, T.H., Leiserson, C.E. e Rivest, R.L. (1990) Introduction to Algorithms. McGraw-Hill e The Mit Press, Cambridge, Mass.
Dahl, O.J., Dijkstra, E.W. e Hoare, C.A.R. (1972) Structured Programming.
Academic Press, New York, NY.
Dijkstra, E.W. (1965) "Co-operating Sequential Processes". In Programming
Languages F. Genuys (ed.), Academic Press, New York, NY.
Dijkstra, E.W. (1971) A Short Introduction to the Art of Programming.
Technological University Endhoven.
Dijkstra, E.W. (1976) A Discipline of Programming. Prentice-Hall, Englewood Cliffs, NJ.
Eisenbarth, B., Ziviani, N., Gonnet, G.H., Mehlhorn, K. e Wood, D. (1982) "
The Theory of Fringe Analysis and Its Application to 2-3 Trees and BTrees", Information and Control 55 (1-3), 125-174.
Feller, W. (1968) An Introduction to Probability Theory and Its Applications.
Vol. 1, Wiley, New York, NY.
Flajolet, P. e Vitter, J.S. (1987) "Average-case Analysis of Algorithms and
Data Structures". Technical Report 718, INRIA, Frana.
Floyd, R.W. (1964) "Treesort". Algorithm 243, Communications ACM 7(12),
701.
Furtado, A.L. (1984) Comunicao Pessoal, Rio de Janeiro, RJ.
Garey, M.R. e Johnson, D.S. (1979) Computers and Intractability A Guide
to the Theory of NP-Completeness. Freeman, San Francisco, CA.

REFERNCIAS BIBLIOGRFICAS

257

Gonnet, G.H. e Baeza-Yates, R. (1991) Handbook of Algorithms and Data


Structures. Addison-Wesley, Reading, Mass., segunda edio. Graham,
R.L., Knuth, D.E. e Patashnik, O. (1989) Concrete Mathematics.
Addison-Wesley, Reading, Mass.
Greene, D.H. e Knuth, D.E. (1982) Mathematics for the Analysis of Algorithms. Birkhanser, Boston, Mass.
Guibas, L. e Sedgewick, R. (1978) "A Dichromatic Framework for Balanced
Trees", 19th Annual Symposium on Foundations of Computer Science,
IEEE.
Hibbard, T.N. "Some Combinatorial Properties of Certain Trees with Applications to Searching and Sorting". Journal of the ACM 9, 13-28.
Hoare, C.A.R. (1962) "Quicksort". The Computer Journal 5(1), 10-15.
Hoare, C.A.R (1969) "Axiomatic Bases of Computer Programming". Communications ACM 12 (10), 576-583.
Horowitz, E. e Sahni, S. (1978) Fundamentals of Computer Algorithms.
Computer Science Press, Potomac, Maryland.
Jensen, K. e Wirth, N. (1974) Pascal User Manual and Report. SpringerVerlag, Berlin, segunda edio.
Keehn, D. e Lacy, J. (1974) "VSAM Data Set Design Parameters". IBM
Systems Journal 3, 186-212.
Knott, G. (1975) "Hashing Functions". The Computer Journal 18 (3), 265-378.
Knuth, D.E. (1968) The Art of Computer Programming, Vol.1: Fundamental
Algorithms. Addison-Wesley, Reading, Mass.
Knuth, D.E. (1971) "Mathematical Analysis of Algorithms". Procedings
IFIP Congress 71, vol. 1, North Holland, Amsterdam, Holanda, 135143.
Knuth, D.E. (1973) The Art of Computer Programming; Volume 3: Sorting and
Searching. Addison-Wesley, Reading, Mass.
Knuth, D.E. (1976) "Big Omicron and Big Omega and Big Theta". ACM
SIGACT News 8 (2), 18-24.
Knuth, D.E. (1981) The Art of Computer Programming, Vol. 2: Seminumerical Algoritms. Segunda edio, Addison-Wesley, Reading, Mass.

258

REFERNCIAS BIBLIOGRFICAS

Lister, A.M. (1975) Fundamentals of Operating Systems. Macmillan, London.


Lueker, G.S. (1980) "Some Techniques for Solving Recurrences". ACM
Computing Surveys 12(4), 419-436.
Manber, U. (1988) "Using Induction to Design Algorithms". Communications ACM 31 (11), 1300-1313.
Manber, U. (1989) Introduction to Algorithms A Creative Approach. Addison-Wesley, Reading, Mass.
Manber, U. e Myers, G. (1990) "Suffix Arrays: A New Method for On-Line
String Searches". 1st ACM-SIAM Symposium on Discrete Algorithms,
San Francisco, CA, 319-327.
Morrison, D.R. (1968) "PATRICIA - Practical Algorithm To Retrieve Information Coded In Alphanumeric". Journal of the ACM15(4), 514-534.
Murta, C.D. (1992) Comunicao Pessoal. Belo Horizonte, MG.
Mehlhorm, K. (1984) Data Structures and Algorithms, Vol.1: Sorting and
Searching. Springer-Verlaq, Berlin.
Olivi, H. (1980) "Symmetric Binary B-Trees Revisited" , Technical Report
80-01, Interstedelijke Industrile Hogerschool Antwerpen-Mechelen, Blgica.
Peterson, J. e Silberschatz, A. (1983) Operating System Concepts. AddisonWesley, Reading, Mass.
Sedgewick, R. (1975) "The Analysis of Quicksort Programs". Acta Informatica 7, 327-355.
Sedgewick, R. (1978) Quicksort. Garland. (tambm publicado como tese de
doutorado do autor, Stanford University, C.S. Department Techical
Report 75-492, 1975).
Sedgewick, R. (1978a) "Implementing Quicksort Programs". Communications ACM 21 (10), 847-857.
Sedgewick, I t (1988) Algorithms. Addison-Wesley, Reading, Mass., segunda edio.
Shell, D.L. (1959) "A Highspeed Sorting Procedure". Communications
ACM 2(7), 30-32.

REFERNCIAS BIBLIOGRFICAS

259

Sleator, D.D. e Tarjan, R.E. (1985) "Self-Adjusting Binary Search Trees".


Journal of the ACM 32, 652-686.
Stanat, D.F. e McAllister, D.F. (1977) Discrete Matematics in Computer
Science. Prentice-Hall, Englewood Cliffs, NJ, Capitulo 5, 218-274.
Standish, T.A. (1980) Data Structures Techniques. Addison-Wesley, Reading, Mass.
Tanenbaum, A.S. (1987) Operating Systems: Design and Implementation.
Prentice-Hall, Englewood Cliffs, NJ.
Tarjan, R.E. (1983) Data Structures and Network Algorithms. SIAM, Philadelphia, Pennsylvania.
Tarjan, R.E. (1985) "Amortized Computational Complexity". SIAM Journal
on Applied and Discrete Mathematics 6, 306-318.
Terada, R. (1991) Desenvolvimento de Algoritmos e Estruturas de Dados.
McGraw-Hill e Makron Books do Brasil, So Paulo, SP.
Vuillemin, J. (1978) "A Data Structure for Manipulating Priority Queues".
Communications ACM 21 (4), 309-314.
Wagner, R. (1973) "Indexing Design Considerations," IBM Systems Journal4, 351-367.
Weide, B. (1977) "A Survey of Analysis Techniques for Discrete Algorithms". ACM Computing Surveys 9 (4), 291-313.
Williams, J.W.J. (1964) "Algorithm 232". Communications ACM 7(6), 347348.
Wirth, N. (1971) "Program Development by Stepwise Refinement ". Communications ACM 14 (4), 221-227.
Wirth, N. (1974) "On The Composition of well-Structured Programs".ACM
Emputing Serveys 6 (4), 247-259.
Wirth, N. (1976) Algorithms + Data Structures = Programs. Prentice-Hall,
Englewood Cliffs, NJ.
Wirth, N. (1986) Algorithms and Data Structures. Prentice-Hall, Englewood
Cliffs, NJ.
Ziviani, N., Olivi, H. e Gonnet, G.H. (1985) "The Analysis of the Improved
Symmetric Binary B-Tree Algorithm". The Computer Journal 28 (4),
417-425.

260

REFERNCIAS BIBLIOGRFICAS

Ziviani, N. e Tompa, F.W. (1982) "A Look at Symmetric Binary B-Trees"


INFOR Canadian Journal of Operational Research and Information
Processing 20 (2), 65-81.

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

Sahni S., 10, 30


S B B , rvores, 118145
Schkolnick M., 185, 186, 188, 191
Schkolnik M., 192
Sedgewick R., 58, 70, 90, 91, 96,
98, 99, 119, 129, 144, 148
Seek time, vide Tempo de busca Segura,
pgina de uma rvore B*,
185, 191
Seleo
ordenao por, 7273, 89
por substituio, 9497 Selfadjusting, vide Auto-ajustve l
Semforo, 187
Semi-infinita, chave, 128, 152, 153
Sentinelas, 72, 7476, 110 Seqencial
indexado, 163168 Seqencial,
pesquisa, 6, 108110 Shell D.L., 76, 99
Shellsort, 7677, 89
Silberschatz A., 157
Sleator D.D., 144
Stanat D.F., 5, 30

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

Você também pode gostar