Dicionários TAD Orientado a conteúdo
Dicionários efinição: Tipo abstrato de dados orientado a onteúdo. Contrasta com as PILHAs e FILAs que são orientadas a posição. perações implementadas: Inserir(d,x) insere um item x no dicionário d Remover(d, x) remove um item x de um dicionário d
Tipos de dicionários státicos Construídos uma vez e nunca mudam. Busca tem custo ótimo, desde que seus elementos estejam ordenados Aonde implementar: Vetor Semiinâmicos Construídos com um certa margem para alterações Suporte para inserção e Busca. Remoção é um problema Hashing com endereçamento direto. inâmicos Construído com completa capacidade de alteração Inserção, busca e remoção são implementados com custos ótimos Árvores e Hashing com endereçamento aberto.
Dicionário: Estático Nosso amigo Vetor Variável composta Homogênea que permite o acesso DIRETO a qualquer elemento. Vamos considerar a operação de busca sendo executadas no vetor. Cenário I: Vetor desordenado. Cenário II: Vetor ordenado.
Vetor desordenado Única forma de implementar a busca por um elemento é examinar sequencialmente os elementos no vetor. Reduz o tamanho do problema em UMA unidade por comparação Qual o PIOR CASO para essa abordagem? Quanto custa fazer isso em termos de comparações?
Vetor Ordenado Existe uma nova informação sobre o vetor, vamos usar a informação!!! Busca Binária!!! Reduzir o problema pela metade com apenas UMA comparação. Qual o PIOR CASO para essa abordagem? Quanto custa fazer isso em termos de comparações?
Exemplo & Análise
Custos Inserir Remover Buscar Estático N/A N/A Semi-dinâmico Dinâmica N comparações, vetor desordenado log(n) comparações, vetor ordenado
Tipos de dicionários státicos Construídos uma vez e nunca mudam. Busca é ótima desde que seus elementos estejam ordenados Aonde implementar: Vetor Semiinâmicos Construídos com um certa margem para alterações Suporte para inserção e Busca. Remoção é um problema Hashing com endereçamento fechado. inâmicos Construído com completa capacidade de alteração Inserção, busca e remoção são implementados com custos ótimos Árvores e Hashing com endereçamento aberto.
Semi-Dinâmicos Os métodos de busca visto até momento: São baseado na comparação das chaves. O algoritmo mais eficiente considera os elementos ordenados e tiram proveito disso. O algoritmo mais eficientes tem custo computacional O(log n). A busca baseada em hashing (tabela de dispersão ou espalhamento) é mais eficiente. Na média, é possível encontrar a chave com apenas K COMPARAÇÕES, onde k é beemmm menor que o tamanho do
O hashing
Exemplo
Hashing Perfeito
Em geral é imperfeito
A Função de Hash Uma função de dispersão (função hash) mapeia uma chave de busca para um índice da tabela. O ideal é que a função forneça índices únicos para o conjunto de chaves. A função de Hashing tem influência direta na eficiência das operações da Hash. Quanto melhor for o espalhamento mais eficiente serão as operações
Propriedade De fácil implementação; Conta simples de ser feita Devem espalhar bem as chaves de busca; Evitar colisões, duas ou mais chaves distribuídas na mesma posição;
Uma função Hashing H(x) = x resto M M deve ser um número PRIMO. O FATOR de CARGA da tabela é um bom parâmetro para iniciar a busca por M. A ocupação ESPERADA da tabela
Caso de uso
Colisões Duas chaves distintas são mapeadas para a mesma entrada da tabela. O Tratamento das colisões é feito Encadeamento Endereçamento aberto
Endereçamento Aberto As chaves que sofreram colisão são inseridas na própria tabela. Como buscar uma posição Não ocupada na Tabela Prospecção Linear Prospecção Quadrática Duplo Hashing
Prospecção Linear O índice é incrementado (+i) (h(x) + i) RESTO M Encerra Prospecção se a posição estiver vazia
O Que é preciso para construir uma Hash? UM vetor de tamanho suficientemente GRANDE UMA função de Espalhamento, que distribua bem os elemento UM Método de Tratamento de Colisão, encontre um espaço vazio
Análise Operação de Inserção Calcular a posição, constante; No caso de colisão, J tentativas; O que garante um J pequeno é uma boa escolha da função de hashing e o tamanho da tabela
Análise Operação de BUSCA Calcular a posição, constante; Prospectar a tabela: Até encontrar a chave ou; Um espaço vazio; Máximo de J tentativas.
Custos Inserir Remover Buscar Estático N/A N/A Semi-dinâmico Constante N/A Constante Dinâmica N comparações, vetor desordenado log(n) comparações, vetor ordenado
Tipos de dicionários státicos Construídos uma vez e nunca mudam. Busca é ótima desde que seus elementos estejam ordenados Aonde implementar: Vetor Semiinâmicos Construídos com um certa margem para alterações Suporte para inserção e Busca. Remoção é um problema Hashing com endereçamento fechado. inâmicos Construído com completa capacidade de alteração Inserção, busca e remoção são implementados com custos ótimos Árvores e Hashing com endereçamento aberto.
Dinâmico Implementa Inserção, Busca e Remoção Menor custo para as três operações Estruturas usadas Árvore de Busca Balanceada (AVL, Vermelha e Preta, Arvores 1-2-3); Tabela Hashing com tratamento de colisão
G.M. Adelson-Velskii e E.M. Landis Árvore Binária de Busca Balanceada No máximo DOIS descendentes por nó; Os descendentes no ramo ESQUERDO da árvore é MENOR que a raiz Os descendentes no ramo DIREITO da árvore é MAIOR que a raiz; Para nó qualquer da árvore, as alturas de suas sub-árvores esquerda e direita diferem de, no máximo, 1.
Instância de uma AVL
Busca 16
Busca II 5
Busca III 1
Análise da Busca Similar a Busca Binária Elimina aproximadamente metade dos elementos em cada comparação Seu custo é proporcional a log(n), onfr n é o número de elementos na árvore
Custos Inserir Remover Buscar Estático N/A N/A Semi-dinâmico Constante N/A Constante Dinâmica N comparações, vetor desordenado log(n) comparações, vetor ordenado log(n) comparações
Inserção 16
Após a Inserção FB=+1 FB=+1 FB=+1
Análise da Inserção O custo de Buscar a posição adequada para a inserção do elemento O custo de manter a propriedade da AVL ao longo do caminho de BUSCA Verificar os FBs e ajustá-los quando eles forem iguais a (+/-)DOIS Custo total : log(n)
Custos Inserir Remover Buscar Estático N/A N/A Semidinâmico Dinâmica N comparações, vetor desordenado log(n) comparações, vetor ordenado Constante N/A Constante log(n) comparações log(n) comparações
Remoção 16
Remoção FB=+1 16 FB=+1 FB=+1
Após a Remoção FB=0 FB=0 FB=0
Análise da Remoção O custo de Buscar o elemento a ser removido O custo de manter a propriedade da AVL ao longo do caminho de BUSCA Verificar os FBs e ajustá-los quando eles forem iguais a (+/-)DOIS Custo total : log(n)
Custos Inserir Remover Buscar Estático N/A N/A Semidinâmico Dinâmica N comparações, vetor desordenado log(n) comparações, vetor ordenado Constante N/A Constante log(n) comparações log(n) comparações log(n) comparações
Desbalanceamento: Rotação Simple Direita
Desbalanceamento: Rotação Simples Direita FB= -2 FB= 0 FB= 0 FB= -1 FB= 0 FB= 0
Desbalanceamento: Rotação Simples Esquerda
Desbalanceamento: Rotação Dupla Direita
Desbalanceamento: Rotação Dupla Esquerda 6 5 4 4 6 5
Tipos de Rotação Da Raiz Do Filho mais pesado Tipo Rotação +2 +1 Simples para Esquerda Fator de Balanceamento +2-1 Dupla para Direita -2-1 Simples para Direita -2 +1 Dupla para Esquerda