SlideShare uma empresa Scribd logo
1 de 49
Baixar para ler offline
Estrutura de Dados

    TABELAS HASH
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
   – Hashing Perfeito
   – Hashing Imperfeito
• Colisões
   – Métodos de Tratamento de Colisões
• Limitações e demais aplicações
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
   – Hashing Perfeito
   – Hashing Imperfeito
• Colisões
   – Métodos de Tratamento de Colisões
• Limitações e demais aplicações
Contextualização
• Dado um conjunto de pares (chave,valor)
   – determinar se uma chave está no conjunto e o
     valor associado
   – inserir um novo par no conjunto
   – remover um par do conjunto
• Estruturas que podem ser usadas
   – Tabelas simples (vetores ou listas)
   – Árvores de busca
   – Tabelas de espalhamento (hash)
Contextualização
• Os métodos de pesquisa vistos até agora buscam
  informações armazenadas com base na comparação
  de suas chaves.

• Para obtermos algoritmos eficientes, armazenamos
  os elementos ordenados e tiramos proveito dessa
  ordenação.
Contextualização

• Conclusão: os algoritmos mais eficientes de busca
  mostrados até o momento demandam esforço
  computacional O(n), quando usamos uma tabela
  hash, esta pode realizar tais operações em tempo
  esperado O(1).

• Veremos agora, o método de pesquisa conhecido
  como hashing (tabela de dispersão, espalhamento,
  indexação, escrutínio ou método de cálculo de
  endereço). Na média dos casos, é possível encontrar
  a chave com apenas UMA OPERAÇÃO de LEITURA.
Contextualização
• Em algumas aplicações, é necessário obter o
  valor com poucas comparações, logo, é
  preciso saber a posição em que o elemento se
  encontra, sem precisar varrer todas as chaves.
• A estrutura com tal propriedade é chamada
  de tabela hash.
             20 mod 8 = 4                   45 mod 8 = 5

            0   1       2   3   4   5   6     7

  20 ?     64               11 20             7            45 ?
  11 ?
         11 mod 8 = 3
Contextualização
• A utilização de hashing envolve
   – Computar a função de transformação
   – Tratar colisões.
• Uma função hash (h) deve:
   – Mapear chaves em inteiros entre 0 e N-1, onde N é
     o tamanho da tabela.
   – Ser de computação simples
   – Gerar entradas para a tabela com igual
     probabilidade
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
   – Hashing Perfeito
   – Hashing Imperfeito
• Colisões
   – Métodos de Tratamento de Colisões
• Limitações e demais aplicações’
Conceitos Básicos
          • Arranjos utilizam índices para armazenar as
            informações.

          • Arranjos não fornecem mecanismos para calcular
            o índice a partir de uma informação armazenada.
            A pesquisa não é O(1).

               1         2        3            4            5               6
Família
           José Maria   Leila    Artur      Jolinda       Gisela      Alciene


           Família[1] = “José Maria”
           Família[3] = “Artur”          Em qual posição está “Alciene” ?
           Família[2] = “Leila”
Conceitos Básicos

• Ideal: Parte da informação poderia ser utilizada para
  recuperar diretamente a informação.


       Que informação poderia ser utilizada !?

    Problema: Esta estratégia exigiria um arranjo muito
    grande e a maioria das posições seriam desperdiçadas.
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
   – Hashing Perfeito
   – Hashing Imperfeito
• Colisões
   – Métodos de Tratamento de Colisões
• Limitações e demais aplicações’
Definição de Hash (1/3)
• Hash é uma generalização da noção mais simples de
  um arranjo comum, sendo uma estrutura de dados
  do tipo dicionário.

• Dicionários são estruturas especializadas em prover
  as operações de inserir, pesquisar e remover e que
  não admitem repetições.

• A idéia central do Hash é utilizar uma função,
  aplicada sobre parte da informação (chave), para
  retornar o índice onde a informação deve ou deveria
  estar armazenada.
Definição de Hash (2/3)
• Esta função que mapeia a chave para um índice de
  um arranjo é chamada de Função de Hashing.

• A estrutura de dados Hash é comumente chamada
  de Tabela Hash.
Definição de Hash (3/3)

         123.456.781-00                                               19
                                                                      37
         143.576.342-23
                                          Função de                   50
         345.365.768-93
         879.094.345-45
                                           Hashing                    85
         999.999.999-99                                               20
Tabela
 Hash    19    123.456.781-00; Fausto Silva; Av. Canal. Nº 45.
         20
         ...
         37    143.576.342-23; Carla Perez; Rua Celso Oliva. Nº 27.
         ...
         50    345.365.768-93; Gugu Liberato; Av. Atlântica. S/N.
         ...
         85    879.094.345-45 ; Hebe Camargo; Rua B. Nº 100.
         ...
