rios do údo - cavmelo.files.wordpress.com · Tipos de dicionários Estáticos • Construídos uma...

Post on 07-Feb-2019

214 views 0 download

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