Curso de Especializac
¸˜
ao em Engenharia de Software
Universidade Federal de Minas Gerais
Departamento de Ciˆ
encia da Computa¸c˜
ao
Estruturas de Dados Fundamentais
Professor Roberto da Silva Bigonha 15 de Junho de 2017
1
OBJETIVOS
O objetivo da disciplina ´e apresentar as estruturas de dados b´asicas e seus algoritmos para o desenvolvimento de programas de computador e criar oportunidades para o uso de Java na implementa¸c˜ao de tipos abstratos de dados e outras estruturas. Concluindo o curso, os alunos dever˜ao ser capazes de construir programas modulares em Java, dominar as principais t´ecnicas utilizadas na implementa¸c˜ao de estruturas de dados b´asicas e de algoritmos de pesquisa. Eles ainda dever˜ao ser capazes de efetuar an´alises simples da complexidade de algoritmos.
2
HOR ´
ARIO DE AULAS
• Dias de Aulas: 20/6 e 21/624/05, 5/6, 6/6, 7/6, 13/6, 14/6, 19/6, • Hor´ario: 19:15 - 20:45 e 21:10 - 22:30
3
PROGRAMA
1. 24/05/2017, 19:15 - 20:45, 21:10 - 22:30
COMPLEXIDADE DE ALGORITMOS (170 min): Medidas do Custo de Execu¸c˜ao: Tempo e Espa¸co. Nota¸c˜ao O. Conceito de Pior, Melhor Caso e Caso M´edio. Complexidade Assint´otica. Classes de Complexi-dade. T´ecnicas de An´alise de Algoritmos Recursivos e N˜ao-Recursivos.
2. 05/06/2017, 19:15
-TIPO ABSTRATO DE DADOS (10 min): Conceitua¸c˜ao. Gap Semˆantico. Extensibilidade de Tipo. DICION ´ARIOS (5min): Conceito. Implementa¸c˜ao.
TABELAS (45 min): Pesquisa Sequencial. Pesquisa Sequencial R´apida. Pequisa Bin´aria.
LISTAS LINEARES (110 min): Conceitua¸c˜ao. Implementa¸c˜ao com Arranjos e Apontadores. Nodo-Cabe¸ca. Invers˜ao de Lista. Caminhamento em Sentido Duplo. Listas com Cursores. Listas Circulares. Listas Duplamente Encadeadas. Inser¸c˜ao e Remo¸c˜ao.
3. 06/06/2017, 19:15 -ENTREGA DO TP I.
TABELAS HASHING (90 min): Transforma¸c˜ao de Chaves. Resolu¸c˜oes de Colis˜oes: Listas de overflow, Hashing Linear, Rehashing.
PILHA (15min): Conceitua¸c˜ao. Implementa¸c˜ao com Arranjos e com Apontadores.
FILAS (20 min): Conceitua¸c˜ao. Implementa¸c˜ao com Arranjos e com Apontadores. Fila circular. ´
ARVORES - parte I (45 min): Conceito de ´Arvores. ´Arvores Bin´arias. 4. 07/06/2017, 19:15
-´
ARVORES - parte II (90 min): ´Arvores Bin´arias Estendidas. Propriedades de ´Arvores Bin´arias. Cami-nhamentos em ´Arvore: Central, Pr´e-Ordem e P´os-Ordem. Caminhamentos Recursivos e N˜ao-Recursivos.
´
ARVORES - parte III (50 min): Caminhamento com iteradores.
5. 13/06/2017, 19:15 -ENTREGA DO TP II.
FILAS DE PRIORIDADES II (90 min): Implementa¸c˜ao do Heap. PESQUISA DIGITAL (10 min): ´Arvore de Pesquisa Digital. Tries.
´
ARVORES PATRICIA I (70 min): Conceitua¸c˜ao. Patricia Bin´aria: Pesquisa. Inser¸c˜ao. Remo¸c˜ao. Implementa¸c˜ao de Patricia com chave de tamanho fixo.
6. 14/06/2017, 19:15 - ´ARVORES PATRICIA II (90 min): Implementa¸c˜ao de Patricia Bin´aria com chave de tamanho vari´avel. Patricia M- ´Aria.
´
ARVORES DE PESQUISA (80 min): Conceitua¸c˜ao. Pesquisa. Inser¸c˜ao. Remo¸c˜ao de Nodos com no M´aximo um Filho. Remo¸c˜ao de Qualquer Nodo.
7. 19/06/2017, 19:15 -ENTREGA DO TP III
´
ARVORES AVL (170 min): Conceito. Teorema de AVL. Balanceamento. Pesquisa. Inser¸c˜ao. Remo¸c˜ao 8. 20/06/2017, 19:15
-´
ARVORES B (60 min): Conceitua¸c˜ao. Pesquisa. ´Arvores B*. ´Arvores B+. ´Arvores 2-3. ´
ARVORE SBB - parte I (110 min): Conceitua¸c˜ao. Balanceamento. Pesquisa. 9. 21/06/2017, 19:15
-´
ARVORE SBB - parte II (90 min): Inser¸c˜ao. Remo¸c˜ao. 21:00 -PROVA FINAL (80 min)
10. 26/06/2017, 19:15 - ENTREGA DO TP IV
11. 28/06/2017, 19:15 - EXAME EXTRA
4
AVALIAC
¸ ˜
AO
A apura¸c˜ao do aproveitamento ser´a feita por pontos cumulativos, em uma escala de 0 (zero) a 100 (cem), distribu´ıdos da seguinte forma:
• Prova Final: 30 pontos
• Trabalhos Pr´aticos de Programa¸c˜ao: 70 pontos
• Exame Extra: 15 pontos (acumulativos) e somente para aqueles que obtiverem de 50 a 59 pontos.
Para aprova¸c˜ao, s˜ao obrigat´orias a frequˆencia de no m´ınimo a 75% das aulas e a obten¸c˜ao de pelo menos 60 pontos. N˜ao haver´a provas suplementares ou de reposi¸c˜ao.
O cumprimento dos prazos de entrega dos trabalhos ´e essencial para o bom andamento do curso e dever´a ser observado. Os prazos estabelecidos s˜ao r´ıgidos e, por uma quest˜ao de justi¸ca, n˜ao negoci´aveis individualmente. Os trabalhos entregues com atraso superior a 24 horas ser˜ao penalizados na nota.
Pedidos de revis˜oes da corre¸c˜ao de trabalhos e provas dever˜ao ser encaminhados por escrito e justificados.
Os trabalhos pr´aticos s˜ao INDIVIDUAIS. Cada aluno dever´a desenvolver e documentar SOZINHO sua pr´opria solu¸c˜ao de forma a poder receber os pontos alocados a cada trabalho.
A documenta¸c˜ao ´e parte essencial de qualquer projeto de software e deve ser sucinta e objetiva. A documenta¸c˜ao do trabalho dever´a conter pelo menos os seguintes itens principais:
1. uma r´apida descri¸c˜ao da arquitetura da solu¸c˜ao implementada, onde dever´a ser informado quais classes foram constru´ıdas e pacotes onde elas est˜ao;
2. a descri¸c˜ao da interface de cada classe implementada. Caso a classe possua atributos p´ublicos, a utiliza¸c˜ao dos mesmos dever´a ser justificada. A implementa¸c˜ao dos m´etodos e atributos por ventura pedidos no trabalho ´e obrigat´oria, por´em o aluno pode adicionar a qualquer das classes pedidas os m´etodos que julgar necess´arios. 3. uma r´apida descri¸c˜ao dos testes realizados para comprovar o correto funcionamento da aplica¸c˜ao. A sa´ıda
impressa dos resultados obtidos, sempre que aplic´avel, ´e necess´aria; 4. a listagem do c´odigo fonte impressa.
Na elabora¸c˜ao dos trabalhos, ´e importante que as estruturas de dados usadas sejam efetivamente implementadas pelo aluno. O uso de solu¸c˜oes prontas, como as ArrayList, Vector, pilhas, filas, ´arvores, tabelas hashing oferecidas pela biblioteca de classes de Java, para solu¸c˜ao dos trabalhos pr´aticos n˜ao ´e permitido. Afinal este ´e um curso para ensinar ao aluno implementar as estruturas de dados fundamentais e n˜ao apenas seu uso.
O ´unico produto que deve ser entregue como resultado dos trabalhos de implementa¸c˜ao ´e a sua documenta¸c˜ao impressa e a listagem dos programas e de seus resultados. Por favor, n˜ao envie ao professor documenta¸c˜ao dos trabalhos em meios eletrˆonicos. Entregue-a diretamente ao professor na sala de aula ou na Secretaria do DCC (sala 5309, hor´ario comercial).
5
TRABALHO PR ´
ATICO I (15 pontos)
5.1
An´
alise de Complexidade
1. Explique o significado das seguintes express˜oes: (a) f (n) ´e O(1)
(b) f (n) ´e O(n) (c) f (n) ´e O(n log n)
2. Sejam f1(n) e f2(n) as fun¸c˜oes de custo dos algoritmos A1 e A2, respectivamente. Qual ´e o significado de
cada uma das seguintes afirmativas:
a) o tempo de execu¸c˜ao de A1 ´e O(n log n) e o tempo de execu¸c˜ao de A2 ´e O(n3).
b) o tempo de execu¸c˜ao de A1´e aproximadamente n log n e o tempo de execu¸c˜ao de A2´e O(n log n).
5.2
Complexidade (Velocidade do Processador)
Responda `as seguintes perguntas:
1. Sejam um algoritmo A cuja complexidade de tempo ´e dada pela fun¸c˜ao f (n) = O(2n) e uma m´aquina M . Essa m´aquina gasta um tempo t para executar o algoritmo A, com uma entrada de tamanho m.
Executando-se o mesmo algoritmo A em uma outra m´aquina M0, 32 (trinta e duas) vezes mais r´apida que M , qual ser´a o tamanho da entrada poss´ıvel de ser processada em M0 gastando o mesmo tempo t?
2. Sejam um algoritmo B cuja complexidade de tempo ´e dada pela fun¸c˜ao f (n) = O(2n3) e uma m´aquina M . Essa m´aquina gasta um tempo t para executar o algoritmo B, ao fornecer uma entrada de tamanho n. Quantas vezes mais r´apida deve ser uma nova m´aquina M0 para processar o algoritmo B com uma entrada 4 (quatro) vezes maior, gastando o mesmo tempo t?
Figura 1: ´Indices Invertidos
3. Um analista de sistemas conhece dois algoritmos para resolver o mesmo problema. A complexidade de tempo de execu¸c˜ao do primeiro algoritmo ´e dada pela fun¸c˜ao f (n) = O(300n2) e a do segundo algoritmo
g(n) = O(5n3). Mesmo sabendo que o segundo algoritmo possui uma ordem de complexidade maior do que
o primeiro, o analista utilizou-o para algumas entradas. A decis˜ao tomada pelo analista foi a seguinte: se a entrada for maior do que o m, ent˜ao utilize o primeiro algoritmo; sen˜ao, utilize o segundo algoritmo. Qual o valor de m, sendo este o tamanho m´aximo da entrada para utilizar o segundo algoritmo?
6
TRABALHO PR ´
ATICO II (15 pontos)
6.1
Arquivos Invertidos com Hash
Arquivos invertidos ´e uma t´ecnica de indexa¸c˜ao, i.e., uma t´ecnica para se realizar buscas r´apidas por um determi-nado item de uma lista de itens. Essa t´ecnica consiste em armazenar as chaves de busca dos itens em uma estrutura de dados que permita encontr´a-las rapidamente. Juntamente com a chave ´e tamb´em armazenada a posi¸c˜ao na lista onde o item ocorre, permitindo o acesso direto a ele. Essa estrutura de acesso r´apido pode ser, por exemplo, uma tabela hash ou mesmo uma ´arvore bin´aria de pesquisa.
Neste trabalho a seguinte situa¸c˜ao ´e suposta: existe um vetor com uma cole¸c˜ao de dados sobre 40 pessoas. Para cada pessoa as seguintes informa¸c˜oes s˜ao mantidas: cpf, nome, idade, sexo e endere¸co. O problema ´e permitir acesso r´apido a esses dados sendo que as chaves de busca s˜ao o cpf e o nome. Para isso o sistema dever´a armazenar as chaves e a posi¸c˜ao do vetor onde cada pessoa se encontra em tabelas hash com resolu¸c˜ao de conflitos por listas encadeadas (as tabelas hash devem ter tamanho 13). Veja um exemplo desse esquema na Figura 1.
Os requisitos do sistema s˜ao:
• o sistema dever´a ler do teclado ou de um arquivo texto uma lista com os dados das pessoas e armazen´a-los em um vetor.
• o sistema dever´a disponibilizar para o usu´ario a op¸c˜ao de: – consulta por cpf e por nome
– no caso da busca por nome, dever˜ao ser listadas todas as pessoas que possuam o nome requisitado – inser¸c˜ao de novos registros de pessoas no sistema
– op¸c˜ao de remo¸c˜ao por cpf. ´E importante que os ´ındices se mantenham consistentes com a remo¸c˜ao – listar todos os registros de pessoas no sistema em ordem alfab´etica.
• para construir o ´ındice de acesso r´apido via as chaves, devem ser utilizadas duas tabelas hash com listas encadeadas para resolver conflitos. Uma delas permitir´a a busca por cpf, a outra por nome, conforme ilustra a Figura 1.
• n˜ao use as classes e fun¸c˜oes prontas de Java para implementa¸c˜ao da tabela hash.
7
TRABALHO PR ´
ATICO III (20 pontos)
7.1
Busca em Texto: Patricia
A busca em texto ´e uma forma de recupera¸c˜ao de informa¸c˜ao muito utilizada atualmente, principalmente na Web, onde o usu´ario informa uma palavra ou uma lista de palavras para ser buscada nos textos de diversos documentos disponibilizados na Internet. Uma outra situa¸c˜ao de busca textual ocorre quando tem-se um documento de texto (p.ex., um livro ou um artigo) e deseja-se procurar por uma ocorrˆencia de uma palavra nesse texto. A busca textual automatizada torna-se relevante quando o tamanho do texto ou o n´umero de documentos de texto a ser pesquisado ´
e grande, situa¸c˜ao em que a busca manual no texto mostra-se invi´avel. Para automatizar a busca de palavras em textos utilizam-se estruturas de dados adequadas para representar textos e documentos de texto. Neste trabalho, ser´a considerada a busca em apenas um documento de texto, sendo as solu¸c˜oes utilizadas facilmente estendidas para considerar mais de um documento de texto. Um documento de texto ser´a referido somente como texto. No trabalho pr´atico a ser desenvolvido, as solu¸c˜oes de automatiza¸c˜ao de busca textual apresentadas devem ser implementadas em Java, e n˜ao ´e permitido o uso de solu¸c˜oes prontas de Java, como ArrayList, Vector, etc. Use somente tipos b´asicos, arranjos e classes, como estruturas fundamentais.
Para resolver o problema, vocˆe deve usar ´arvore Patr´ıca, conforme descrito a seguir, que deve ser implementada por meio das classes ArvorePatriciaPalavra e NodoPatriciaPalavra, que realizam as seguintes interfaces:
public enum NodoTipo { INTERNO, EXTERNO } public interface IItemPalavra {
public String getPalavra(); public int numDeOcorrencias();
public void addOcorrencia(int posicao); public int[ ] getOcorrencia();
public interface INodoPatriciaPalavra { public void setTipo(NodoTipo t); public NodoTipo getTipo(); /* para nodo INTERNO */
public void setNodoPatEsq(INodoPatriciaPalavra n); public INodoPatriciaPalavra getNodoPatEsq(); public void setNodoPatDir(INodoPatriciaPalavra n); public INodoPatriciaPalavra getNodoPatDir(); public void setIndex(int i);
public int getIndex();
public int calcBit(String p); /* para nodo EXTERNO */
public void setItemPalavra(IItemPalavra item); public IItemPalavra getItemPalavra();
}
public interface IArvorePatriciaPalavra { public void inicializa();
public boolean vazia();
public boolean insere(IItemPalavra item); public boolean remove(String p);
public IItemPalavra pesquisa(String p); }
Nesta solu¸c˜ao, as palavras tamb´em s˜ao representadas por um item que armazena suas ocorrˆencias destas no texto. Quando uma nova palavra for encontrada no texto, um objeto do tipo IItemPalavra deve ser instanciado e inserido na ´arvore Patricia. Caso uma nova ocorrˆencia da palavra for encontrada, deve-se recuperar o item na ´
arvore que representa esta palavra, instanciar uma nova ocorrˆencia (i.e., a posi¸c˜ao juntamente com a palavra sucessora) e adicionar a ocorrˆencia nesse item. Assim, todas as opera¸c˜oes de inser¸c˜ao, remo¸c˜ao e pesquisa devem ser implementadas na ´arvore patr´ıcia.
Um nodo da ´arvore Patricia deve ser implementado pela classe NodoPatriciaPalavra. Esta classe representa tanto um nodo interno quanto um nodo externo da ´arvore. A fun¸c˜ao calcBit(String) ´e utilizada por um nodo interno para calcular o i-´esimo bit da palavra passada como parˆametro, onde i ´e definido pelo ´ındice armazenado no nodo (i.e., index).
Pede-se implementar esta solu¸c˜ao por meio de um programa em Java que possibilite ao usu´ario fornecer como entrada um arquivo de texto e um padr˜ao de busca (i.e., uma palavra ou uma frase) e informe como sa´ıda todas as ocorrˆencias deste padr˜ao no texto, apresentando o trecho do texto que inicia na posi¸c˜ao indicada pela ocorrˆencia do padr˜ao, juntamente com o restante do texto at´e a primeira quebra de linha. Fa¸ca testes utilizando esta solu¸c˜ao e apresente uma an´alise da complexidade dos algoritmos implementados, assim como dos resultados dos testes realizados. Para os testes utilize pelo menos um arquivo de texto com pelo menos 1.000 palavras.
8
TRABALHO PR ´
ATICO IV (20 pontos)
8.1
Arvores-B
´
1. Defina ´arvore-B
3. Em linhas gerais, como inser¸c˜oes de registros s˜ao efetuadas em ´arvores-B? Em particular, explique como viola¸c˜oes de propriedade da ´arvore-B devido a inser¸c˜ao de registros s˜ao resolvidas.
4. Em linhas gerais, como remo¸c˜oes de registros s˜ao efetuadas em ´arvores-B? Em particular, explique como viola¸c˜oes de propriedade da ´arvore-B devido a remo¸c˜ao de registros s˜ao resolvidas.
8.2
Inser¸
c˜
ao e Remo¸
c˜
ao em Sbb
1. Desenhe as ´arvores resultantes de cada passo da inser¸c˜ao de um nodo com chave 5 e depois de outro com chave 90 na ´arvore SBB abaixo `a esquerda.
2. Desenhe as ´arvores resultantes de cada passo da remo¸c˜ao da chave 9 e depois da chave 5 da ´arvore SBB abaixo `a direita.