Tabela Hash
• Em Computação a Tabela Hash é uma estrutura de
  dados especial, que armazena as informações
  desejadas associando chaves de pesquisa a estas
  informações.

• Objetivo: a partir de uma chave, fazer uma busca
  rápida e obter o valor desejado.

• A idéia central por trás da construção de uma Tabela
  Hash é identificar, na chave de busca, quais as partes
  que são significativas.
Ilustração de uma Tabela Hash
                                chave   dados
                           1
                           2

                      ?
 registro (chave k)        X K          registro



                          n-
                          1 n



 Como o registro (com chave K) foi armazenado na
 posição X na Tabela Hash ao lado?

    Resp: Através de uma Função de Hashing.
Como representar Tabelas Hash?

• Vetor: cada posição do vetor guarda uma
  informação. Se a função de hashing aplicada a um
  conjunto de elementos determinar as informações
  I1, I2, ..., In, então o vetor V[1... N] é usado para
  representar a tabela hash.

• Vetor + Lista Encadeada: o vetor contém ponteiros
  para as listas que representam as informações.
Como representar Tabelas Hash?
Função de Hashing
   A Função de Hashing é a responsável por gerar um índice a
    partir de uma determinada chave.

   O ideal é que a função forneça índices únicos para o
    conjunto das chaves de entrada possíveis.
Função de Hashing
   Características desejáveis: eficiência e bom espalhamento.

   A função de Hashing é extremamente importante, pois ela
    é responsável por distribuir as informações pela Tabela Hash.

   A implementação da função de Hashing tem influência direta na
    eficiência das operações sobre o Hash.
Função de Hashing
   Método mais usado
      Usa o resto da divisão por M

         H(K)=K mod M

         Onde K é um inteiro correspondente à chave.

   As chaves não numéricas devem ser transformadas em
    números.




   n é o número de caracteres da chave
   Chave[i] corresponde à representação ASCII do i-ésimo
    caracter da chave
   p[i] é um inteiro de um conjunto de pesos gerado
    randomicamente.
Função de Hashing

   Uma boa função hash (ou de hashing) deve
    apresentar duas propriedades básicas:
      seu cálculo deve ser rápido;

      deve gerar poucas colisões.

   Escolha de funções h apropriadas tentam
    minimizar a probabilidade de ocorrência de
    colisões.
Ilustração da Função de Hashing

                                       chave   dados
                                   1                         Os valores da chave podem
                                2                             ser numéricos, alfabéticos
                                                              ou alfa-numéricos.
registro (K)       E = f (K)    X       K      registro




                               n-1
                               n


              Executam a transformação do valor de uma chave em um
               endereço, pela aplicação de operações aritméticas e/ou lógicas
                                          f: C  E
                 f: função de cálculo de endereço
                C: espaço de valores da chave (domínio de f)
                E: espaço de endereçamento (contradomínio de f)
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
  – Hashing Perfeito
  – Hashing Imperfeito
• Colisões
  – Métodos de Tratamento de Colisões
• Limitações e demais aplicações
Hashing Perfeito

• Característica:

   –   Para quaisquer chaves x e y diferentes e pertencentes a A,
       a função utilizada fornece saídas diferentes;
Exemplo de Hashing Perfeito (6/6)

• Supondo que a turma seja do 2º semestre de
  2005 (código 052) e do curso de Sistemas de
  Informação (código 35).
    Qual seria a função de hashing perfeito !?
    int funcao_hash(int matricula) {
         int valor = matricula – 0523500;
             if((valor >= 0) & (valor <=99)) then
                 return valor;
             else
                 return -1;
    }

    Acesso: dada mat  tabAlunos[funcao_hash(mat)]
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
  – Hashing Perfeito
  – Hashing Imperfeito
• Colisões
  – Métodos de Tratamento de Colisões
• Limitações e demais aplicações
Hashing Imperfeito

• Características:

   – Existe chaves x e y diferentes e pertencentes a A, onde a
     função Hash utilizada fornece saídas iguais;
Exemplo de Hashing Imperfeito (1/2)

• Suponha que queiramos armazenar as
  seguintes chaves: C, H, A, V, E e S em um vetor
  de P = 7 posições (0..6) conforme a seguinte
  função f(k) = k(código ASCII) % P.

• Tabela ASCII: C (67); H (72); A (65); V (86); E
  (69) e S (83).
Exemplo de Hashing Imperfeito (2/2)
Considerações sobre Funções de Hashing (1/2)

