projetos de algoritmos em c e pascal - nivio ziviani

Upload: marimbeta

Post on 18-Oct-2015

169 views

Category:

Documents


23 download

TRANSCRIPT

  • 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, NivioProjeto 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 programaopara computadores) 3. Dados - Estruturas (Cincia dacomputao). 4. PASCAL (Linguagem de programaopara computadores) I. Titulo. II. Srie

    98-5286 CDD-005.1ndices para catlogo sistemtico:

    1. Algoritmos : Computadores : Programao : Processamentode dados 005.1

  • Projetode

    AlgoritmosCom Implementaes

    em Pascal e C

  • PIONEIRA INFORMTICA

    Coordenador:Routo Terada

    Conselho Diretor:Lv io G i o s a

    Ulf Gregor Baranow

  • Projetode

    AlgoritmosCom Implementaes

    em Pascal e C

    Nivio Ziviani, Ph.D.Professor Titular

    Universidade Federal de Minas GeraisDepartmento de Cincia d Computao

    44 Edio

  • Este livro foi composto, revisado. paginado pelo autor.

    A Pioneira, a partir dos fotolitos, imprimiu-o.

    Capa doRiccardo Fanucchi

    Nenhuma parte deste livro poder ser reproduzida sejamquais 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 porENIO MATHEUS GUAllELLI & CIA. LTDA.

    02515-050 Praa Dirceu de Lima, 313Telefone: (011) 858-3199 Fax: (011) 858-0443 So Paulo SP

    e-mail: [email protected]

    Impresso noBrasil Printed inBrazil

  • Prefcio

    Este livro apresenta uma introduo ao estudo de algoritmos computacionais.As principais tcnicas de projeto de algoritmos so ensinadas atravs daexplicao detalhada de algoritmos e estruturas de dados para o uso eficientedo computador. Estas explicaes so mantidas o mais simples possvel, massem perder a profundidade e o rigor matemtico.

    O contedo dirigido principalmente para ser utilizado como livro-textoem cursos sobre algoritmos e estruturas de dados. Pelo fato de apresentarmuitas implementaes de algoritmos prticos o texto igualmente til paraprofissionais engajados no desenvolvimento de sistemas de computao e deprogramas de aplicao. Os algoritmos so apresentados atravs de refina-mentos sucessivos at o nvel de uma implementao na linguagem Pascal, oque permite que qualquer pessoa com um mnimo de experincia em pro-gramao possa ler o cdigo.

    Contedo

    O livro apresenta as principais tcnicas utilizadas para a implementao deestruturas de dados bsicas e de algoritmos para ordenao e pesquisa emmemria primria e memria secundria. Os tpicos esto agrupados emcinco captulos, cada um com o seguinte contedo: (i) conceito de algoritmo,estrutura de dados e tipo abstrato de dados, tcnicas de anlise de desempe-nho de algoritmos, linguagem Pascal; (ii) estruturas de dados bsicas: listaslineares, pilhas e filas; (iii) mtodos de ordenao em memria primria: porinsero, por seleo, shellsort, quicksort e heapsort, e em memria se-cundria: intercalao balanceada; (iv) mtodos de pesquisa em memriaprimria: pesquisa seqencial, pesquisa binria, rvores de pesquisa e has-hing; (v) mtodos de pesquisa em memria secundria: seqencial indexadoe rvores B.

    O estudo do comportamento dos algoritmos tem um papel decisivo noprojeto de algoritmos eficientes. Por isso, so apresentadas informaes so-bre as caractersticas de desempenho de cada algoritmo apresentado. Entre-tanto, a parte matemtica utilizada para apresentar os resultados analticos

  • autocontida e exige muito pouco conhecimento matemtico prvio para serentendida.

    A linguagem de programao utilizada para apresentao do refinamentofinal dos algoritmos apresentados a linguagem Pascal. A vantagem de seusar a linguagem Pascal que os programas se tornam fceis de ser lidos e deser traduzidos para outras linguagens. Alm disso, todos os algoritmos im-plementados na linguagem Pascal so tambm implementados na linguagemC. Todo programa Pascal de um captulo tem um programa C correspon-dente no apndice.

    Ao Leitor

    O material apresentado adequado para ser utilizado como livro texto emcursos de graduao em Cincia da Computao e em cursos de extenso paraformao de Programadores na rea de Algoritmos e Estruturas de Dados. Erecomendvel que o estudante j tenha tido um curso de programao (ouexperincia equivalente) em uma linguagem de alto nvel, tal como Pascal ouC, assim como conhecimentos de utilizao de sistemas de computao.

    Verses anteriores deste livro foram utilizadas na Universidade Federalde Minas Gerais. A disciplina Algoritmos e Estruturas de Dados II do Cursode Bacharelado em Cincia da Computao, com carga horria de 60 horas eum 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 ra-dixsort; 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 se-cundria e um estudo mais elaborado de anlise de algoritmos fazem parteda disciplina Algoritmos e Estruturas de Dados III, do mesmo Curso.

    Ao final de cada captulo so includos exerccios. Alguns exerccios sodo tipo questes curtas, para testar os conhecimentos bsicos sobre o ma-terial apresentado. Outros exerccios so do tipo questes mais elaboradas,podendo exigir do leitor um trabalho de vrios dias, devendo ser realizado emcasa ou em laboratrio. Assim, os exerccios propostos devem ser utilizadosem testes e trabalhos prticos para avaliao da aprendizagem.

    Este texto pode tambm ser utilizado como manual para programadoresque j tenham familiaridade com o assunto, pois so apresentadas imple-mentaes de algoritmos de utilidade geral. Os algoritmos propostos socompletamente implementados nas linguagens Pascal e C e as operaes en-volvidas so descritas atravs da apresentao de exemplos de execuo.

  • Agradecimentos

    Uma verso inicial deste texto foi escrita para ser usada no Curso Estruturasde Dados e Algoritmos da I Escola Brasileiro-Argentina de Informtica emfevereiro de 1986, publicada pela Editora da Unicamp sob o ttulo Projeto deAlgoritmos e Estruturas de Dados. Gostaria de agradecer a Carlos Jos Pe-reira de Lucena e Routo Terada por lembrarem do meu nome para participarda I Escola Brasileiro-Argentina de Informtica, o que motivou o desenvol-vimento da semente deste texto. Gostaria de agradecer a Cilio Rosa Ziviani,Cleber Hostalcio de Melo, Jos Monteiro da Mata, Lilia Tavares Mascare-nhas, Luiz Carlos de Abreu Albuquerque, Regina Helena Bastos Cabral eRosngela Fernandes pelas contribuies para a primeira verso do texto.

    Muitos amigos e colegas me auxiliaram na. elaborao deste livro. Agra-deo a todos pela ajuda e pelas crticas construtivas. O Departamento deCincia da Computao da Universidade Federal de Minas Gerais tem pro-porcionado um excelente ambiente de trabalho. Os meus alunos de extenso,graduao, especializao e ps-graduao, especialmente os alunos das disci-plinas Tcnicas de Programao, Algoritmos e Estruturas de Dados e Projetoe Anlise de Algoritmos contriburam significativamente.

    Vrios erros foram corrigidos como conseqncia da leitura cuidadosade vrias pessoas, em especial Alberto Henrique Frade Laender, EduardoFernandes Barbosa, Jos Nagib Cotrim Arabe, Mrcio Luiz Bunte de Car-valho, Osvaldo Srgio Farhat de Carvalho, Roberto Mrcio Ferreira de Souzae Virglio Augusto Fernandes Almeida, aos quais gostaria de registrar meusagradecimentos. Gostaria de agradecer a Cristina Duarte Murta pela leituracrtica de todo o texto, pelos testes dos programas Pascal e pela execuo dosprogramas que permitiu o estudo comparativo dos algoritmos de ordenao.

    A verso C dos algoritmos existe graas ao trabalho paciente de traduodos programas Pascal conduzido -por Maurcio Antnio de Castro Limae Wagner Toledo Corra, realizado com o auxlio do programa p2c paratraduo automtica de programas em Pascal para programas em C, desen-volvido por Dave Gillespie, do California Institute of Technology, EUA. Olivro foi formatado com LATEX, um conjunto de macros para o TEX. Umagradecimento todo especial para Mrcio Luiz Bunte de Carvalho pelaimensa ajuda durante todo o trabalho de formatao, incluindo a criao deambientes especiais em LATEX para este texto, sendo que esta etapacontou tambm com a ajuda de Murilo Silva Monteiro.

    Nivio ZivianiBelo Horizonte

    Dezembro de 1992Endereo Internet: [email protected]

  • Sumrio

    Prefcio v

    Lista de Figuras xiii

    Lista de Tabelas xv

    Lista de Programas xvii

    1 Introduo 11.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 352.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 693.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 1074.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 1555.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

    D Programas C do Captulo 4 223

    E Programas C do Captulo 5 243

    F Caracteres ASCII 253

    G 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 . 843.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 .............................................. 963.15 Intercalao usando seleo por substituio .......................................97

    4.1 Exemplo de pesquisa binria para a chave G ......................................... 1114.2 rvore binria de pesquisa ..................................................................... 1134.3 Arvore binria de pesquisa completamente balanceada .........................1184.4 Uma rvore 2-3 e a rvore B binria correspondente ............................ 1194.5 Arvore SBB ............................................................................................ 1194.6 Transformaes propostas por Bayer (1972) ........................................1204.7 Crescimento de uma rvore SBB ........................................................... 1234.8 Decomposio de uma rvore SBB ........................................................1274.9 Trie binria ............................................................................................. 1294.10 Insero das chaves W e K ...................................................................1294.11 Arvore Patricia ......................................................................................1304.12 Insero da chave K ............................................................................. 1304.13 Insero da chave W .............................................................................1314.14 Lista encadeada em separado ............................................................... 1374.15 Open addressing ................................................................................1404.16 Arvore AVL ..........................................................................................1434.17 Transformaes propostas por Olivi (1980) .......................................1464.18 Pat array .............................................................................................. 154

    5.1 Mapeamento de endereos para paginao ............................................ 1595.2 Fila de Molduras_de_Pginas .................................................................1605.3 Endereamento no sistema de paginao ............................................... 1635.4 Estrutura de um arquivo seqencial indexado ........................................1645.5 Disco magntico ..................................................................................... 1655.6 Organizao de um arquivo indexado seqencial para o CD,

    ROM ................................................................................................... 1685.7 Arvore binria dividida em pginas ....................................................... 1695.8 Arvore B de ordem 2 com 3 nveis .........................................................1715.9 Nodo de uma rvore B de ordem m com 2m registros ........................... 1715.10 Insero em uma rvore B de ordem 2 .................................................1735.11 Crescimento de uma rvore B de ordem 2 ........................................... 1775.12 Retirada da chave 3 na rvore B de ordem m = 1 ................................ 1785.13 Decomposio de uma rvore B de ordem 2 ........................................1815.14 Estrutura de uma rvore B* ..................................................................1825.15 Exemplo de uma rvore B* .................................................................. 1845.16 Retirada de registros em rvores B* .................................................... 1855.17 Parte de uma rvore B* ........................................................................ 188

  • Lista de Tabelas

    1.1 Comparao dos algoritmos para obter o mximo e o mnimo.......... 101.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 hashinglinear 141....................................................................................................

    5.1 Nmero de acessos a disco, no pior caso, para tamanhos vari-ados de pginas e arquivos usando rvore B 190..................................

  • Lista de Programas

    1.1 Funo para obter o mximo de um conjunto 5.......................................1.2 Implementao direta para obter o mximo e o mnimo . 71.3 Implementao melhorada para obter o mximo e o mnimo 81.4 Outra implementao para obter o mximo e o mnimo 9.....................1.5 Programa para ordenar 20..........................................................................1.6 Algoritmo recursivo 21..............................................................................1.7 Verso recursiva para obter o mximo e o mnimo 23...........................1.8 Programa para copiar arquivo 29..............................................................

    2.1 Estrutura da lista usando arranjo 38.........................................................2.2 Operaes sobre listas usando posies contguas de memria 392.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 . 1625.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* ..........................................1835.11 Procedimento para pesquisar na rvore B* ................................... 183

    A.1 Funo para obter o maior elemento de um vetor ..........................197A.2 Implementao direta para obter o mximo e o mnimo ............... 197A.3 Implementao melhorada para obter o mximo e o mnimo ....... 198A.4 Outra implementao para obter o mximo e o mnimo ................199A.5 Programa para ordenar ...................................................................... 199A.6 Algoritmo recursivo ...........................................................................199A.7 Verso recursiva para obter o mximo e o mnimo ....................... 200A.8 Programa para copiar arquivo .......................................................... 201

    B.1 Estrutura da lista usando arranjo ......................................................203B.2 Operaes sobre listas usando posies contguas de memria... 204B.3 Estrutura da lista usando apontadores ... . .......................................205B.4 Operaes sobre listas usando apontadores .................................... 206B.5 Campos do registro de um candidato ...............................................206B.6 Primeiro refinamento do programa Vestibular ............................... 206B.7 Segundo refinamento do programa Vestibular ............................... 207B.8 Estrutura da lista ................................................................................ 208B.9 Refinamento final do programa Vestibular .....................................209B.10 Estrutura da pilha usando arranjo ....................................................209B.11 Operaes sobre pilhas usando arranjos .........................................210

    B.12 Estrutura da pilha usando apontadores ............................................ 210B.13 Operaes sobre pilhas usando apontadores .................................. 211B.14 Implementao do ET .......................................................................212B.15 Procedimento Imprime utilizado no programa ET ........................ 213B.16 Estrutura da fila usando arranjo ...................................................... 213B.17 Operaes sobre filas usando posies contguas de memria .... 214B.18 Estrutura da fila usando apontadores ..............................................214B.19 Operaes sobre filas usando apontadores .....................................215

    C;1 Estrutura de um item do arquivo ....................................................... 217C.2 Tipos utilizados na implementao dos algoritmos ....................... 217C.3 Ordenao por seleo .......................................................................217C.4 Ordenao por insero .....................................................................218C.5 Algoritmo Shellsort ........................................................................... 218C.6 Funo Partio ..................................................................................219C.7 Funo Quicksort ............................................................................... 219C.8 Funo para construir o heap ............................................................. 220C.9 Funo Heapsort ................................................................................ 221

    D.1 Estrutura do tipo dicionrio implementado como arranjo .............223

  • LISTA DE PROGRAMAS

    D.2 Implementao das operaes usando arranjo ................................ 224D.3 Pesquisa binria .................................................................................. 224D.4 Estrutura do dicionrio .......................................................................225D.5 Funo para pesquisar na rvore .......................................................225D.6 Funo para inserir na rvore ............................................................226D.7 Funo para inicializar .......................................................................226D.8 Programa para criar a rvore .............................................................226D.9 Funes para retirar x da rvore ....................................................... 227D.10 Caminhamento central ......................................................................227D.11 Estrutura do dicionrio para rvores SBB ..................................... 228D.12 Procedimentos auxiliares para rvores SBB ..................................229D.13 Procedimento para inserir na rvore SBB ......................................230D.14 Procedimento para inicializa a rvore SBB ................................... 231D.15 Procedimento para retirar da rvore SBB ...................................... 234D.16 Estrutura de dados ............................................................................ 234D.17 Funes auxiliares ............................................................................ 235D,18 Funo CrieNodos ............................................................................ 235D.19 Algoritmo de pesquisa ......................................................................236D.20 Inicializao da rvore ..................................................................... 236D.21 Algoritmo de insero ...................................................................... 237D.22 Implementao de funo de transformao ..................................238D.23 Estrutura do dicionrio para listas encadeadas ..............................238D.24 Operaes do dicionrio usando listas encadeadas .......................239D.25 Estrutura do dicionrio usando open addressing .........................240D.26 Operaes do dicionrio usando open addressing .......................241

    E.1 Estrutura de dados para o sistema de paginao ............................. 243E.2 Diferentes tipos de pginas para o sistema de paginao ...............243E.3 Estrutura do dicionrio para rvore B .............................................. 244E.4 Funo para inicializar uma vore B ................................................ 244E.5 Funo para pesquisar na vore B .....................................................245E.6 Primeiro refinamento do algoritmo Insere na rvore B .................. 246E.7 Funo Insere Na Pgina ....................................................................246E.8 Refinamento final do algoritmo Insere .............................................248E.9 Funo Retira ...................................................................................... 250E.10 Estrutura do dicionrio para rvore B* ...........................................251E.11 Funo para pesquisar na rvore B* ............................................... 252

  • Captulo 1

    Introduo

    1.1 Algoritmos, Estruturas de Dados e ProgramasOs algoritmos fazem parte do dia-a-dia das pessoas. As instrues para o usode medicamentos, as indicaes de como montar um aparelho qualquer, umareceita de culinria so alguns exemplos de algoritmos. Um algoritmo podeser visto como uma seqncia de aes executveis para a obteno de umasoluo para um determinado tipo de problema. Segundo Dijkstra (1971) umalgoritmo corresponde a uma descrio de um padro de comportamento,expresso em termos de um conjunto finito de aes. Ao executarmos aoperao a + b percebemos um mesmo padro de comportamento, mesmoque a operao seja realizada para valores diferentes de a e b.

    Estruturas de dados e algoritmos esto intimamente ligados. No sepode estudar estruturas de dados sem considerar os algoritmos associados aelas, assim como a escolha dos algoritmos em geral depende da repre-sentao e da estrutura dos dados. Para resolver um problema necessrioescolher uma abstrao da realidade, em geral atravs da definio de umconjunto de dados que representa a situao real. A seguir deve ser escolhidaa forma de representar estes dados.

    A escolha da representao dos dados determinada, entre outras, pelasoperaes a serem realizadas sobre os dados. Considere a operao de adio.Para pequenos nmeros uma boa representao atravs de barrasverticais, caso em que a operao de adio bastante simples. J arepresentao atravs de dgitos decimais requer regras relativamente com-plicadas, as quais devem ser memorizadas. Entretanto, a situao se invertequando consideramos a adio de grandes nmeros, sendo mais fcil a repre-sentao por dgitos decimais por causa do princpio baseado no peso relativoda posio de cada dgito.

    1

  • 2 C A P T U L O 1 . I N T R O D U O

    Programar basicamente estruturar dados e construir algoritmos. Deacordo com Wirth (1976, p.XII), programas so formulaes concretas dealgoritmos abstratos, baseados em representaes e estruturas especficas dedados. Em outras palavras, programas representam uma classe especial dealgoritmos capazes de serem seguidos por computadores.

    Entretanto, um computador s capaz de seguir programas em lingua-gem de mquina, que correspondem a uma seqncia de instrues obscurase desconfortveis. Para contornar tal problema necessrio construir lingua-gens mais adequadas para facilitar a tarefa de programar um computador.Segundo Dijkstra (1976), uma linguagem de programao uma tcnica denotao para programar, com a inteno de servir de veculo tanto para aexpresso do raciocnio algortmico quanto para a execuo automtica deum algoritmo por um computador.

    1.2 Tipos de Dados e Tipos Abstratos de DadosEm linguagens de programao importante classificar constantes, variveis,expresses e funes de acordo com certas caractersticas, as quais indicam oseu tipo de dados. Este tipo deve caracterizar o conjunto de valores a queuma constante pertence, ou que podem ser assumidos por uma varivel ouexpresso, ou que podem ser gerados por uma funo (Wirth, 1976, pp.440).

    Tipos simples de dados so grupos de valores indivisveis, como os tiposbsicos integer, boolean, char, e real do Pascal. Por exemplo, uma variveldo tipo boolean pode assumir ou o valor verdadeiro ou o valor falso, e nenhumoutro valor. Os tipos estruturados em geral definem uma coleo de valoressimples, ou um agregado de valores de tipos diferentes. A linguagem Pascaloferece uma grande variedade de tipos de dados, como ser mostrado naSeo 1.5.

    Um tipo abstrato de dados pode ser visto como um modelo ma-temtico, acompanhado das operaes definidas sobre o modelo. 0 conjuntodos inteiros acompanhado das operaes de adio, subtrao e multiplicaoforma um exemplo de um tipo abstrato de dados. Aho, Hoperoft e Ullman (1983), utilizam extensivamente tipos abstratos de dados como base para oprojeto de algoritmos. Nestes casos a implementao do algoritmo em umalinguagem de programao especfica exige que se encontre alguma formade representar o tipo abstrato de dados, em termos dos tipos de dados e dosoperadores suportados pela linguagem considerada. A representao domodelo matemtico por trs do tipo abstrato de dados realizada atravs deuma estrutura de dados.

    Tipos abstratos de dados podem ser considerados generalizaes de tiposprimitivos de dados, da mesma forma que procedimentos so generalizaesde operaes. primitivas tais como adio, subtrao e multiplicao. Da

  • 1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 3

    mesma forma que um procedimento usado para encapsular partes de umalgoritmo, o tipo abstrato de dados pode ser usado para encapsular tipos dedados. Neste caso a definio do tipo e todas as operaes definidas sabreele podem ser localizadas em uma nica seo do programa.

    Como exemplo, considere uma aplicao que utilize uma lista de intei-ros. Poderamos definir um tipo abstrato de dados Lista, com as seguintesoperaes sobre a lista:

    1. faa a lista vazia,

    2. obtenha o primeiro elemento da lista. Se a lista estiver vazia entoretorne nulo,

    3. insira um elemento na lista.

    Existem vrias opes de estruturas de dados que permitem uma im-plementao eficiente para listas. Uma possvel implementao para o tipoabstrato de dados Lista atravs do tipo estruturado arranjo. A seguir cadaoperao do tipo abstrato de dados implementada como um procedimentona linguagem de programao escolhida. Se existe necessidade de alterar aimplementao do tipo abstrato de dados, a alterao fica restrita parteencapsulada, sem causar impactos em outras partes do cdigo..

    Cabe ressaltar que cada conjunto diferente de operaes define um tipoabstrato de dados diferente, mesmo que todos os conjuntos de operaesatuem sobre um mesmo modelo matemtico. Uma razo forte para isto quea escolha adequada de uma implementao depende fortemente dasoperaes a serem realizadas sobre o modelo.

    1.3 Medida do Tempo de Execuo de um Pro-grama

    0 projeto de algoritmos fortemente influenciado pelo estudo de seus com-portamentos. Depois que um problema analisado e decises de projeto sofinalizadas, o algoritmo tem que ser implementado em um computador.Neste momento o projetista tem que estudar as vrias opes de algoritmosa serem utilizados, onde os aspectos de tempo de execuo e espaoocupado so consideraes importantes. Muitos destes algoritmos so en-contrados em reas tais como pesquisa operacional, otimizao, teoria dosgrafos, estatstica, probabilidades, entre outras.

    Na rea de anlise de algoritmos, existem dois tipos de problemas bemdistintos, conforme apontou Knuth (1971):(i) Anlise de um algoritmo particular. Qual o custo de usar um dadoalgoritmo para resolver um problema especfico? Neste caso, caractersticas

  • 4 CAPTULO 4. INTRODUO

    importantes do algoritmo em questo devem ser investigadas, geralmenteuma anlise do nmero de vezes que cada parte do algoritmo deve ser exe-cutada, seguida do estudo da quantidade de memria necessria.(ii) Anlise de uma classe de algoritmos. Qual o algoritmo de menorcusto possvel para resolver um problema particular? Neste caso, toda umafamlia de algoritmos para resolver um problema especfico investigada como objetivo de identificar um que seja o melhor possvel. Isto significa colocarlimites para a complexidade computacional dos algoritmos pertencentes classe. Por exemplo, possvel estimar o nmero mnimo de comparaesnecessrias para ordenar n nmeros atravs de comparaes sucessivas, con-forme veremos mais adiante no Captulo 3.

    Quando conseguimos determinar o menor custo possvel para resolverproblemas de uma determinada classe, como no caso de ordenao, temos amedida da dificuldade inerente para resolver tais problemas. Ainda mais,quando o custo de um algoritmo igual ao menor custo possvel, ento pode-mos concluir que o algoritmo timo para a medida de custo considerada.

    Em muitas situaes podem existir vrios algoritmos para resolver omesmo problema, sendo pois necessrio escolher aquele que o melhor. Seuma mesma medida de custo aplicada a diferentes algoritmos ento possvel compar-los e escolher o mais adequado para resolver o problema emquesto.

    O custo de utilizao de um algoritmo pode ser medido de vrias manei-ras. Uma delas atravs da execuo do programa em um computador real,sendo o tempo de execuo medido diretamente. As medidas de tempo obti-das desta forma so bastante inadequadas e os resultados jamais devem sergeneralizados. As principais objees so: (i) os resultados so dependentesdo compilador que pode favorecer algumas construes em detrimento deoutras; (ii) os resultados dependem do hardware; (iii) quando grandes quan-tidades de memria so utilizadas, as medidas de tempo podem dependerdeste aspecto. Apesar disso, Gonnet e Baeza-Yates (1991, p.7) apresentamargumentos a favor de se obter medidas reais de tempo para algumas si-tuaes particulares como, por exemplo, quando existem vrios algoritmosdistintos para resolver um mesmo tipo de problema, todos com um custo deexecuo dentro de uma mesma ordem de grandeza. Assim os custos reaisdas operaes so todos considerados, assim como os custos no aparentestais como alocao de memria, indexao, carga, etc.

    Uma forma mais adequada de se medir o custo de utilizao de um algo-ritmo atravs do uso de um modelo matemtico, baseado em um computa-dor 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 usualainda ignorar o custo de algumas das operaes envolvidas e considerarapenas as operaes mais significativas. Por exemplo, para algoritmos de

  • 1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 5

  • 6 CAPTULO 1 . INTRODUO

    A medida do custo de execuo de um algoritmo depende principalmentedo tamanho da entrada dos dados. Por isso comum considerar-se o tempode execuo de um programa como uma funo do tamanho da entrada.Entretanto, para alguns algoritmos, o custo de execuo uma funo daentrada particular dos dados, no apenas do tamanho da entrada. No caso dafuno Max do Programa 1.1 o algoritmo possui a propriedade de que ocusto uniforme sobre todos os problemas de tamanho n. J para umalgoritmo de ordenao isto no ocorre: se os dados de entrada j estiveremquase ordenados ento o algoritmo pode ter que trabalhar menos.

    Temos ento que distinguir trs cenrios: melhor caso, pior caso e casomdio. 0 melhor caso corresponde ao menor tempo de execuo sobre todasas possveis entradas de tamanho n. 0 pior caso corresponde ao maiortempo de execuo sobre todas as entradas de tamanho n . Se f uma funode complexidade baseada na anlise de pior caso ento o custo de aplicar oalgoritmo nunca. maior do que (n).

    0 caso mdio (ou caso esperado) corresponde mdia dos tempos deexecuo de todas as entradas de tamanho n. Na anlise do caso esperado,uma distribuio de probabilidades sobre o conjunto de entradas detamanho n suposta, e o custo mdio obtido com base nesta distribuio.Por esta razo, a anlise do caso mdio geralmente muito mais difcilde obter do que as anlises do melhor e do pior caso. comum supor umadistribuio de probabilidades em que todas as entradas possveis soigualmente provveis. Entretanto, na prtica isto nem sempre verdade. Porisso a anlise do caso esperado dos algoritmos a serem estudados s serapresentada quando esta fizer sentido.

    Para ilustrar estes conceitos considere o problema de acessar os registrosde um arquivo. Cada registro contm uma chave nica que utilizada pararecuperar registros do arquivo. Dada uma chave qualquer o problemaconsiste em localizar o registro que contenha esta chave. 0 algoritmo depesquisa mais simples que existe o que faz uma pesquisa seqencial.

    Este algoritmo examina os registros na ordem em que eles aparecem noarquivo, at que o registro procurado seja encontrado ou fique determinadoque o mesmo no se encontra no arquivo.

    Seja f uma funo de complexidade tal que (n) o nmero de registrosconsultados 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) = 1pior caso : (n) = ncaso mdio :(n) = (n + 1)/2

    0 melhor caso ocorre quando o registro procurado o primeiro consul-tado. 0 pior caso ocorre quando o registro procurado o ltimo consultado,

  • 1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 7

  • 8 C A P T U L O 1 . I N T R O D U O

  • 1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 9

  • 1 0 C A P T U L O 1 . I N T R O D U O

    A Tabela 1.1 apresenta uma comparao entre os algoritmos dos Pro-gramas 1.2, 1.3 e 1.4,. considerando o nmero de comparaes como medida decomplexidade. Os algoritmos MaxMin2 e MaxMin3 so superiores aoalgoritmo MaxMinl de forma geral. O algoritmo MaxMin3 superior aoalgoritmo MaxMin2 com relao ao pior caso e bastante prximo quanto aocaso mdio.

    Os TrsAlgoritmos

    f (n)Melhor caso Pior caso Caso mdio

    MaxMin1 2(n-1) 2(n-1) 2(n-1)MaxMin2 n 1 2(n-1) 3n/2-3/2MaxMin3 3n/2-2 3n/2-2 3n/2-2

    Tabela 1.1: Comparao dos algoritmos para obter o mximo e o mnimo

    Considerando novamente o nmero de comparaes realizadas, existepossibilidade de obter um algoritmo mais eficiente para este problema? Pararesponder a esta questo necessrio conhecer o limite inferior para a classede algoritmos para obter o maior e o menor elemento de um conjunto.

    Uma tcnica muito utilizada para obter o limite inferior para uma classequalquer de algoritmos atravs da utilizao de um orculo.2 Dado um mo-delo de computao que expresse o comportamento do algoritmo o orculoinforma o resultado de cada passo possvel, que no nosso caso seria o resultadode cada comparao. Para derivar o limite inferior o orculo procura semprefazer com que o algoritmo trabalhe o mximo, escolhendo como resultado daprxima 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), uti-liza um orculo para derivar o limite inferior no nmero de comparaesnecessrias para obter o mximo e o mnimo de um conjunto com n elementos.Teorema: Qualquer algoritmo para encontrar o maior elemento e o menorelemento de um conjunto com n elementos no ordenados, n 1, faz pelomenos [3n/2] 2 comparaes.Prova: A tcnica utilizada define um orculo que descreve o comportamentodo algoritmo atravs de um conjunto de ntuplas, mais um conjunto de regrasassociadas que mostram as tuplas possveis (estados) que um algoritmo podeassumir 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 oconsultava. 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, repre-sentada por (a, b, c, d), onde a representa o nmero de elementos que nuncaforam comparados; b representa o nmero de elementos que foram vencedorese nunca perderam em comparaes realizadas; c representa o nmero de ele-mentos que foram perdedores e nunca venceram em comparaes realizadas; drepresenta o nmero de elementos que foram vencedores e perdedores emcomparaes realizadas. O algoritmo inicia no estado (n, 0, 0, 0) e terminacom (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 FunesComo j foi observado anteriormente, o custo para obter uma soluo paraum dado problema aumenta cem o tamanho n do problema. O nmero decomparaes para encontrar o maior elemento de um conjunto de n inteiros,ou para ordenar os elementos de um conjunto com n elementos, aumentacom 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 problemacresce quando n cresce.

    Para valores suficientemente pequenos de n, qualquer algoritmo custapouco para ser executado, mesmo os algoritmos ineficientes. Em outras pa-lavras, a escolha do algoritmo no um problema crtico para problemas detamanho pequeno. Logo, a anlise de algoritmos realizada para valoresgrandes de n. Para tal considera-se o comportamento de suas funes decusto para valores grandes de n, isto , estuda-se o comportamento as-sinttico 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 operaeselementares e, em muitos casos, apenas uma operao elementar. A medidade custo ou medida de complexidade relata o crescimento assinttico daoperao considerada. A definio seguinte relaciona o comportamentoassinttico 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 doalgoritmo F . Igualmente, se g uma funo para um algoritmo G, ento 0 (g ) considerada a complexidade assinttica do algoritmo G. A relao dedominao assinttica permite comparar funes de complexidade. En-tretanto, se as funes f e g dominam assintoticamente uma a outra entoos algoritmos associados so equivalentes. Nestes casos, o comportamentoassinttico no serve para comparar os algoritmos. Por exemplo, dois al-goritmos F e G aplicados mesma classe de problemas, sendo que F levatrs vezes o tempo de G ao serem executados, isto (n ) = 3 g ( n ) , sendoque 0 ( f ( n ) ) = 0 ( g ( n ) ) . Logo o comportamento assinttico no servepara comparar os algoritmos F e G porque eles diferem apenas por umaconstante.

    Programas podem ser avaliados atravs da comparao de suas funesde complexidade, negligenciando as constantes de proporcionalidade. Umprograma com tempo de execuo 0 ( n ) melhor que um programa comtempo de execuo 0 ( n 2) . Entretanto, as constantes de proporcionalidadeem cada caso podem alterar esta considerao. Por exemplo, possvel queum programa leve 100n unidades de tempo para ser executado enquanto umoutro leve 2 n 2 unidades de tempo. Qual dos dois programas melhor?

    A resposta a esta pergunta depende do tamanho do problema a ser exe-cutado. Para problemas de tamanho n < 50, o programa com tempo deexecuo 2 n 2 melhor do que o programa com tempo de execuo 100n.Para problemas com entrada de dados pequena prefervel usar o programacujo tempo de execuo 0 ( n 2) . Entretanto, quando n cresce, o programacom 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 deexecuo de forma mais significativa, usualmente o nmero de itens a serprocessado. Este parmetro pode ser o nmero de registros de um arquivo aser ordenado, ou o nmero de ns de um grafo. As principais classes deproblemas possuem as funes de complexidade descritas abaixo.

    1 . f (n) = 0(1). Algoritmos de complexidade 0(1) so ditos de comple-xidade constante. O uso do algoritmo independe do tamanho de n.Neste caso as instrues do algoritmo so executadas um nmero fixode vezes.

    2 . (n ) = O(log n). Um algoritmo de complexidade O( logn) dito tercomplexidade logartmica. Este tempo de execuo ocorre tipica-mente em algoritmos que resolvem um problema transformando-o emproblemas menores. Nestes casos, o tempo de execuo pode ser con-siderado 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 den. A base do logaritmo muda pouco estes valores: quando n ummilho, o log2n 20 e o log10n 6.

    3. f (n) = 0(n). Um algoritmo de complexidade 0(n) dito ter com-plexidade linear. Em geral um pequeno trabalho realizado sobrecada elemento de entrada. Esta a melhor situao possvel para umalgoritmo que tem que processar n elementos de entrada ou produzir nelementos de sada. Cada vez que n dobra de tamanho o tempo deexecuo dobra.

    4 . f ( n ) = O ( n log n ) . Este tempo de execuo ocorre tipicamenteem algoritmos que resolvem um problema quebrando-o em problemasmenores, resolvendo cada um deles independentemente e depoisajuntando 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 com-plexidade quadrtica. Algoritmos desta ordem de complexidadeocorrem quando os itens de dados so processados aos pares, muitasvezes em um anel dentro de outro. Quando n mil, o nmero deoperaes da ordem de 1 milho. Sempre que n dobra o tempo deexecuo multiplicado por 4. Algoritmos deste tipo so teis pararesolver problemas de tamanhos relativamente pequenos.

    6 . f (n) = 0(n3). Um algoritmo de complexidade 0(n3) dito ter com-plexidade cbica. Algoritmos desta ordem de complexidade so teis

  • 16 CAPITULO 1. INTRODUO

    apenas para resolver pequenos problemas. Quando n cem, o nmero deoperaes da ordem de 1 milho. Sempre que n dobra o tempo de execuofica multiplicado por 8.

    7. (n) = 0(2n). Um algoritmo de complexidade 0(2n) dito ter complexidadeexponencial. Algoritmos desta ordem de complexidade geralmente no soteis sob o ponto de vista prtico. Eles ocorrem na soluo de problemasquando se usa fora bruta para resolv-los. Quando n vinte, o tempo deexecuo cerca de um milho. Quando n dobra, o tempo de execuo ficaelevado ao quadrado.

    Para ilustrar melhor a diferena entre as classes de comportamento assintticoGarey e Johnson (1979, p.7) apresentam o quadro mostrado na Ta-bela 1.2. Estequadro mostra a razo de crescimento de vrias funes de complexidade paratamanhos diferentes de n, onde cada funo expressa o tempo de execuo emmicrosegundos. Um algoritmo linear executa em um segundo um milho deoperaes.

    Tabela 1.2: Comparao de virias funes de complexidade

    Um outro aspecto interessante o efeito causado pelo aumento da velocidadedos computadores sobre os algoritmos com as funes de complexidade citadasacima. A Tabela 1.3 mostra como um aumento de 100 ou de 1000 vezes navelocidade de computao de um computador atual influi na soluo do maiorproblema possvel de ser resolvido em uma hora. Note que um aumento de 1000vezes na velocidade de computao resolve um problema dez vezes maior para umalgoritmo de complexidade 0(n3), enquanto um algoritmo de complexidade 0(2n)apenas adiciona dez ao tamanho do maior problema possvel de ser resolvido emuma hora.

  • 1.3. MEDIDA DO TEMPO DE EXECUO DE UM PROGRAMA 17

    Funo decusto dede tempo

    Computadoratual

    Computador100 vezes

    mais rpido

    Computador1000 vezesmais rpido

    n tl 100t1 1000t1n2 t2 10t2 31, 6t2n3 t3 4,6t3 10t32n t4 t4+ 6 , 6 t 4 + 1 0

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

    Um algoritmo cuja funo de complexidade O(cn), c > 1, chamado dealgoritmo exponencial no tempo de execuo. Um algoritmo cuja funo decomplexidade O(p(n)), onde p(n) um polinmio, chamado de algoritmopolinomial no tempo de execuo. A distino entre estes dois tipos dealgoritmos torna-se significativa quando o tamanho do problema a serresolvido cresce, conforme ilustra a Tabela 1.2. Esta a razo por quealgoritmos polinomiais so muito mais teis na prtica do que algoritmosexponenciais.

    Os algoritmos exponenciais so geralmente simples variaes de pesquisaexaustiva, enquanto algoritmos polinomiais so geralmente obtidos atravs deum entendimento mais profundo da estrutura do problema. Um problema considerado intratvel se ele to difcil que no existe um algoritmo poli-nomial para resolv-lo, enquanto um problema considerado bem resolvidoquando existe um algoritmo polinomial para resolv-lo.

    Entretanto, a distino entre algoritmos polinomiais eficientes e algo-ritmos exponenciais ineficientes possui vrias excees. Por exemplo, umalgoritmo com funo de complexidade n) = 2n mais rpido que umalgoritmo g(n) = n5 para valores de n menores ou iguais a 20. Da mesmaforma, existem algoritmos exponenciais que so muito teis na prtica. Porexemplo, o algoritmo Simplex para programao linear possui complexidadede tempo exponencial para o pior caso (Garey e Johnson, 1979), mas executamuito rpido na prtica.

    Infelizmente, exemplos como o do algoritmo Simplex no ocorrem comfreqncia na prtica, e muitos algoritmos exponenciais conhecidos no somuito teis. Considere, como exemplo, o seguinte problema: um caixeiroviajante deseja visitar n cidades de tal forma que sua viagem inicie e ter-mineem uma mesma cidade, e cada cidade deve ser visitada uma nica vez.Supondo que sempre exista uma estrada entre duas cidades quaisquer, oproblema encontrar a menor rota que o caixeiro viajante possa utilizar nasua 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-

  • 1 8 C A PT U LO 1 . IN TR O D U O

    curso < c1, c3, c4, c2, c1 > uma soluo para o problema, cujo percurso totaltem distncia 24.

    Um algoritmo simples para o problema acima seria verificar todas asrotas e escolher a menor delas. Como existem ( n 1)! rotas possveis e adistncia total percorrida em cada rota envolve n adies, ento o nmerototal 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 deexecutar 109 adies por segundo, o tempo total para resolver o problemacom 50 cidades seria maior do que 1045 sculos somente para executar asadies.

    Figura 1.4: Problema do caixeiro viajante

    1.4 Tcnicas de Anlise de AlgoritmosA determinao do tempo de execuo de um programa qualquer pode setornar um problema matemtico complexo quando se deseja determinar ovalor exato da funo de complexidade. Entretanto, a determinao da or-dem do tempo de execuo de um programa, sem haver preocupao com ovalor da constante envolvida, pode ser uma tarefa mais simples. E mais fcildeterminar que o nmero esperado de comparaes para recuperar umregistro de um arquivo utilizando pesquisa seqencial 0 (n ) do que efetiva-mente determinar que este nmero ( n + 1)/2, quando cada registro tem amesma probabilidade de ser procurado.

    A anlise de algoritmos ou programas utiliza tcnicas de matemticadiscreta, envolvendo contagem ou enumerao dos elementos de um con-junto que possuam uma propriedade comum. Estas tcnicas envolvem amanipulao de somas, produtos, permutaes, fatoriais, coeficientes bino-miais, soluo de equaes de recorrncia, entre outras. Algumas destastcnicas sero ilustradas informalmente atravs de exemplos.

  • 1.4. TCNICAS DE ANLISE DE ALGORITMOS 19

    Infelizmente no existe um conjunto completo de regras para analisarprogramas. Aho, Hoperoft e Ullman (1983) enumeram alguns princpios aserem seguidos. Muitos destes princpios utilizam as propriedades sobre anotao O apresentadas na Figura 1.3. So eles:

    1. 0 tempo de execuo de um comando de atribuio, de leitura ou deescrita pode ser considerado como 0(1). Existem excees para aslinguagens que permitem a chamada de funes em comandos deatribuio, ou quando atribuies envolvem vetores de tamanho arbi-trariamente grandes.

    2. 0 tempo de execuo de uma seqncia de comandos determinadopelo maior tempo de execuo de qualquer comando da seqncia.

    3. 0 tempo de execuo de um comando de deciso composto pelotempo de execuo dos comandos executados dentro do comando con-dicional, mais o tempo para avaliar a condio, que 0(1).

    4. 0 tempo para executar um anel a soma do tempo de execuo docorpo do anel mais o tempo de avaliar a condio para terminao,multiplicado pelo nmero de iteraes do anel. Geralmente o tempopara avaliar a condio para terminao 0(1).

    5. Quando o programa possui procedimentos no recursivos, o tempo deexecuo de cada procedimento deve ser computado separadamente uma um, iniciando com os procedimentos que no chamam outros proce-dimentos. A seguir devem ser avaliados os procedimentos que chamamos procedimentos que no chamam outros procedimentos, utilizandoos tempos dos procedimentos j avaliados. Este processo repetidoat chegar no programa principal.

    6. Quando o programa possui procedimentos recursivos, para cadaprocedimento associada uma funo de complexidade f (n) desconhe-cida, 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, va-mos apresentar alguns programas e, para cada um deles, mostrar com deta-lhes os passos envolvidos em sua anlise.Exemplo: Considere o algoritmo para ordenar os n elementos de um con-junto A, cujo princpio o seguinte:

    1. Selecione o menor elemento do conjunto

    2. Troque este elemento com o primeiro elemento A[1].

  • CAPTULO 1. INTRODUO20

  • 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 2 1

  • 22 CAPITULO 1. INTRODUO

  • 1.4. TCNICAS DE ANLISE DE ALGORITMOS 23

  • 24 CAPTULO 1. INTRODUO

  • 1 .5 . PASCAL 25

    1.5 PascalOs programas apresentados neste livro usam apenas as caractersticas bsicasdo Pascal, de acordo com a definio apresentada por Jensen e Wirth (1974).Sempre que possvel so evitadas as facilidades mais avanadas disponveisem algumas implementaes do Pascal.

    0 objetivo desta seo no apresentar a linguagem Pascal na sua to-talidade, mas apenas examinar algumas de suas caractersticas, facilitandoassim a leitura deste livro para as pessoas pouco familiarizadas com a lingua-gem. Uma descrio clara e- concisa da linguagem apresentada porCooper (1983). Um bom texto introdutrio sobre a linguagem apresentado por Clancy e Cooper (1982).

    As vrias partes componentes de um programa Pascal podem ser vistasna Figura 1.5. Um programa Pascal comea com um cabealho que d nomeao programa. Rtulos, constantes, tipos, variveis, procedimentos, e funesso declaradas sempre na ordem indicada pela Figura 1.5. A parte ativa doprograma descrita como uma seqncia de comandos, os quais incluemchamadas de procedimentos e funes.

    programlabelconsttypevarprocedure ou functionbegin.

    .

    .

    end

    cabealho do programadeclarao de rtulo para gotodefinio de constantesdefinio de tipos de dadosdeclarao de variveisdeclarao de subprogramas

    comandos do programa

    Figura 1.5: Estrutura de um programa Pascal

    A regra geral para a linguagem Pascal tornar explcito o tipo associadoquando se declara uma constante, varivel ou funo, o que. permite testesde consistncia durante o tempo de compilao. A definio de tipos permiteao programador alterar o nome de tipos existentes, como tambm criar umnmero ilimitado de outros tipos. No caso do Pascal os tipos podem sercolocados em trs categorias: simples, estruturados, e apontadores.

    Tipos simples so grupos de valores indivisveis, estando dentro destacategoria os tipos bsicos integer, boolean, char, e real. Tipos simples adi-cionais podem ser enumerados atravs de uma listagem de novos grupos de

  • 26 CAPTULO 1. INTRODUO

    valores, ou atravs da indicao de subintervalos que restringem tipos a umasubseqncia dos valores de um outro tipo simples previamente definido.Exemplos de tipos enumerados

    type cor = (vermelho, azul, rosa);type sexo = (mas, fern);type boolean = (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 = 1900..1999; type letra = 'A'..'Z';

    Dadas as variveis

    vara :ano; var b :letra;

  • 1.5. PASCAL 27

    onde a constante n deve ser previamente declarada

    const n = 20;

    Dada a varivel

    var x : coluna;

    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 = recorddia : 1..31;ms : 1..12;

    end;type pessoa = record

    sobrenome :alfa;primeironome :alfa;aniversrio :data;sexo : (mas, ferm);

    end;Declarada a varivel

    var p: pessoa;

    valores particulares podem ser atribuidos como se segue

    p.sobrenome := 'Ziviani';p.primeironome := 'Patricia';p.aniversrio.dia := 21;p.aniversrio.ms := 10;p.sexo := fern;

    A Figura 1.6 ilustra este exemplo.Um tipo estruturado conjunto define a coleo de todos os subconjuntos

    de algum tipo simples, com operadores especiais * (interseo), + (unio), (diferena) e in (pertence a) definidos para todos os tipos conjuntos.Exemplos:

    type conjint = set of 1..9;type conjcor = set of cor;type conjchar = set of char;

  • 28 CAPTULO 1. INTRODUO

  • 1 .5 . PASCAL 29

    Programa 1.8: Programa para copiar arquivo

    O Programa 1.8 copia o contedo arquivo Velho no arquivo Novo. Ob-serve que os nomes dos arquivos aparecem como parmetros do programa. Eimportante observar que a atribuio de nomes de arquivos externos, aoprograma varia de compilador para compilador. Por exempla, no caso doTurbo Pascal3 a atribuio do nome externo de um arquivo a uma varivelinterna ao programa realizada atravs do comando assign e no comoparmetros do programa.

    Os tipos apontadores so teis para criar estruturas de dados encadea-das, do tipo listas, rvores, e grafos. Um apontador uma varivel que re-ferencia uma outra varivel alocada dinamicamente. Em geral a varivelreferenciada definida como um registro que inclui tambm um apontadorpara outro elemento do mesmo tipo.

    Exemplo:

    type Apontador = ^Nodo;type Nodo = record

    Chave : integerApont : Apontador;

    end;

    Dada uma varivel3Turbo 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 BibliogrficasEstudos bsicos sobre os conceitos de algoritmos, estruturas de dados e pro-gramas podem ser encontrados em Dahl, Dijkstra e Hoare (1972), Dijkstra (1971), Dijkstra (1976), Hoare (1969), Wirth (1971), Wirth (1974), Wirth (1976). Mais recentemente Manber (1988) e Manber (1989) tratam dautilizao de induo matemtica para o projeto de algoritmos.

    A anlise assinttica de algoritmos hoje a principal medida de eficinciapara algoritmos. Existem muitos livros que apresentam tcnicas para analisaralgoritmos, tais como somatrios, equaes de recorrncia, rvores dedeciso, orculos, dentre outras. Knuth (1968), Knuth (1973), Knuth (1981),Graham, Knuth e Patashnik (1989), Aho, Hoperoft e Ullman (1974), Stanate McAllister (1977), Cormem, Leiserson e Rivest (1990), Manber (1989), Ho-rowitz e Sahni (1978), Greene e Knuth (1982), so alguns exemplos. Artigosgerais sobre o tpico incluem Knuth (1971), Knuth (1976), Weide (1977),Lueker (1980), Flajolet e Vitter (1987). Tarjan (1985) apresenta custoamortizado: se certa parte de um algoritmo executada muitas vezes, cadavez com um tempo de execuo diferente, ao invs de considerar o pior casoem cada execuo, os diferentes custos so amortizados.

    Existe uma enorme quantidade de livros sobre a linguagem Pascal. OPascal padro foi definido originalmente em Jensen e Wirth (1974). O livrode Cooper (1983) apresenta uma descrio precisa e ao mesmo tempodidtica 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 elementode um conjunto. Apresente tambm uma anlise do algoritmo. Vocacha o seu algoritmo eficiente? Por qu? Procure comprovar suasrespostas.

    13) So dados 2n nmeros distintos distribuidos em dois arranjos com nelementos A e B ordenados de maneira tal que (Carvalho, 1992):

    A[1] > A[2] > A[3] > > A[n] eB[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 ne-cessrias para resolver este problema.

    b) Apresente um algoritmo cuja complexidade no pior caso seja iqualao valor obtido na letra a), ou seja, um algoritmo timo.

  • Captulo 2

    Estruturas de Dados Bsicas

    2.1 Listas LinearesUma das formas mais simples de interligar os elementos de um conjunto atravs de uma lista. Lista uma estrutura onde as operaes inserir, retirare localizar so definidas. Listas so estruturas muito flexveis porque podemcrescer ou diminuir de tamanho durante a execuo de um programa, deacordo com a demanda. Itens podem ser acessados, inseridos ou retirados deuma 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 de-manda por memria, permitindo a manipulao de quantidades imprevisveisde dados, de formato tambm imprevisvel. Listas so teis em aplicaestais como manipulao simblica, gerncia de memria, simulao e compi-ladores. Na manipulao simblica os termos de uma frmula podem crescersem limites. Em simulao dirigida por relgio pode ser criado um nmeroimprevisvel de processos, os quais tm que ser escalonados para execuode acordo com alguma ordem predefinida.

    Uma lista linear uma seqncia de zero ou mais itens x1, x2,,xn, ondexi de um determinado tipo e n representa o tamanho da lista linear. Suaprincipal propriedade estrutural envolve as posies relativas dos itens emuma dimenso. Assumindo n 1, xy1 o primeiro item da lista e xn oltimo item da lista. Em geral xi precede xi+1 para i = 1, 2, ,n 1, e xisucede xa_1 para i = 2, 3, , n. Em outras palavras, o elemento xi ditoestar na i-sima posio da lista.

    Para criar um tipo abstrato de dados Lista, necessrio definir umconjunto de operaes sobre os objetos do tipo Lista. 0 conjunto deoperaes a ser definido depende de cada aplicao, no existindo um con-junto 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 emKnuth (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 seuscomponentes.

    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, deacordo com alguns de seus componentes.

    9. Pesquisar a ocorrncia de um item com um valor particular em algumcomponente.

    0 item 8 acima objeto de um estudo cuidadoso no Captulo 3, e o item 9ser tratado nos Captulos 4 e 5.

    Um conjunto de operaes necessrio para uma aplicao exemplo a serapresentada 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 paraas posies anteriores.

    4. Vazia(Lista). Esta funo retorna true se a lista est vazia; senoretorna false.

    5. Imprime(Lista). Imprime os itens da lista na ordem de ocorrncia.

    Existem vrias estruturas de dados que podem ser usadas para representarlistas lineares, cada uma com vantagens e desvantagens particulares. As duasrepresentaes mais utilizadas so as implementaes atravs de arran-jos e de apontadores. A implementao atravs de cursores (Aho, Hoperoft eUllman, 1983, pp. 48) pode ser til em algumas aplicaes.

  • 2.37. LISTAS LINEARES 37

    2.1.1 Implementao de Listas Atravs de ArranjosEm um tipo estruturado arranjo, os itens da lista so armazenados emposies contguas de memria, conforme ilustra a Figura 2.1. Neste caso alista pode ser percorrida em qualquer direo. A insero de um novo itempode ser realizada aps o ltimo item com custo constante. A insero deum novo item no meio da lista requer um deslocamento de todos os itenslocalizados aps o ponto de insero. Da mesma forma, retirar um item doincio da lista requer um deslocamento de itens para preencher o espaodeixado vazio.

    Figura 2.1: Implementao de uma lista atravs de arranjo

    O campo Item o principal componente do registro TipoLista mostradono Programa 2.1. Os itens so armazenados em um array de tamanhosuficiente para armazenar a lista. 0 campo Ultimo do registro TipoListacontm 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

  • CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

    Programa 2.1: Estrutura da lista usando arranjo

    2.1.2 Implementao de Listas Atravs de ApontadoresEm uma implementao de listas atravs de apontadores, cada item da lista encadeado com o seguinte atravs de uma varivel do tipo Apontador. Estetipo de implementao permite utilizar posies no contguas de memria,sendo possvel inserir e retirar elementos sem haver necessidade de deslocaros itens seguintes da lista.

    A Figura 2.2 ilustra uma lista representada desta forma. Observe queexiste uma clula cabea que aponta para a clula que contm x1. Apesar daclula cabea no conter informao conveniente faz-la com a mesmaestrutura que uma outra clula qualquer para simplificar as operaes sobre alista.

    A lista constituda de clulas, onde cada clula contm um item da listae um apontador para a clula seguinte, de acordo com o registro Clulamostrado no Programa 2.3. O registro TipoLista contm um apontador para aclula cabea e um apontador para a ltima clula da lista. Uma possvelimplementao para as cinco operaes definidas anteriormente mostradano Programa 2.4.

    A implementao atravs de apontadores permite inserir ou retirar itensdo meio da lista a um custo constante, aspecto importante quando a lista temque ser mantida em ordem. Em aplicaes em que no existe previso sobre ocrescimento da lista conveniente usar listas encadeadas por apontadores,porque neste caso o tamanho mximo da lista no precisa ser definido apriori. A maior desvantagem deste tipo de implementao a utilizao dememria extra para armazenar os apontadores.

    38

  • 2.1. LISTAS LINEARES 39

    Programa 2.2: Operaes sobre listas usando posies contguas de memria

  • 40 CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

    Programa 2.3: Estrutura da lista usando apontadores

  • 41.1. LISTAS LINEARES 41

    Programa 2.4: Operaes sobre listas usando apontadores

  • 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 aseguir. Durante o exame vestibular de uma universidade, cada candidato temdireito a 3 opes para tentar uma vaga em um dos 7 cursos oferecidos. Paracada candidato lido um registro contendo os campos mostrados noPrograma 2.5.

    O campo Chave contm o nmero de inscrio do candidato (este campoidentifica de forma nica cada registro de entrada). O campo NotaFinalcontm a mdia das notas do candidato. O campo Opo um vetor con-tendo a primeira, a segunda e a terceira opes de curso do candidato (oscursos so numerados de 1 a 7).

    O problema consiste em distribuir os candidatos entre os cursos, deacordo com a nota final e as opes apresentadas por cada candidato. Nocaso de empate sero atendidos primeiro os candidatos que se inscreverammais cedo, isto , os candidatos com mesma nota final sero atendidos naordem de inscrio para os exames.

    Um possvel caminho para resolver o problema de distribuir os alunosentre os cursos contm duas etapas, a saber:

    1. ordenar os registros pelo campo NotaFinal, respeitando-se a ordem deinscrio dos candidatos;

    2. percorrer cada conjunto de registros com mesma NotaFinal, iniciando-se pelo conjunto de NotaFinal 10, seguido do conjunto da NotaFinal 9,e assim por diante. Para um conjunto de mesma NotaFinal tenta-seencaixar cada registro desse conjunto em um dos cursos, na primeiradas 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 to-

    mar algumas decises sobre representao de dados. Uma boa maneira derepresentar um conjunto de registros atravs de listas. O tipo abs tra to dedados Lista definido anteriormente, acompanhado do conjunto de operaesdefinido sobre os objetos do tipo lista, mostra-se bastante adequado ao nossoproblema.

    O refinamento do comando "ordena os registros pelo campo NotaFinal"do Programa 2.6 pode ser realizado da seguinte forma: os registros ao se-remlidos 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 automa-ticamente ordenados por NotaFinal. Dentro de cada lista os registros estoordenados por ordem de inscrio, desde que os registros sejam lidos naordem 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. Aslistas de registros da Figura 2.3 so percorridas, inicialmente com a lista deNotaFinal 10, seguida da lista de NotaFinal 9, e assim sucessivamente. Aopercorrer uma lista, cada registro retirado e colocado em uma das listas daFigura 2.4, na primeira das trs opes em que houver vaga. Se no houvervaga o registro colocado em uma lista de reprovados. Ao final a estruturada 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 imple-mentao do tipo abstrato de dados Lista. Considerando-se que o tamanhodas listas varia de forma totalmente imprevisvel, a escolha deve cair

  • 452.1. LISTAS LINEARES

    Programa 2.8: Estrutura da lista

    sobre a implementao atravs de apontadores. O Programa 2.8 apresenta adefinio dos tipos de dados a utilizar no ltimo refinamento do algoritmo.

    O refinamento final de algoritmo, descrito em Pascal, pode ser visto noPrograma 2.9. Observe que o programa completamente independente daimplementao do tipo abstrato de dados Lista. Isto significa que podemostrocar a implementao do tipo abstrato de dados Lista de apontador paraarranjo, bastando trocar a definio dos tipos apresentada no Programa 2.8para uma definio similar definio mostrada no Programa 2.1, acompa-nhada da troca dos operadores apresentados no Programa 2.4 pelos opera-dores apresentados no Programa 2.2. Esta substituio pode ser realizadasem 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 funodas operaes para manipular tipos abstratos de dados, ao invs de utilizardetalhes particulares de implementao. Desta forma possvel alterar aimplementao das operaes rapidamente, sem haver necessidade de pro-curar por toda parte do cdigo onde existe referncia direta s estruturas dedados. Este aspecto particularmente importante em programas de grandeporte.

    2.2 PilhasExistem aplicaes para listas lineares nas quais inseres, retiradas e acessosa itens ocorrem sempre em um dos extremos da lista. Uma pilha uma listalinear em que todas as inseres, retiradas e geralmente todos os acessos sofeitos em apenas um extremo da lista..

    Os itens em uma pilha esto colocados um sobre o outro, com o iteminserido mais recentemente no topo e o item inserido menos recentemente nofundo. 0 modelo intuitivo de uma pilha o de um monte de pratos em umaprateleira, sendo conveniente retirar pratos ou adicionar novos pratos naparte superior. Esta imagem est freqentemente associada com a teoria deautmato, onde o topo de uma pilha considerado como o receptculo deuma cabea de leitura/gravao que pode empilhar e desempilhar itens dapilha (Hoperoft e Ullman, 1969).

    As pilhas possuem a seguinte propriedade: o ltimo item 'inserido oprimeiro item que pode ser retirado da lista. Por esta razo as pilhas sochamadas de listas lifo, termo formado a partir de "last-in, first-out". Existeuma ordem linear para pilhas, que a ordem do "mais recente para o menosrecente". Esta propriedade torna a pilha uma ferramenta ideal para proces-samento de estruturas aninhadas de profundidade imprevisvel, situao emque necessrio garantir que subestruturas mais internas sejam processadasantes da estrutura que as contenham. A qualquer instante uma pilha contmuma seqncia de obrigaes adiadas, cuja ordem de remoo da pilha ga-rante que as estruturas mais internas sero processadas antes das estruturasmais externas.

    Estruturas aninhadas ocorrem freqentemente na prtica. Um exemplosimples a situao em que necessrio caminhar em um conjunto de dadose guardar uma lista de coisas a fazer posteriormente (mais adi-ante veremosuma situao semelhante a esta em um programa editor de textos). 0controle de seqncias de chamadas de subprogramas e sintaxe deexpresses aritmticas so exemplos de estruturas aninhadas. As pilhasocorrem tambm em conexo com algoritmos recursivos e estruturas denatureza recursiva, tais como as rvores.

  • 48 CAPTULO 2. ESTRUTURAS DE DADOS BSICAS

    Um tipo abstrato de dados Pilha, acompanhado de um conjunto deoperaes, apresentado a seguir.

    1. FPVazia(Pilha). Faz a pilha ficar vazia.

    2. Vazia(Pilha). Esta funo retorna true se a pilha est vazia; senoretorna 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-oda 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 pararepresentar pilhas. As duas representaes mais utilizadas so as imple-mentaes atravs de arranjos e de apontadores.

    2.2.1 Implementao de Pi lhas Atravs de Arranjo sEm uma implementao atravs de arranjos os itens da pilha so armaze-nados em posies contguas de memria, conforme ilustra a Figura 2.5.Devido s caractersticas da pilha as operaes de insero e de retirada deitens devem ser implementadas de forma diferente das implementaes usa-das anteriormente para listas. Como as inseres e as retiradas ocorrem notopo da pilha, um cursor chamado topo utilizado para controlar a posiodo item no topo da pilha.

    Figura 2.5: Implementao de uma pilha atravs de arranjo

    O campo Item o principal componente do registro TipoPilha mostradono 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 contmum apontador para o item no topo da pilha. A constante MaxTam define otamanho mximo permitido para a pilha.

    As cinco operaes definidas sobre o TipoPilha podem ser implementadasconforme 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 destaforma a estrutura Pilha no copiada a cada chamada do procedimento oufuno.

    2.2.2 Implementao de Pilhas Atravs de Apontadores

    Assim como na implementao de listas lineares atravs de apontadores, umaclula cabea mantida no topo da pilha para facilitar a implementao dasoperaes empilha e desempilha quando a pilha est vazia, conforme ilustra aFigura 2.6. Para desempilhar o item xn da Figura 2.6 basta desligar a clulacabea da lista e a clula que contm xn passa a ser a clula cabea. Paraempilhar um novo item basta fazer a operao contrria, criando uma novaclula cabea e colocando o novo item na antiga clula cabea. 0 campoTamanho existe no registro TipoPilha por questo de eficincia, para evitara contagem do nmero de itens da pilha na funo Tamanho.

    Cada clula de uma pilha contm um item da pilha e um apontador paraoutra clula, conforme ilustra o Programa 2.12. 0 registro TipoPilha contmum apontador para o topo da pilha (clula cabea) e um apontador para ofundo da pilha.

    As cinco operaes definidas anteriormente podem ser implementadasatravs 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 linhaque est sendo editada. Por exemplo, se o cancela-caractere, ento aseqncia de caracteres UEM##FMB#G corresponde seqncia UFMG.Outro comando encontrado em editores de texto o "cancela-linha", cujoefei