mat disc parte12

Upload: andre-freitas

Post on 10-Mar-2016

233 views

Category:

Documents


0 download

DESCRIPTION

MATEMATICA DISCRETA

TRANSCRIPT

  • Universidade Federal do Vale do So FranciscoCurso de Engenharia da Computao

    1

    Prof. Jorge [email protected] - www.univasf.edu.br/~jorge.cavalcanti

    Matemtica Discreta Matemtica Discreta 1212

  • Hashing

    Introduo Hashing (espalhamento) uma forma simples, fcil de

    implementar e intuitiva de se organizar grandes quantidades de dados.

    Permite armazenar e encontrar rapidamente dados por chaves. Possui como idia central a diviso de um universo de dados a ser organizado em subconjuntos mais gerenciveis.

    2

    Possui dois conceitos centrais: Tabela de Hashing estrutura que permite acesso aos subconjuntos;

    Funo de Hashing funo que realiza o mapeamento entre valores da chave e entradas da tabela.

    Funo Hashingh(k)

    Tabela Hashingchaves

    Subconjuntos

  • Ex: Arrays e listas Ex: rvores

    Hashing

    Por que usar Hashing?

    Estruturas de busca sequencial levam tempo at encontrar o elemento desejado.

    3

    5 2 6 1 7 8 4 9

    5 2 6 1 4

    8

    2

    6

    4

    1

    9

  • Hashing

    Por que usar Hashing?

    Em algumas aplicaes, necessrio obter o valor com poucas comparaes, logo, preciso saber a posio em que o elemento se encontra, sem precisar varrer todas as chaves.

    A estrutura com tal propriedade chamada de tabela hashing.

    464 11 20 7

    0 1 2 3 4 5 6 7

    20 ?

    20 % 8 = 4

    20 45 ?

    45 % 8 = 5

    hashing. A tabela segue a propriedade da funo de hashing estabelecida.

    Ex: h(k)= k mod n, n=8

  • Hashing

    Ex.: Considere uma chave de identificao numrica com valores entre 0 e 1000 bem como uma tabela de armazenamento com entradas indexadas de 1 a 23. Uma funo de hashing simples e razovel seria:hash= h:{0,1,...,1000}{1,2,3,...,23}, tal que para c{0,1,...,1000}, tem-se que:h(c) = (c mod 23) + 1, onde mod calcula o resto da diviso inteira.

    5

    Funo Hashingh(k)

    Tabela Hashing0 134 237 360 387 452 766 1000

    Subconjuntos

    (c mod 23) + 1

    1 8 16 20 23

    Chave 452 623 766 237 134 360 285

    End 16 3 8 8 20 16 10

  • Hashing

    Ento, se possumos um universo de dados classificveis por chaves, podemos:

    Criar um critrio simples para dividir este universo em subconjuntos com base em alguma qualidade do domnio das chaves;

    Saber em qual subconjunto procurar e colocar uma chave; Gerenciar esses subconjuntos menores por algum mtodo simples;

    Para isso, precisamos:Saber quantos subconjuntos eu quero criar e uma regra de clculo

    6

    Saber quantos subconjuntos eu quero criar e uma regra de clculo que nos diga, dada uma chave, em qual subconjunto devo procurar pelos dados com esta chave ou colocar este dado, caso seja um novo elemento;

    Esta regra uma Funo de Hashing, tambm chamada de funo de clculo de endereo, funo de randomizao ou funo de aleatorizao.

    Possuir um ndice que permita encontrar o incio do subconjunto certo, depois de calcular o hashing. Isto uma tabela de hashing.

  • A funo hash a responsvel por gerar um ndice a partir de determinada chave.

    A Tabela hash pode apontar para posies na forma de vetores simples ou listas.

    Funo Hashing

    Tabela Hashingcha

    Hashing

    7

    Funo Hashingh(k)a

    ves

    Vetor simples com valores

    Funo Hashingh(k)

    Tabela Hashingchaves

    Vetor de listas

  • Hashing

    Ex.:

    8

  • Hashing

    Funo de Hashing Possui o objetivo de transformar o valor de chave de um elemento de dados em uma posio para este elemento em um dos b subconjuntos definidos.

    Deve procurar dividir o universo de chaves K = {k0,..,km}em b subconjuntos de mesmo tamanho.

    A probabilidade de uma chave kj pertencente a K aleatria qualquer cair em um dos subconjuntos bi: i

    9

    aleatria qualquer cair em um dos subconjuntos bi: i pertencente a [1,b] deve ser uniforme.

    Se a funo de Hashing no dividir K uniformemente entre os bi, a tabela de hashing pode degenerar. O pior caso de degenerao aquele onde todas as chaves caem em um nico conjunto bi.

    A funo "primeira letra" do exemplo anterior um exemplo de uma funo ruim. A letra do alfabeto com a qual um nome inicia no distribuda uniformemente. Quantos nomes comeam com "X"?

  • Hashing

    Uma funo de Hashing deve procurar satisfazer as seguintes condies: Ser simples de calcular; Assegurar que elementos distintos tenham ndices distintos; Gerar uma distribuio equilibrada para os elementos dentro do array ou subconjuntos;

    Deve ser aleatria, ou pseudo-aleatria, para prevenir adivinhaes do valor original;

    10

    adivinhaes do valor original; Deve ser nica, onde praticamente impossvel dois endereos diferentes serem gerados a partir da mesma chave.

    Deve ter mo nica, o que significa ser muito difcil a partir do endereo e dos valores originais obter a funo.

    A forma de transformao mais simples e utilizada a Diviso, como vista anteriormente: h(kj) = mod(kj,b) + 1, onde b (preferencialmente um nmero primo) o nmero de subconjuntos em dividimos os dados.

  • Hashing

    A funo ideal aquela que gera um endereo diferente para cada um dos possveis valores das chaves (Funo injetora).

    Porm nem sempre possvel e ai geram colises, ou seja, em alguns casos, podem ser atribudos mesmos endereos a chaves com valores diferentes.

    Diferenas entre hashing e indexao:No espalhamento os endereos parecem ser aleatrios

    11

    No espalhamento os endereos parecem ser aleatrios no existe conexo bvia entre a chave e o endereo, apesar da chave ser utilizada no clculo do endereo

    No espalhamento duas chaves podem levar ao mesmo endereo (coliso) portanto as colises devem ser tratadas.

  • Hashing

    Chaves no-numricas:

    Ex.:Suponha que foi reservado espao para manter 1.000 registros e considere a seguinte h(K): Obter as representaes ASCII dos dois primeiros caracteres do nome;

    Multiplicar estes nmeros e usar os trs dgitos menos significativos do resultado para servir de endereo.

    12

    Nome Cod ASCII 2 primeiras letras

    Produto Endereo

    BALL 66 65 66 x 65 = 4.290 290

    LOWELL 76 96 76 x 96 = 6.004 004

    TREE 84 82 84 x 82 = 6.888 888

  • Hashing

    Continuao Exemplo:

    13

    O ideal usar uma funo de espalhamento perfeita, que no produz coliso, mas...

    Duas palavras diferentes podem produzir o mesmo endereo (coliso), pois as chaves so sinnimas

    Temos, h(LOWELL)=h(LOCK)=h(OLIVER)

  • Hashing

    Colises Coliso: quando duas ou mais chaves so mapeadas na mesma posio da tabela de hash;

    Tipicamente, o nmero de posies numa tabela de hash pequeno comparado com o universo de chaves possveis;

    A maioria das funes de hash usadas na prtica mapeiam vrias chaves na mesma posio na tabela de hash.

    14

    vrias chaves na mesma posio na tabela de hash.

    Problemas de hashing: Encontrar funes de hash que distribuam as chaves de modo uniforme e minimizem o nmero de colises;

    Resolver colises.

  • Colises Devido ao fato de existirem mais chaves que posies, comum que vrias chaves sejam mapeadas na mesma posio.

    Ex: 45 % 8 = 5 1256 % 15 = 1121 % 8 = 5 356 % 15 = 1193 % 8 = 5 506 % 15 = 11

    Hashing

    15

    93 % 8 = 5 506 % 15 = 11

    O que fazer quando mais de um elemento for inserido na mesma posio de uma tabela hash?

  • Endereamento Fechado (Closed Addressing)

    No endereamento fechado, a posio de insero no muda, logo, todos devem ser inseridos na mesma posio, atravs de uma lista ligada em cada uma.

    Hashing

    16

    0

    1

    2

    3

    4

    20 % 5 = 0 20

    18 % 5 = 3

    1825 % 5 = 0coliso com 20

    25

  • A busca feita do mesmo modo: calcula-se o valor da funo hash para a chave, e a busca feita na lista correspondente.

    Se o tamanho das listas variar muito, a busca pode se tornar ineficiente, pois a busca nas listas seqencial:

    Endereamento Fechado (Closed Addressing)

    Hashing

    17

    tornar ineficiente, pois a busca nas listas seqencial:

    0

    1

    2

    3

    20 4 0 88 32

    15 11

    60

  • Por esta razo, a funo hash deve distribuir as chaves entre as posies uniformemente:

    0 1 2 3 4 5 6

    Endereamento Fechado (Closed Addressing)

    Hashing

    18

    0 15 10

    31

    4

    88

    13

    20

    Se o tamanho da tabela for um nmero primo, h mais chances de ter uma melhor distribuio.

  • No endereamento aberto, quando uma nova chave mapeada para uma posio j ocupada, uma nova posio indicada para esta chave.

    A nova posio incrementada at que uma posio vazia seja encontrada (linear probing):

    Endereamento Aberto (Open Addressing)

    Hashing

    19

    64 11 20 70 1 2 3 4 5 6 7

    27 ?

    27 % 8 = 3

    11 20 27

  • Valores: 52, 78, 48, 61, 81, 120, 79, 121, 92Funo: hash(k) = k % 13

    Tamanho da tabela: 13

    0 1 2 3 4 5 6 7 8 9 10 11 12

    Endereamento Aberto (Open Addressing)

    Hashing

    20

    0 1 2 3 4 5 6 7 8 9 10 11 12

    52

    52

    78

    78 48

    48

    61

    61

    81

    81

    120

    120

    79

    79

    121

    121

    92

    92

  • Para fazer uma busca com endereamento aberto, basta aplicar a funo hash, e a funo de incremento at que o elemento ou uma posio vazia sejam encontrados.

    Porm, quando um elemento removido, a posio vazia pode ser encontrada antes, o que significaria fim de busca, MESMO que o elemento PERTENA tabela:

    Endereamento Aberto Remoo

    Hashing

    21

    MESMO que o elemento PERTENA tabela:

    64 11 20 7

    Insero do 27

    Remoo do 20

    Busca pelo 2711 272011 27

    27? No

    11

    Fim da busca? Sim

  • Para contornar esta situao, mantemos um bit (ou um campo booleano) para indicar que um elemento foi removido daquela posio:

    27? No

    Endereamento Aberto Remoo

    Hashing

    22

    64 11 20 711 2720X11 27

    27? No

    11

    Fim da busca? No

    X 27

    Esta posio estaria livre para uma nova insero, mas no seria tratada como vazia numa busca.

  • Nesta poltica de hashing, h o que chamamos de fator de carga (load factor). Este fator indica a porcentagem de clulas da tabela hash que esto ocupadas, incluindo as que foram removidas.

    Quando este fator fica muito alto (ex: excede 50%), as operaes na tabela passam a demorar mais, pois o

    Endereamento Aberto Expanso

    Hashing

    23

    64 1 X 11 X 9 7

    operaes na tabela passam a demorar mais, pois o nmero de colises aumenta.

    9 ? 1 X 11 X 9

  • Quando isto ocorre, necessrio expandir o array que constitui a tabela, e reorganizar os elementos na nova tabela. Como podemos ver, o tamanho atual da tabela passa a ser um parmetro da funo hash.

    Endereamento Aberto Expanso

    Hashing

    24

    Tamanho = 13

    34 40 X 11 95

    3440 1195

    Tamanho = 7

  • O momento ou critrio para expandir a tabela pode variar: Impossibilidade de inserir um elemento Metade da tabela est ocupada O load factor atingiu um valor limite escolhido

    Endereamento Aberto Expanso

    Hashing

    25

    A terceira opo a mais comum, pois um meio termo entre as outras duas.

  • Muitas colises diminuem muito o tempo de acesso e modificao de uma tabela hash. Para isso necessrio escolher bem: a funo hash o tratamento de coliseso tamanho da tabela

    Quando no usar Hashing?

    Hashing

    26

    o tamanho da tabela Quando no for possvel definir parmetros eficientes, pode ser melhor utilizar rvores balanceadas (como AVL), em vez de tabelas hash.

    + Hashing em Estruturas de Dados

  • 1 - Ilustre a organizao final de uma Tabela Hash aps a insero das seguintes chaves: 35, 99, 27, 18, 65, 45. Considere a tabela com tamanho 6 (posies 0 a 5), o mtodo da diviso inteira como funo de hashing e tratamento de coliso por endereamento fechado.Considere tambm que os nmeros possveis de chaves

    Exerccios:

    Hashing

    27

    Considere tambm que os nmeros possveis de chaves esto no intervalo entre 1 a 100.

    2 - Idem questo anterior, porm o tratamento de coliso ser por endereamento aberto (linear probing).

  • 3 Seja uma funo h(k) = k % 11 e os dados abaixo obtidos para uma seqncia de chaves:

    Resolva as colises por endereamento aberto.

    Exerccios:

    Hashing

    key 82 31 28 4 45 27 59 79 35

    h(key) 5 9 6 4 1 5 4 2 2

    28

    Resolva as colises por endereamento aberto.