• Na prática funções de hashing perfeitas ou quase
  perfeitas:
  – são encontradas apenas onde a colisão não é tolerável (nas
    funções de hashing na criptografia);

  – Quando conhecemos previamente o conteúdo a ser
    armazenado na tabela.

• Nas Tabelas Hash comuns a colisão é apenas
  indesejável, diminuindo o desempenho do sistema.
Considerações sobre Funções de Hashing (2/2)

• Por causa das colisões, muitas Tabelas Hash
  são aliadas com algumas outras estruturas de
  dados para solucionar os problemas de
  colisão, são elas:
  – Listas Encadeadas;
  – Árvores Balanceadas e
  – dentro da própria tabela.
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
  – Hashing Perfeito
  – Hashing Imperfeito
• Colisões
  – Métodos de Tratamento de Colisões
• Demais Aplicações
Colisões
• Quando duas ou mais chaves geram o mesmo
  endereço da Tabela Hash, dizemos que houve
  uma colisão.

• É comum ocorrer colisões.

• Principais causas:
   – em geral o número N de chaves possíveis é muito maior
     que o número de entradas disponíveis na tabela.
   – não se pode garantir que as funções de hashing possuam
     um bom potencial de distribuição (espalhamento).
Tratamento de Colisões

• Um bom método de resolução de colisões é
  essencial, não importando a qualidade da
  função de hashing.
• Há diversas técnicas de resolução de colisão.
• As técnicas mais comuns podem ser
  enquadradas em duas categorias:
  – Endereçamento Aberto (Rehash);
  – Encadeamento.
Encadeamento (Hashing aberto)
Característica Principal: A informação é armazenada em
estruturas encadeadas fora da Tabela Hash. Ou seja manter
numa lista ligada as chaves que levam a um mesmo índice na
tabela de hashing.

  0         KM-1     K4

  1          K5      K6

  2          K1

  3         KM-4     KM       K3



M-2          K2

M-1
Exemplo de Encadeamento

• Suponha que queiramos armazenar os caracteres que
  compõem a palavra CHAVES em um vetor de P = 7 posições
  (0..6) conforme a seguinte função f(k) = k(código ASCII) % P.

                 0

                 1

                 2        H       A       V

                 3

                 4       C

                 5

                 6       E        S
Encadeamento (Hashing aberto)

• Operações
Endereçamento Aberto (Rehash)
             (ou Hashing Fechado)
• Característica Principal:
  – A estratégia é utilizar o próprio espaço da tabela que
    ainda não foi ocupado para armazenar a chave que
    gerou a colisão.
  – Quando o número de registros a serem armazenados
    na tabela puder ser previamente estimado, então não
    haverá necessidade de usar apontadores para
    armazenar os registros
Endereçamento Aberto (Rehash)
               (ou Hashing Fechado)

• Quando a função hash gera para uma chave
 uma posição que já está ocupada, o
 procedimento de armazenamento verifica se a
 posição seguinte também está ocupada; se
 estiver ocupada, verifica a posição seguinte e
 assim por diante, até encontrar uma posição
 livre.
Endereçamento Aberto (Rehash)
            (ou Hashing Fechado)

• Nesse tipo de tratamento, considera-se a
 tabela como uma estrutura circular, onde a
 primeira posição sucede a última posição.) A
 entrada é então armazenada nessa posição.

• Se a busca termina na posição inicialmente
 determinada pela função hash, então a
 capacidade da tabela está esgotada e uma
Endereçamento Aberto (Rehash)
           (ou Hashing Fechado)
• Operações
Endereçamento Aberto (Rehash)
           (ou Hashing Fechado)
• Operações
Roteiro
• Contextualização
• Conceitos Básicos
• Hashing (método de pesquisa)
  – Hashing Perfeito
  – Hashing Imperfeito
• Colisões
  – Métodos de Tratamento de Colisões
• Limitações e demais aplicações
Limitações (1/2)

• O Hash é uma estrutura de dados do tipo dicionário:
   – Não permite armazenar elementos repetidos.
   – Não permite recuperar elementos sequencialmente
     (ordenado).
• Para otimizar a função Hash é necessário conhecer a
  natureza e domínio da chave a ser utilizada.
• No pior caso a complexidade das operações pode ser
  O(N). Caso em que todos os elementos inseridos
  colidirem.
Vantagens e Desvantagens
• Vantagens
  – Algoritmos simples e eficientes para inserção, retirada e
    busca.
  – Alta eficiência no custo de pesquisa, que é O(1) para o caso
    médio.
• Desvantagens
  – nenhuma garantia de balanceamento
  – espaço sub-utilizado nas tabelas
  – o grau de espalhamento é sensível à função de hashing
    utilizada e ao tipo de informação usada como chave.
