rios do údo - cavmelo.files.wordpress.com · Tipos de dicionários Estáticos • Construídos uma...
Transcript of rios do údo - cavmelo.files.wordpress.com · Tipos de dicionários Estáticos • Construídos uma...
Dicionários
TAD Orientado a conteúdo
Dicionários
Definição: Tipo abstrato de dados orientado a conteúdo.
Contrasta com as PILHAs e FILAs que são orientadas a posição.
Operaçõ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
Buscar(d, k) – busca uma chave k em um dicionário d
Tipos de dicionários
Estáticos
• Construídos uma vez e nunca mudam. • Busca tem custo ótimo, desde que seus elementos estejam ordenados • Aonde implementar: Vetor
Semi-dinâ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.
Dinâ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
N comparações, vetor desordenado
log(n) comparações, vetor ordenado
Semi-dinâmico
Dinâmica
Tipos de dicionários
Estáticos
• Construídos uma vez e nunca mudam. • Busca é ótima desde que seus elementos estejam ordenados • Aonde implementar: Vetor
Semi-dinâ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.
Dinâ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 conjunto de chaves.
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
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
H(x) = x resto M
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
N comparações, vetor desordenado
log(n) comparações, vetor ordenado
Semi-dinâmico Constante N/A Constante
Dinâmica
Tipos de dicionários
Estáticos
• Construídos uma vez e nunca mudam. • Busca é ótima desde que seus elementos estejam ordenados • Aonde implementar: Vetor
Semi-dinâ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.
Dinâ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 baseado em Lista encadeadas.
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
N comparações, vetor desordenado
log(n) comparações, vetor ordenado
Semi-dinâmico Constante N/A Constante
Dinâmica 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
N comparações, vetor desordenado
log(n) comparações, vetor ordenado
Semi-dinâmico
Constante N/A Constante
Dinâmica log(n) comparações
log(n) comparações
Remoção
16
Remoção
FB=+1
FB=+1
FB=+1 16
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
N comparações, vetor desordenado
log(n) comparações, vetor ordenado
Semi-dinâmico
Constante N/A Constante
Dinâmica 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= -1
FB= 0
FB= 0
FB= 0
FB= 0
Desbalanceamento: Rotação Simples Esquerda
Desbalanceamento: Rotação Dupla Direita
Desbalanceamento: Rotação Dupla Esquerda
6
4
5
5
4 6
Tipos de Rotação
Da Raiz Do Filho mais pesado
Tipo Rotação
Fator de Balanceamento
+2 +1 Simples para Esquerda
+2 -1 Dupla para Direita
-2 -1 Simples para Direita
-2 +1 Dupla para Esquerda