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

Aula sobre Tabela Hash

  • 1.
    Estrutura de Dados TABELAS HASH
  • 2.
    Roteiro • Contextualização • ConceitosBá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 • ConceitosBá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 umconjunto 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étodosde 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: osalgoritmos 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 algumasaplicaçõ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çãode 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 • ConceitosBá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 • ConceitosBá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 • EmComputaçã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 umaTabela 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 TabelasHash? • 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.
  • 19.
  • 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çãode 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 • ConceitosBá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 HashingPerfeito (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 • ConceitosBá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 HashingImperfeito (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 HashingImperfeito (2/2)
  • 32.
    Considerações sobre Funçõesde 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çõesde 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 • ConceitosBá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 duasou 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ísticaPrincipal: 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
  • 39.
  • 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 • ConceitosBá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) • OHash é 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 deaulas Prof. Thales Castro