Aplicações de Hashing

• Algumas áreas de aplicação de Hashing:
   – Integridade de Dados
   – Criptografia
   – Compactação de Dados
   – Tabelas de transposição em jogos de xadrez para
     computador
   – Serviços de DHCP
   – Thesaurus
       • no que tange à computação, um tesauro representa uma
         base de dados contendo tópicos semanticamente
         ortogonais, comumente utilizada em tarefas de busca.
Referências
• Notas de aulas Prof. Thales Castro

Mais conteúdo relacionado

Mais procurados

Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Luciano Ramalho
 
ShellSort - Ordenação
ShellSort - OrdenaçãoShellSort - Ordenação
ShellSort - OrdenaçãoAnderson Zardo
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetoresalfredtaddeus
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonPriscila Mayumi
 
Estrutura de Dados - Aula 03 - Ponteiros e Funções
Estrutura de Dados - Aula 03 - Ponteiros e FunçõesEstrutura de Dados - Aula 03 - Ponteiros e Funções
Estrutura de Dados - Aula 03 - Ponteiros e FunçõesLeinylson Fontinele
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasAdriano Teixeira de Souza
 
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados  - Aula 12 - Listas Duplamente EncadeadasEstrutura de Dados  - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados - Aula 12 - Listas Duplamente EncadeadasLeinylson Fontinele
 
Inteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosInteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosRafael Pinto
 
Árvores Balanceadas AVL
Árvores Balanceadas AVLÁrvores Balanceadas AVL
Árvores Balanceadas AVLDaniel Maia
 
Introdução à Teoria dos Grafos
Introdução à Teoria dos GrafosIntrodução à Teoria dos Grafos
Introdução à Teoria dos GrafosBianca Dantas
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)Alex Camargo
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Adriano Teixeira de Souza
 

Mais procurados (20)

Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
ShellSort - Ordenação
ShellSort - OrdenaçãoShellSort - Ordenação
ShellSort - Ordenação
 
POO - 03 - Alocação de Memória em Java
POO - 03 - Alocação de Memória em JavaPOO - 03 - Alocação de Memória em Java
POO - 03 - Alocação de Memória em Java
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Servidor Web.pdf
Servidor Web.pdfServidor Web.pdf
Servidor Web.pdf
 
Ordenação de vetores
Ordenação de vetoresOrdenação de vetores
Ordenação de vetores
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
 
Algoritmos 05 - Estruturas de repetição
Algoritmos 05 - Estruturas de repetiçãoAlgoritmos 05 - Estruturas de repetição
Algoritmos 05 - Estruturas de repetição
 
Estrutura de Dados - Aula 03 - Ponteiros e Funções
Estrutura de Dados - Aula 03 - Ponteiros e FunçõesEstrutura de Dados - Aula 03 - Ponteiros e Funções
Estrutura de Dados - Aula 03 - Ponteiros e Funções
 
Aula Grafos
Aula GrafosAula Grafos
Aula Grafos
 
Python Interface Gráfica Tkinter
Python Interface Gráfica TkinterPython Interface Gráfica Tkinter
Python Interface Gráfica Tkinter
 
Estrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores BináriasEstrutura de dados em Java - Árvores Binárias
Estrutura de dados em Java - Árvores Binárias
 
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados  - Aula 12 - Listas Duplamente EncadeadasEstrutura de Dados  - Aula 12 - Listas Duplamente Encadeadas
Estrutura de Dados - Aula 12 - Listas Duplamente Encadeadas
 
Inteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em GrafosInteligência Artificial - Aula2 - Busca em Grafos
Inteligência Artificial - Aula2 - Busca em Grafos
 
Árvores Balanceadas AVL
Árvores Balanceadas AVLÁrvores Balanceadas AVL
Árvores Balanceadas AVL
 
Linguagem C 09 Ponteiros
Linguagem C 09 PonteirosLinguagem C 09 Ponteiros
Linguagem C 09 Ponteiros
 
Introdução à Teoria dos Grafos
Introdução à Teoria dos GrafosIntrodução à Teoria dos Grafos
Introdução à Teoria dos Grafos
 
Javascript (parte 1)
Javascript (parte 1)Javascript (parte 1)
Javascript (parte 1)
 
Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada Estrutura de dados em Java - Filas com lista encadeada
Estrutura de dados em Java - Filas com lista encadeada
 

Destaque

16 algoritmos de busca em tabelas - hash
16   algoritmos de busca em tabelas - hash16   algoritmos de busca em tabelas - hash
16 algoritmos de busca em tabelas - hashRicardo Bolanho
 
