Universidade Federal do Vale do São Francisco Algoritmos e Estrutura de Dados II Professor: Marcelo Santos Linder E-mail: [email protected] Ementa Árvores B, grafos e tabelas de hash: alocação estática e dinâmica e algoritmos de inserção, remoção e consulta. Armazenamento em disco com uso de índices. Métodos de classificação. Introdução à complexidade de algoritmos, com análise de complexidade no tempo e no espaço. 2 Objetivos Gerais Proporcionar aos alunos experiência teórica e prática com estruturas de dados e modelos abstratos, considerando aspectos da eficiência dos algoritmos associados às estruturas de dados, no tocante a complexidade temporal e espacial dos algoritmos. 3 Objetivos Específicos 4 Apresentar os diversos tipos de modelos abstratos ou estruturas de dados e seus algoritmos; Entender as estruturas de dados como modelos matemáticos cuja escolha é dependente do contexto no qual ela será utilizada; Apresentar o conceito da estrutura de dados árvore e as operações de inserção, remoção e busca; Apresentar o conceito da estrutura de dados grafo e as operações de inserção, remoção e busca; Apresentar a estrutura Tabela de hash e as operações de alocação estática e dinâmica juntamente com as operações de inserção, remoção e consulta. Apresentar a forma de armazenamento em disco por meio do uso de índices. Apresentar os métodos de classificação na sua relação com as operações de busca, ou seja, o rearranjo como Objetivos Específicos 5 uma forma de tornar mais eficiente a operação de busca dos dados. Fazer perceber que rearranjar os elementos de uma estrutura de dados pode proporcionar aos alunos uma melhor compreensão das relações internas que possam existir entre os dados. Fazer perceber que reorganizar é especialmente útil para que sejam alcançadas soluções para um dado problema. Fazer perceber que reorganizar os elementos de uma estrutura de dados muitas vezes podem ajudar a encontrar uma solução para um problema, o que lhes permite ver novas informações destacando uma informação que anteriormente não era visualizada. Fazer perceber que o rearranjo pode ser utilizado para demonstrar conceitos. Metodologia A disciplina será trabalhada com aulas expositivo-dialogadas, onde serão fornecidos os componentes teóricos e será feita a prática de exercícios. Recursos Quadro branco, marcador, notebook e projetor multimídia. Nas aulas práticas serão utilizados os computadores do laboratório onde as aulas ocorrerão. 6 Forma de Avaliação A avaliação será realizada mediante 2 provas escritas e um trabalho prático (passível de alterações). 7 Bibliografia Bibliografia Básica: AARON M.T.; LANGSAM, Y.; MOSHA, J.A. Estruturas de Dados Usando C. Pearson Education, 2005. CORMEN T.H.; LEISERSON C.E.; RIVEST, R.L. Algoritmos Teoria e Prática. Elsevier, 2002. SEDGEWICK, R. Algorithms in C. 3ª ed. Pearson Education, 1998. ZIVIANI, N. Projeto de Algoritmos - com implementação em Pascal e C. Cengage Learning, 1992. Bibliografia Complementar: DOUGLAS D.; MOONEY, A; RANDALL J.S. Course in mathematical modeling. Mathematical Association of America, 1999. STUART, J. Cálculo. 4 ª ed. Cengage Learning, 2005. vol. 1. SAYÃO, L.F. Modelos teóricos em ciência da informação: abstração e método científico. Ciência e Informação, 2001. Bibliografia Auxiliar: 8 DROZDEK A. Estrutura de Dados e Algoritmos em C++. Cengage Learning, 2009. Informações Gerais Material de apoio Os slides utilizados em aula, descrição de trabalhos, datas de avaliações e demais informações referentes à disciplina encontramse na página www.univasf.edu.br/~marcelo.linder 9 Breve Revisão 10 Programa Um programa pode ser visto como a especificação formal da solução de um problema. N.Wirth expressa em sua equação programa = algoritmo + estruturas de dados onde: o algoritmo contém a lógica do programa e os dados são organizados em estruturas de dados. 11 Estruturas de Dados A qualidade da solução de um problema depende, entre outros fatores, da forma como estão organizados os dados relevantes. Encontrar o número do telefone de um certo assinante no conjunto de todos os assinantes. Representação interna de uma string: 4 G A T O G A T O \0 ; . Toda uma classe de modelos desenvolveuse, ao longo do tempo, com o objetivo de viabilizar o processamento de dados. 12 Estruturas de Dados Estruturas de dados são formas genéricas de se estruturar informação de modo a serem registradas e processadas pelo computador. Ex.: lista ordenada; vetores; árvores; grafos, etc. Contudo estas só adquirem significado quando associadas a um conjunto de operações, que visam, de um modo geral, manipulá-las (algoritmos). 13 Tipos Abstratos de Dados Embora os termos “tipo de dado”, “estrutura de dados” e “tipo abstrato de dados” em essência se refiram aos mesmos objetos formais, eles são usados em contextos próprios. O termo “tipo de dado” é usado no contexto de uma linguagem de programação (tipos primitivos) e está associado a um método de interpretar um padrão de bits. 14 Tipos Abstratos de Dados O termo “tipo abstrato de dado” (TAD) denota um modelo junto com um conjunto de operações definidas sobre o modelo. (tipo + operações validas). Por fim, “estrutura de dados” é uma forma concreta de se implementar um TAD, ou seja, uma representação computacional do modelo matemático em questão. 15 Listas, Pilhas e Filas Visando recordá-los dos pontos principais e estabelecer um elo entre as disciplinas, faremos agora um overview dos tópicos vistos na disciplina Algoritmos e Estrutura de Dados I através um conjunto de exercícios. O que é uma lista? Uma lista é uma seqüência de zero ou mais elementos, cada um deles sendo um valor primitivo (átomo ou nodo) ou composto. Em outras palavras, a estrutura de lista representa a ordem linear entre os elementos. Listas podem ser homogêneas ou 16 heterogêneas, lineares ou não lineares. Listas, Pilhas e Filas Cite algumas operação primitivas necessárias a uma implementação de uma lista: -criar uma nova lista; -verificar se a lista é vazia; -acessar o k-ésimo elemento; -inserir um elemento como k-ésimo da lista; -remover o k-ésimo elemento; -etc. 17 Listas, Pilhas e Filas No que tange a gerência de memória como uma lista pode ser implementada? Com relação a gerência de memória uma lista pode ser implementada de forma seqüencial ou encadeada. Utilizando a alocação encadeada uma lista pode ser implementada de algumas formas, cite-as: -simplesmente encadeada; - com nó de cabeçalho; -circular; -duplamente encadeada; 18 -etc. Disciplinas de acesso Muitas vezes é útil impor, para manipulação de uma certa estrutura de dados, restrições quanto à visibilidade de seus componentes ou quanto à ordem que deve ser respeitada para se efetuarem operações, como inserções ou retiradas, por exemplo. Isto ajuda na modelagem de certos processos que ocorrem no mundo real. Com o tempo e a prática, foram identificadas algumas disciplinas de acesso aplicadas a estruturas de dados, úteis em diversas aplicações. Dois casos dos mais importantes são casos particulares de listas com disciplinas de acesso, denominados: filas e pilhas. 19 Listas, Pilhas e Filas Defina uma fila. Uma fila é uma lista com restrições de acesso, em que as operações de inserção são realizadas sobre uma das extremidades, o fim da lista, enquanto operações de consulta e retirada são feitas na outra extremidade, o início da fila. Isto leva ao critério FIFO (first in, first out) que indica que o primeiro item que entra é o primeiro a sair da estrutura. O modelo intuitivo para isto é o de uma fila para atendimento em um guichê, na qual são atendidas as pessoas pela ordem de chegada. 20 Listas, Pilhas e Filas O atendente só tem contato com (só pode consultar) o primeiro (ou o mais antigo) da fila. Novos pretendentes ao serviço entram no fim da fila. No modelo formal, não há opção de abandono da fila: somente o primeiro pode ser retirado (sair da fila). 21 Listas, Pilhas e Filas Especifique uma forma simples e eficiente de armazenar em memória uma fila. Podemos utilizar uma lista simplesmente encadeada com um nó de cabeçalho (descritor) contendo um ponteiro para o primeiro elemento e outro para o último elemento da fila. F INICIO FIM ... Nodo 1 22 Nodo 2 λ Nodo n Desta forma, utilizando a linguagem C, defina o TAD FILA_ENC (de valores inteiros). 23 typedef struct nodo { int inf; struct nodo * next; }NODO; typedef struct { NODO *INICIO; NODO *FIM; }DESCRITOR; typedef DESCRITOR * FILA_ENC; void cria_fila (FILA_ENC *); int eh_vazia (FILA_ENC); void ins (FILA_ENC, int); int cons (FILA_ENC); void ret (FILA_ENC); int cons_ret (FILA_ENC); Listas, Pilhas e Filas Implemente a operação de inserção de um novo elemento no TAD FILA_ENC. Inicialmente é feita a identificação de quantas situações se apresentam no processo de inserção. No caso são duas: lista com algum ou alguns elementos e lista vazia. Listas, Pilhas e Filas Esquema do processo de inserção de um elemento na fila encadeada. F (situação 1) INICIO FIM X • Nodo 1 Nodo 2 Nodo 3 v • Novo F INICIO FIM • 25 Nodo 1 Nodo 2 Nodo 3 v • Nodo 4 Listas, Pilhas e Filas Esquema do processo de inserção de um elemento na fila encadeada. (situação 2) F INICIO • • v Novo FIM • F INICIO • • v FIM • Nodo 1 26 void ins (FILA_ENC f, int v) { NODO *novo; novo = (NODO *) malloc (sizeof(NODO)); if (!novo) { printf ("\nERRO! Memoria insuficiente!\n"); exit (1); } 27 novo->inf = v; novo->next = NULL; if (eh_vazia(f)) f->INICIO=novo; else f->FIM->next=novo; f->FIM=novo; } Listas, Pilhas e Filas Implemente a operação de retirada de um elemento no TAD FILA_ENC. Inicialmente é feita a identificação de quantas situações se apresentam no processo de retirada. No caso são três: lista vazia, lista com mais de um elemento e lista com apenas um elemento. Listas, Pilhas e Filas Esquema do processo de retirada de um elemento na fila encadeada. F (situação 1) INICIO FIM X aux Nodo 1 Nodo 2 • • Nodo 3 Nodo 4 • • Nodo 2 Nodo 3 F INICIO 29 FIM Nodo 1 Listas, Pilhas e Filas Esquema do processo de retirada de um elemento na fila encadeada. (situação 2) F INICIO • • X X FIM • aux 30 Nodo 1 F INICIO • • FIM void ret (FILA_ENC f) { if (eh_vazia(f)) { printf ("\nERRO! Retirada em fila vazia!\n"); exit (3); } 31 else { NODO *aux=f->INICIO; f->INICIO=f->INICIO->next; if (!f->INICIO) f->FIM=NULL; free (aux); } } Listas, Pilhas e Filas Defina uma pilha. Uma pilha é uma lista com restrições de acesso, onde todas as operações só podem ser aplicadas sobre uma das extremidades da lista, denominada topo da pilha. Com isso estabelece-se o critério LIFO (last in, first out), que indica que o último item que entra é o primeiro a sair. O modelo intuitivo para isto é o de uma pilha de pratos, ou livros, etc, na qual só se pode visualizar (consultar) o último empilhado e este é o único que pode ser retirado. E também qualquer novo empilhamento (inserção) se fará sobre o último da pilha. 32 Listas, Pilhas e Filas 33 Listas, Pilhas e Filas Uma pilha pode ser armazenada em uma lista simplesmente encadeada, sem perda de eficiência. Por exemplo: P ... Nodo 1 Nodo 2 λ Nodo n A implementação das operações é trivial. Para fazer uma inserção, basta alocar um nodo para o novo valor, ligá-lo ao primeiro nodo da lista e fazer o ponteiro apontar para o novo nodo. 34 Listas, Pilhas e Filas Uma retirada exige apenas que o ponteiro passe a apontar para o segundo nodo da lista (ou ser anulado, se houver apenas um nodo). Uma consulta exige apenas a recuperação do valor do primeiro nodo. Desta forma, podemos definir o TAD PILHA_ENC (de valores inteiros) da seguinte forma. 35 36 typedef struct nodo { int inf; struct nodo * next; }NODO; typedef NODO * PILHA_ENC; void cria_pilha (PILHA_ENC *); int eh_vazia (PILHA_ENC); void push (PILHA_ENC *, int); int top (PILHA_ENC); void pop (PILHA_ENC *); int top_pop (PILHA_ENC *); Árvores Qual a carência das pilhas e filas? Estas são de difícil utilização para representação hierárquica de elementos. a Devido a… Serem limitadas a apenas uma dimensão. Visando eliminar esta limitação foi criado o conceito de árvore. Uma definição recursiva para árvore é: 1. Uma estrutura vazia é uma árvore. 2. Se t1, …, tk são árvores disjuntas, então a estrutura cuja raiz tem como suas filhas as raízes de t1, …, tk também é uma árvore. 3. Somente estruturas geradas pelas regras 1 e 2 37são árvores. Árvores Exemplo de árvore 38