Preview only show first 10 pages with watermark. For full document please download

Aed 09

Aula de Algoritmo e Estrutura de Dados do Professor Patrick Pedreira.

   EMBED


Share

Transcript

Algoritmos e Estruturas de Dados Estruturas de dados dinâmicas  Fila  É um tipo especial de lista, caracterizada pela forma como seus elementos são inseridos e removidos. Estruturas de dados dinâmicas Prof. Patrick Pedreira Estruturas de dados dinâmicas  As operações sobre as filas são similares às definidas para listas: 1. Iniciação 2. Enfileiramento  Numa fila, os primeiros elementos inseridos são os primeiros a serem removidos.  FIFO (First In, First Out)  Exemplo:  Imaginemos uma fila de ônibus. Inicialmente, não temos ninguém na fila. Depois, chega uma pessoa à fila, que ficará na primeira posição. A próxima pessoa ficará atrás da primeira (em segundo) e assim sucessivamente. Quando o ônibus chegar, obrigatoriamente a primeira pessoa da fila deverá entrar, seguida da segunda pessoa da fila e assim por diante. Portanto, a primeira pessoa a entrar na fila também será a primeira a sair dela.  Consideramos que os elementos são inseridos no final da fila e removidos a partir do início. Estruturas de dados dinâmicas  Iniciação da fila  Precisamos manter os ponteiros para o início e o final da fila, já que a entrada e a saída de elementos se dão por essas vias.  Consideraremos o mesmo exemplo dos livros vistos nas aulas anteriores 3. Desenfileiramento 4. Tamanho 5. Término 1 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Enfileiramento de um elemento na fila  Quando enfileiramos um elementos, não precisamos buscar uma posição específica.  Todo elemento é inserido no final da fila Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Desenfileiramento (remoção) de um elemento da fila  Sempre começa pelo início da fila, não fazendo sentido busca o elemento por uma determinada posição 2 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Tamanho da fila  Retorna o número de elementos da fila Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Término da fila  Encerra a utilização da fila, liberando o espaço usado por cada um de seus elementos 3 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas  Pilhas  É um tipo especial de lista, caracterizada pela forma como seus elementos são inseridos e removidos.  Os últimos elementos inseridos são os primeiros a serem removidos.  LIFO (Last In, First Out)  Exemplo:  Imaginemos uma pilha de livros sobre uma mesa.  Inicialmente, não temos nenhum livro. Estruturas de dados dinâmicas  As operações sobre as pilhas são similares às definidas para listas: 1. Iniciação 2. Enpilhamento 3. Desenpilhamento 4. Tamanho 5. Término  Depois, colocamos o primeiro livro na mesa. O próximo livro ficará em cima do primeiro e assim sucessivamente.  Quando formos remover um livro, obrigatoriamente teremos que pegar o livro que está em cima (ou no topo) da pilha  Portanto, o primeiro elemento a ser removido será o último elemento que foi inserido na pilha. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Iniciação de uma pilha  Em vez da cabeça, em uma pilha precisamos manter apenas o topo da lista, ou seja, o último elemento. 4 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Empilhamento de um elemento na pilha  No empilhamento, não precisamos buscar uma posição já que todo elemento é inserido no topo da pilha Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Desempilhamento de um elemento da pilha  O desempilhamento (remoção) sempre começa pelo topo, não precisando buscar o elemento a ser removido em uma determinada posição 5 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Tamanho da pilha  Retorna o número de elementos da pilha Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Término da pilha  Libera o espaço de memória da cada elemento da pilha, encerrando sua utilização a 6 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas  Árvores  É uma estrutura de dados otimizada para o acesso/recuperação de seus elementos.  A utilização de árvores é muito eficiente no armazenamento de grandes quantidades de dados, a fim de garantir bom desempenho na busca de informação.  Existem muitas variações na construção de árvores.Veremos as árvores binárias (que são as mais populares) e suas operações.  A árvore é uma estrutura hierárquica na qual, a partir de um elemento, podemos relacioná-lo com outros abaixo em sua hierarquia.  Cada elemento de uma árvore é chamado de nó.  Assim como em uma lista, todos os nós são ligados.  Entretanto, diferentemente da lista, cada nó pode ser ligado a mais de um nó. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Árvores (cont.)  Em uma árvore, há um nó inicial, de onde toda a árvore se deriva.  Chamamos esse elemento de raiz.  A raiz se liga com um ou mais elementos, e cada um destes forma uma nova subárvore.  Dizemos que esses elementos são seus galhos ou filhos.  Chamamos os nós que não se ramificam de folhas.  Cada nó forma uma subárvore a partir de seus galhos, e para essa subárvore, o nó em questão é a raiz.  Existe um caminho único entre a raiz e qualquer outro nó da árvore.  Caso haja mais de um caminho, a estrutura em questão é um grafo, portanto, urna árvore é uma especializaç especialização de um grafo. Estruturas de dados dinâmicas  A figura anterior é uma árvore, pois atende a todos os requisitos:  1. Todos os nós têm ao menos uma ligação.  2. Todos os nós são acessíveis a partir da raiz.  3. Existe um único caminho entre a raiz e qualquer outro nó.  No exemplo anterior, para acessarmos o nó 11, fazemos o caminho: Raiz -> Nó 2 -> Nó 6 -> Nó 11.  Para que haja apenas um único caminho entre a raiz e qualquer folha, um nó-filho não pode ter dois pais, ou um galho não pode ter duas raízes nem troncos. 7 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Uma árvore é dividida em níveis, e o nó-raiz está no nível O, os nós-filhos da raiz estão no nível 1, etc.  Ou seja, cada nó de distância da raiz determina um novo nível.  A altura (h) de uma árvore é a quantidade de nós que existe entre a raiz e a folha mais distante da árvore, ou seja, o maior nível da árvore + 1.  Todas as folhas não precisam estar no mesmo nível da árvore.  Por exemplo, a árvore da figura anterior tem altura 4, apesar de termos o nó-folha 5 no nível 2.  Exemplos de utilização de árvores.  Em um sistema operacional os arquivos são armazenados em uma árvore de diretórios (figura do próximo slide)  Esta estrutura não é uma árvore pois há dois caminhos entre o nó raiz e o nó folha 10. Estruturas de dados dinâmicas  Outro exemplo é a árvore genealógica. A relação entre pais e filhos é inerentemente hierárquica e, por isso mesmo, apropriada para representação por meio de uma árvore. Estruturas de dados dinâmicas  Problema - Genealogia representada em uma árvore hierárquica  José é um senhor com 95 anos. Ele teve quatro filhos: Carlos, Marco, Flávio e Lucas.  Carlos teve uma filha chamada Luíza. Marco teve dois filhos, André e Roberto. Flávio teve um filho, Marcelo. Lucas não teve filhos.  Luíza teve duas filhas: Helena e Cristina. André teve um filho, Mateus. Roberto e Marcelo não tiveram filhos.  Faça a árvore genealógica da descendência de José, ilustrada em uma árvore, determinando a raiz, os nósfolhas e a altura da árvore. 8 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas  A altura (h) da árvore é 4. O maior nível da árvore é 3, já que a raiz encontra-se no nível 0. A raiz é o nó “José”. As folhas são os nós “Helena”, “Cristina”, “Mateus”, “Roberto”, “Marcelo” e “Lucas”. Estruturas de dados dinâmicas  O fato de a altura determinar o maior caminho possível entre o nó raiz e um nó folha implica que este será o maior custo para se acessar qualquer elemento na estrutura.  Dessa forma, precisamos de uma estratégia para que, a partir da raiz, possamos fazer o caminho que nos leve a qualquer elemento procurado, caso contrário poderemos ter que testar diversos caminhos para encontrar algum elemento.  Para lidar com essa situação, utilizamos árvores de pesquisa.  Uma das características que tornam uma árvore interessante do ponto de vista algorítmico é a relação entre sua altura e a sua quantidade de elementos, pois a altura determina o número máximo de nós necessários para se alcançar qualquer nó a partir da raiz.  Visualmente, podemos notar que há muito mais elementos que a altura da árvore. Estruturas de dados dinâmicas  Nessas árvores, os elementos são armazenados em uma determinada ordem, de forma que sabemos, a partir de um nó, em qual de suas subárvores o elemento desejado se encontra.  Este processo repetido recursivamente nos permite encontrar qualquer elemento dentro da árvore sempre por meio do primeiro caminho feito.  Veremos uma das árvores de pesquisa mais populares e utilizadas: a árvore binária. Estruturas de dados dinâmicas Árvores binária de pesquisa  São um tipo de árvore de pesquisa nas quais cada nó tem no máximo dois filhos.  Os elementos são armazenados na árvore de acordo com o valor de sua chave.  Para todo nó, a subárvore à esquerda tem chaves menores que a chave do nó e a subárvore à direita, valores maiores.  Assim, se a raiz tem uma chave com valor 10, todos os nós da subárvore derivada do nó filho da esquerda terão chaves menores que 10 e todos os nós da subárvore derivada do nó filho da direita terão chaves maiores que 10.  Para qualquer nó, a mesma regra se aplica.  Perceba que todos os nós da subárvore à esquerda da raiz têm chaves menores que 10 (chave da raiz): 5, 2, 8, 1 e 3.  Já na subárvore à direita da raiz, todas as chaves são maiores que 10: 15, 20 e 17.  Perceba ainda que o mesmo ocorre a partir de qualquer outro nó e das subárvores abaixo dele. 9 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas  Problema: Armazenar valores em uma árvore binária  Dados os valores 1, 2, 3, 4, 5, 6, 7, 8, 10, 15, 20, 25, 30, 35 e 41, desenhe a “melhor” árvore binária para seu armazenamento. Estruturas de dados dinâmicas  A resolução desse problema passa pela descoberta do que seria a “melhor” árvore binária.  Como estamos tratando de uma árvore de pesquisa, a melhor árvore é a que garante o menor caminho para o acesso a qualquer elemento.  Para que isso ocorra, precisamos que os elementos se distribuam da forma mais homogênea possível.  Se todas as folhas se encontrarem no mesmo nível, teremos a menor altura possível para a árvore.  Para que tenhamos a distribuição desejada na árvore, é preciso que haja um número igual (ou quase) de elementos nas subárvores esquerda e direita da raiz. Essa regra se aplica a todo o nó-pai na árvore.  Em nosso problema, portanto, Precisamos definir o elemento mediano (que tem metade dos elementos maior que ele e metade menor) como raiz. Estruturas de dados dinâmicas  Em nosso caso, a chave ideal para raiz é o número 8, pois são 7 elementos menores que 8 e 7 maiores (não confundir o elemento mediano com a média dos elementos).  Aplicando a mesma lógica aos conjuntos da esquerda (1, 2, 3, 4, 5, 6, 7) e da direita (10, 15,20,25,30,35,41) encontraremos como raízes das subárvores os nós 4 e 25. Repetindo o processo sucessivamente, teremos a seguinte árvore: Estruturas de dados dinâmicas  Exercício  1 – Otimize a distribuição da árvore seguinte diminuindo ao máximo a altura da árvore  2- Construa uma árvore binária com a menor altura possível com os elementos: 1, 3, 5, 7, 12, 34, 35, 55, 69, 70, 72, 75, 80, 82, 85 e 87. 10 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas  Veremos as seguintes operações sobre árvores binárias: Estruturas de dados dinâmicas  Iniciação da árvore  Iniciação  Inserção  Busca  Remoção  Término Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Inserção de um elemento na árvore Aproveitou-se do fato da estrutura da árvore ser recorrente, ou seja, cada nó da árvore pode ser considerado a raiz da subárvore abaixo dele, sendo desenvolvida uma módulo recorrente de inserção 11 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas  Busca de um elemento na árvore Estruturas de dados dinâmicas  Remoção de um elemento da árvore  É a mais complexa das operações. Isto porque o elemento a ser excluído pode estar em qualquer ponto da árvore, podendo não ser um elementofolha e exigindo, assim, a reestruturação da suhárvore abaixo dele.  São três os tipos de nós a serem removidos: 1. Caso o elemento seja folha, basta a sua remoção. Na chamada externa ao módulo Busca, espera-se a passagem da raiz como primeiro argumento, pois é somente a partir da raiz que podemos encontrar qualquer elemento pertencente à árvore. Estruturas de dados dinâmicas  Na situação 3 anterior...  O elemento a ser escolhido deve manter a árvore ordenada, mantendo os elementos menores que si na subárvore à esquerda e os elementos maiores à direita.  Existem dois elementos que podem desempenhar esse papel:  o maior dos elementos menores que a raiz;  o menor dos elementos maiores que a raiz.  O primeiro caso pode ser encontrado na folha mais à direita (maior elemento) da subárvore esquerda (elementos menores que a raiz) do elemento a ser removido  O segundo caso pode ser encontrado na folha mais à esquerda (menor elemento) da subárvore direita (elementos maiores que a raiz) do elemento a ser removido. 2. Caso o elemento tenha apenas um filho, este tomará o seu lugar. 3. Por fim, se o elemento removido for a raiz de uma subárvore com galhos à direita e à esquerda, precisaremos selecionar um elemento pertencente à subárvore para substituí-lo. Estruturas de dados dinâmicas  No exemplo seguinte, se removêssemos a raiz, o nó da primeira opção seria o nó 10 (chave 7) e o nó da segunda opção seria o nó 11 (chave 10).  Ambos manteriam a árvore ordenada. 12 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas Estruturas de dados dinâmicas  Na implementação, utilizaremos o módulo auxiliar Busca_Nova_Raiz para determinar a nova raiz da subárvore, caso o elemento removido se enquadre no terceiro caso.  Escolhemos arbitrariamente utilizar o menor dos elementos maiores que a raiz.  A rigor, qualquer das escolhas seria válida. Estruturas de dados dinâmicas Estruturas de dados dinâmicas A função Busca_Nova_Raiz é ativada no caso 3, quando o nó tem 2 filhos. Neste caso, encontramos a raiz substituta, copiamos o dado para o nó que seria removido, mantemos a árvore conexa ligando o pai da raiz substituta com o filho à direita e liberamos o nó da raiz substituta. 13 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message. Estruturas de dados dinâmicas 14 Please purchase 'e-PDF Converter and Creator' on http://www.e-pdfconverter.com to remove this message.