Hashing enderecamento aberto bean - bean
Hashing enderecamento aberto bean - beanHashing enderecamento aberto bean - bean
Hashing enderecamento aberto bean - beanElaine Cecília Gatto
 
Hashing enderecamento aberto - operações
Hashing enderecamento aberto - operaçõesHashing enderecamento aberto - operações
Hashing enderecamento aberto - operaçõesElaine Cecília Gatto
 
Hashing endereçamento aberto - main
Hashing endereçamento aberto - mainHashing endereçamento aberto - main
Hashing endereçamento aberto - mainElaine Cecília Gatto
 
Estrutura De Arquivos
Estrutura De ArquivosEstrutura De Arquivos
Estrutura De ArquivosJuliano Linux
 
Árvores binárias balanceadas
Árvores binárias balanceadasÁrvores binárias balanceadas
Árvores binárias balanceadasrenatopaschoal
 
Hash table and heaps
Hash table and heapsHash table and heaps
Hash table and heapsKatang Isip
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoGustavo Carvalho
 
Seminário sobre Grafos por Samyra Lara
Seminário sobre Grafos por Samyra LaraSeminário sobre Grafos por Samyra Lara
Seminário sobre Grafos por Samyra LaraIFPB
 
Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...
Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...
Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...Thiago Colares
 
Pesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafosPesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafosDiego Henrique
 
Metodos de ordenação estrutura de dados
Metodos de ordenação   estrutura de dadosMetodos de ordenação   estrutura de dados
Metodos de ordenação estrutura de dadosThalita Chaves
 
Introdução a Teoria dos Grafos
Introdução a Teoria dos GrafosIntrodução a Teoria dos Grafos
Introdução a Teoria dos GrafosChromus Master
 

Destaque (20)

16 algoritmos de busca em tabelas - hash
16   algoritmos de busca em tabelas - hash16   algoritmos de busca em tabelas - hash
16 algoritmos de busca em tabelas - hash
 
Hash e Btree
Hash e BtreeHash e Btree
Hash e Btree
 
Hashing enderecamento aberto bean - bean
Hashing enderecamento aberto bean - beanHashing enderecamento aberto bean - bean
Hashing enderecamento aberto bean - bean
 
Hashing enderecamento aberto - operações
Hashing enderecamento aberto - operaçõesHashing enderecamento aberto - operações
Hashing enderecamento aberto - operações
 
Hashing endereçamento aberto - main
Hashing endereçamento aberto - mainHashing endereçamento aberto - main
Hashing endereçamento aberto - main
 
Tabela Hash com Lista Encadeada
Tabela Hash com Lista EncadeadaTabela Hash com Lista Encadeada
Tabela Hash com Lista Encadeada
 
Estrutura De Arquivos
Estrutura De ArquivosEstrutura De Arquivos
Estrutura De Arquivos
 
Heap
HeapHeap
Heap
 
Árvores binárias balanceadas
Árvores binárias balanceadasÁrvores binárias balanceadas
Árvores binárias balanceadas
 
Mapeamento objeto relacional
Mapeamento objeto relacionalMapeamento objeto relacional
Mapeamento objeto relacional
 
KERNEL, SISTEMA Y TABLA DE ASIGNACIÓN DE ARCHIVOS
KERNEL, SISTEMA Y TABLA DE ASIGNACIÓN DE ARCHIVOSKERNEL, SISTEMA Y TABLA DE ASIGNACIÓN DE ARCHIVOS
KERNEL, SISTEMA Y TABLA DE ASIGNACIÓN DE ARCHIVOS
 
Hash table and heaps
Hash table and heapsHash table and heaps
Hash table and heaps
 
Análise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenaçãoAnálise de desempenho de algoritmos de ordenação
Análise de desempenho de algoritmos de ordenação
 
Seminário sobre Grafos por Samyra Lara
Seminário sobre Grafos por Samyra LaraSeminário sobre Grafos por Samyra Lara
Seminário sobre Grafos por Samyra Lara
 
Kruskal
KruskalKruskal
Kruskal
 
Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...
Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...
Aplicação da Teoria dos Grafos e Algoritmos na Engenharia de Software: Hyperl...
 
Pesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafosPesquisa operacional teoria dos grafos
Pesquisa operacional teoria dos grafos
 
Grafos
GrafosGrafos
Grafos
 
Metodos de ordenação estrutura de dados
Metodos de ordenação   estrutura de dadosMetodos de ordenação   estrutura de dados
Metodos de ordenação estrutura de dados
 
Introdução a Teoria dos Grafos
Introdução a Teoria dos GrafosIntrodução a Teoria dos Grafos
Introdução a Teoria dos Grafos
 

Mais de CriatividadeZeroDocs

Mais de CriatividadeZeroDocs (11)

Aquece Para a prova de EDA3
Aquece Para a prova de EDA3Aquece Para a prova de EDA3
Aquece Para a prova de EDA3
 
Introdução a estrutura de dados
Introdução a estrutura de dadosIntrodução a estrutura de dados
Introdução a estrutura de dados
 
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
Projetos de algoritmos com implementações em pascal e c (nivio ziviani, 4ed)
 
Listas em C
Listas em CListas em C
Listas em C
 
Pilhas e Filas
Pilhas e FilasPilhas e Filas
Pilhas e Filas
 
Coalesced hashing / Hash Coalescido
Coalesced hashing / Hash CoalescidoCoalesced hashing / Hash Coalescido
Coalesced hashing / Hash Coalescido
 
Implementação do Hash Coalha/Coalesced
Implementação do Hash Coalha/CoalescedImplementação do Hash Coalha/Coalesced
Implementação do Hash Coalha/Coalesced
 
Exercício sobre hashing
Exercício sobre hashingExercício sobre hashing
Exercício sobre hashing
 
Operadores Lineares
Operadores LinearesOperadores Lineares
Operadores Lineares
 
Machado de assis
Machado de assisMachado de assis
Machado de assis
 
áLbum de fotografias
áLbum de fotografiasáLbum de fotografias
áLbum de fotografias
 

Aula sobre Tabela Hash

  • 1. Estrutura de Dados TABELAS HASH
  • 2. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações
  • 3. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações
  • 4. Contextualização • Dado um conjunto de pares (chave,valor) – determinar se uma chave está no conjunto e o valor associado – inserir um novo par no conjunto – remover um par do conjunto • Estruturas que podem ser usadas – Tabelas simples (vetores ou listas) – Árvores de busca – Tabelas de espalhamento (hash)
  • 5. Contextualização • Os métodos de pesquisa vistos até agora buscam informações armazenadas com base na comparação de suas chaves. • Para obtermos algoritmos eficientes, armazenamos os elementos ordenados e tiramos proveito dessa ordenação.
  • 6. Contextualização • Conclusão: os algoritmos mais eficientes de busca mostrados até o momento demandam esforço computacional O(n), quando usamos uma tabela hash, esta pode realizar tais operações em tempo esperado O(1). • Veremos agora, o método de pesquisa conhecido como hashing (tabela de dispersão, espalhamento, indexação, escrutínio ou método de cálculo de endereço). Na média dos casos, é possível encontrar a chave com apenas UMA OPERAÇÃO de LEITURA.
  • 7. Contextualização • Em algumas aplicações, é necessário obter o valor com poucas comparações, logo, é preciso saber a posição em que o elemento se encontra, sem precisar varrer todas as chaves. • A estrutura com tal propriedade é chamada de tabela hash. 20 mod 8 = 4 45 mod 8 = 5 0 1 2 3 4 5 6 7 20 ? 64 11 20 7 45 ? 11 ? 11 mod 8 = 3
  • 8. Contextualização • A utilização de hashing envolve – Computar a função de transformação – Tratar colisões. • Uma função hash (h) deve: – Mapear chaves em inteiros entre 0 e N-1, onde N é o tamanho da tabela. – Ser de computação simples – Gerar entradas para a tabela com igual probabilidade
  • 9. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações’
  • 10. Conceitos Básicos • Arranjos utilizam índices para armazenar as informações. • Arranjos não fornecem mecanismos para calcular o índice a partir de uma informação armazenada. A pesquisa não é O(1). 1 2 3 4 5 6 Família José Maria Leila Artur Jolinda Gisela Alciene Família[1] = “José Maria” Família[3] = “Artur” Em qual posição está “Alciene” ? Família[2] = “Leila”
  • 11. Conceitos Básicos • Ideal: Parte da informação poderia ser utilizada para recuperar diretamente a informação.  Que informação poderia ser utilizada !? Problema: Esta estratégia exigiria um arranjo muito grande e a maioria das posições seriam desperdiçadas.
  • 12. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações’
  • 13. Definição de Hash (1/3) • Hash é uma generalização da noção mais simples de um arranjo comum, sendo uma estrutura de dados do tipo dicionário. • Dicionários são estruturas especializadas em prover as operações de inserir, pesquisar e remover e que não admitem repetições. • A idéia central do Hash é utilizar uma função, aplicada sobre parte da informação (chave), para retornar o índice onde a informação deve ou deveria estar armazenada.
  • 14. Definição de Hash (2/3) • Esta função que mapeia a chave para um índice de um arranjo é chamada de Função de Hashing. • A estrutura de dados Hash é comumente chamada de Tabela Hash.
  • 15. Definição de Hash (3/3) 123.456.781-00 19 37 143.576.342-23 Função de 50 345.365.768-93 879.094.345-45 Hashing 85 999.999.999-99 20 Tabela Hash 19 123.456.781-00; Fausto Silva; Av. Canal. Nº 45. 20 ... 37 143.576.342-23; Carla Perez; Rua Celso Oliva. Nº 27. ... 50 345.365.768-93; Gugu Liberato; Av. Atlântica. S/N. ... 85 879.094.345-45 ; Hebe Camargo; Rua B. Nº 100. ...
  • 16. Tabela Hash • Em Computação a Tabela Hash é uma estrutura de dados especial, que armazena as informações desejadas associando chaves de pesquisa a estas informações. • Objetivo: a partir de uma chave, fazer uma busca rápida e obter o valor desejado. • A idéia central por trás da construção de uma Tabela Hash é identificar, na chave de busca, quais as partes que são significativas.
  • 17. Ilustração de uma Tabela Hash chave dados 1 2 ? registro (chave k) X K registro n- 1 n Como o registro (com chave K) foi armazenado na posição X na Tabela Hash ao lado? Resp: Através de uma Função de Hashing.
  • 18. Como representar Tabelas Hash? • Vetor: cada posição do vetor guarda uma informação. Se a função de hashing aplicada a um conjunto de elementos determinar as informações I1, I2, ..., In, então o vetor V[1... N] é usado para representar a tabela hash. • Vetor + Lista Encadeada: o vetor contém ponteiros para as listas que representam as informações.
  • 20. Função de Hashing  A Função de Hashing é a responsável por gerar um índice a partir de uma determinada chave.  O ideal é que a função forneça índices únicos para o conjunto das chaves de entrada possíveis.
  • 21. Função de Hashing  Características desejáveis: eficiência e bom espalhamento.  A função de Hashing é extremamente importante, pois ela é responsável por distribuir as informações pela Tabela Hash.  A implementação da função de Hashing tem influência direta na eficiência das operações sobre o Hash.
  • 22. Função de Hashing  Método mais usado  Usa o resto da divisão por M  H(K)=K mod M  Onde K é um inteiro correspondente à chave.  As chaves não numéricas devem ser transformadas em números.  n é o número de caracteres da chave  Chave[i] corresponde à representação ASCII do i-ésimo caracter da chave  p[i] é um inteiro de um conjunto de pesos gerado randomicamente.
  • 23. Função de Hashing  Uma boa função hash (ou de hashing) deve apresentar duas propriedades básicas:  seu cálculo deve ser rápido;  deve gerar poucas colisões.  Escolha de funções h apropriadas tentam minimizar a probabilidade de ocorrência de colisões.
  • 24. Ilustração da Função de Hashing chave dados 1  Os valores da chave podem 2 ser numéricos, alfabéticos ou alfa-numéricos. registro (K) E = f (K) X K registro n-1 n  Executam a transformação do valor de uma chave em um endereço, pela aplicação de operações aritméticas e/ou lógicas f: C  E f: função de cálculo de endereço C: espaço de valores da chave (domínio de f) E: espaço de endereçamento (contradomínio de f)
  • 25. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações
  • 26. Hashing Perfeito • Característica: – Para quaisquer chaves x e y diferentes e pertencentes a A, a função utilizada fornece saídas diferentes;
  • 27. Exemplo de Hashing Perfeito (6/6) • Supondo que a turma seja do 2º semestre de 2005 (código 052) e do curso de Sistemas de Informação (código 35). Qual seria a função de hashing perfeito !? int funcao_hash(int matricula) { int valor = matricula – 0523500; if((valor >= 0) & (valor <=99)) then return valor; else return -1; } Acesso: dada mat  tabAlunos[funcao_hash(mat)]
  • 28. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações
  • 29. Hashing Imperfeito • Características: – Existe chaves x e y diferentes e pertencentes a A, onde a função Hash utilizada fornece saídas iguais;
  • 30. Exemplo de Hashing Imperfeito (1/2) • Suponha que queiramos armazenar as seguintes chaves: C, H, A, V, E e S em um vetor de P = 7 posições (0..6) conforme a seguinte função f(k) = k(código ASCII) % P. • Tabela ASCII: C (67); H (72); A (65); V (86); E (69) e S (83).
  • 31. Exemplo de Hashing Imperfeito (2/2)
  • 32. Considerações sobre Funções de Hashing (1/2) • Na prática funções de hashing perfeitas ou quase perfeitas: – são encontradas apenas onde a colisão não é tolerável (nas funções de hashing na criptografia); – Quando conhecemos previamente o conteúdo a ser armazenado na tabela. • Nas Tabelas Hash comuns a colisão é apenas indesejável, diminuindo o desempenho do sistema.
  • 33. Considerações sobre Funções de Hashing (2/2) • Por causa das colisões, muitas Tabelas Hash são aliadas com algumas outras estruturas de dados para solucionar os problemas de colisão, são elas: – Listas Encadeadas; – Árvores Balanceadas e – dentro da própria tabela.
  • 34. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Demais Aplicações
  • 35. Colisões • Quando duas ou mais chaves geram o mesmo endereço da Tabela Hash, dizemos que houve uma colisão. • É comum ocorrer colisões. • Principais causas: – em geral o número N de chaves possíveis é muito maior que o número de entradas disponíveis na tabela. – não se pode garantir que as funções de hashing possuam um bom potencial de distribuição (espalhamento).
  • 36. Tratamento de Colisões • Um bom método de resolução de colisões é essencial, não importando a qualidade da função de hashing. • Há diversas técnicas de resolução de colisão. • As técnicas mais comuns podem ser enquadradas em duas categorias: – Endereçamento Aberto (Rehash); – Encadeamento.
  • 37. Encadeamento (Hashing aberto) Característica Principal: A informação é armazenada em estruturas encadeadas fora da Tabela Hash. Ou seja manter numa lista ligada as chaves que levam a um mesmo índice na tabela de hashing. 0 KM-1 K4 1 K5 K6 2 K1 3 KM-4 KM K3 M-2 K2 M-1
  • 38. Exemplo de Encadeamento • Suponha que queiramos armazenar os caracteres que compõem a palavra CHAVES em um vetor de P = 7 posições (0..6) conforme a seguinte função f(k) = k(código ASCII) % P. 0 1 2 H A V 3 4 C 5 6 E S
  • 40. Endereçamento Aberto (Rehash) (ou Hashing Fechado) • Característica Principal: – A estratégia é utilizar o próprio espaço da tabela que ainda não foi ocupado para armazenar a chave que gerou a colisão. – Quando o número de registros a serem armazenados na tabela puder ser previamente estimado, então não haverá necessidade de usar apontadores para armazenar os registros
  • 41. Endereçamento Aberto (Rehash) (ou Hashing Fechado) • Quando a função hash gera para uma chave uma posição que já está ocupada, o procedimento de armazenamento verifica se a posição seguinte também está ocupada; se estiver ocupada, verifica a posição seguinte e assim por diante, até encontrar uma posição livre.
  • 42. Endereçamento Aberto (Rehash) (ou Hashing Fechado) • Nesse tipo de tratamento, considera-se a tabela como uma estrutura circular, onde a primeira posição sucede a última posição.) A entrada é então armazenada nessa posição. • Se a busca termina na posição inicialmente determinada pela função hash, então a capacidade da tabela está esgotada e uma
  • 43. Endereçamento Aberto (Rehash) (ou Hashing Fechado) • Operações
  • 44. Endereçamento Aberto (Rehash) (ou Hashing Fechado) • Operações
  • 45. Roteiro • Contextualização • Conceitos Básicos • Hashing (método de pesquisa) – Hashing Perfeito – Hashing Imperfeito • Colisões – Métodos de Tratamento de Colisões • Limitações e demais aplicações
  • 46. Limitações (1/2) • O Hash é uma estrutura de dados do tipo dicionário: – Não permite armazenar elementos repetidos. – Não permite recuperar elementos sequencialmente (ordenado). • Para otimizar a função Hash é necessário conhecer a natureza e domínio da chave a ser utilizada. • No pior caso a complexidade das operações pode ser O(N). Caso em que todos os elementos inseridos colidirem.
  • 47. Vantagens e Desvantagens • Vantagens – Algoritmos simples e eficientes para inserção, retirada e busca. – Alta eficiência no custo de pesquisa, que é O(1) para o caso médio. • Desvantagens – nenhuma garantia de balanceamento – espaço sub-utilizado nas tabelas – o grau de espalhamento é sensível à função de hashing utilizada e ao tipo de informação usada como chave.
  • 48. Aplicações de Hashing • Algumas áreas de aplicação de Hashing: – Integridade de Dados – Criptografia – Compactação de Dados – Tabelas de transposição em jogos de xadrez para computador – Serviços de DHCP – Thesaurus • no que tange à computação, um tesauro representa uma base de dados contendo tópicos semanticamente ortogonais, comumente utilizada em tarefas de busca.
  • 49. Referências • Notas de aulas Prof. Thales Castro