Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Tabelas Hash
O uso de listas ou rvores para organizar informaes interessante e produz resultados bastante bons. Entretanto, em nenhuma dessa estruturas se obtm o acesso direto a alguma informao, a partir do conhecimento de sua chave. Uma maneira de organizar dados, que apresenta bons resultados na prtica, conhecida como hashing , baseada na idia de distribuir os dados em posies aleatrias de uma tabela. PodePode-se construir uma tabela de forma a facilitar a busca, colocandocolocandose cada elemento numa posio pr-determinada. prUma tabela hash construda atravs de um vetor de tamanho n, no qual se armazenam as informaes. Nele, a localizao de cada informao dada a partir do clculo de um ndice atravs de uma funo de indexao, a funo de hash.
Tabelas Hash
A posio de um elemento obtida aplicando-se ao elemento a aplicandofuno de hash que devolve a sua posio na tabela. Da basta verificar se o elemento realmente est nesta posio. O objetivo ento transformar a chave de busca em um ndice na tabela. Exemplo: Construir uma tabela com os elementos 34, 45, 67, 78, 89. SupeSupe-se uma tabela com 10 elementos e uma funo de hash x%10 (resto da diviso por 10).
i
0 1 2 3 4 5 6 7 8 9
A[i] -1 -1 -1 -1 34 45 -1 67 78 89
Tabelas Hash
int hash(int x) { return x % 10; } void insere(int a[], int x) { a[hash(x)] = x; } int busca_hash(int a[], int x) { int k; k = hash(x); if (a[k] == x) return k; return 1; }
Funes de Hash
H muitas maneiras de determinar uma funo de hash. hash. Diviso
Uma funo de hash precisa garantir que o valor retornado seja um
Enlaamento
Neste mtodo a chave dividida em diversas partes que so
Funes de Hash
Enlaamento deslocado
As partes da chave so colocadas uma embaixo da outra e processadas. Por exemplo, um cdigo 123-45-6789 pode ser dividido em 3 partes: 123123-45123456456-789 que so adicionadas resultando em 1368. Esse valor pode usar o mtodo da diviso valor%S, ou se a tabela contiver 1000 posies pode-se usar os 3 primeiros nmeros para compor podeo endereo.
Enlaamento limite
As partes da chave so colocadas em ordem inversa. Considerando as mesmas divises do cdigo 123-456-789. 123-456AlinhaAlinha-se as partes sempre invertendo as divises da seguinte forma 321321654654-987. O resultado da soma 1566.
Funes de Hash
MeioMeio-quadrado
A chave elevada ao quadrado e a parte do resultado usada como
endereo.
Extrao
Neste mtodo somente uma parte da chave usada para criar o endereo. Para o cdigo 123-45-6789 pode-se usar os primeiros ou os ltimos 4 dgitos 123-45pode-
Transformao da raiz
A chave transformada para outra base numrica. O valor obtido aplicado no mtodo da diviso valor%S para obter o
endereo.
Tabelas Hash
Suponha agora os elementos 23, 42, 33, 52, 12, 58. Com a mesma funo de hash, tem-se mais de um elemento hash, tempara determinadas posies (42, 52 e 12; 23 e 33). PodePode-se usar a funo x%17, com uma tabela de 17 posies. A funo de hash pode ser escolhida vontade de forma a atender da melhor forma a distribuio.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-1 52 -1 -1 -1 -1 23 58 42 -1 -1 -1 12 -1 -1 -1 33
Tabelas Hash
A escolha da funo a parte mais importante. sempre melhor escolher uma funo que use uma tabela com um nmero razovel de elementos. No exemplo se houvesse a informao adicional que todos os elementos esto entre 0 e 99, poderia se usar tambm uma tabela com 100 elementos onde a funo de hash o prprio elemento. Mas seria uma tabela muito grande para uma quantidade pequena de elementos. A escolha da funo um compromisso entre a eficincia na busca o gasto de memria. A idia central das tcnicas de hash sempre espalhar os elementos de forma que os mesmos sejam rapidamente encontrados.
Esta forma de tratamento de colises tem uma desvantagem que a tendncia de formao de grupos de posies ocupadas consecutivas, fazendo com que a primeira posio vazia, na prtica, possa ficar muito longe da posio original, dada pela funo de hash. Para inserir um determinado valor x na tabela, ou para concluir que o valor no se encontra na tabela, necessrio encontrar a primeira posio vazia aps a posio h(x).
Colises
int hash(int x) { return x % 10;} int insere(int a[], int x, int n) { int i, cont = 0; i = hash(x); while (a[i] != -1) // procura a prxima posio livre {if (a[i] == x) return 1; // valor j existente na tabela if (++cont == n) return 2; // tabela cheia if (++i == n) i = 0; // tabela circular } a[i] = x; // achou uma posio livre return i; } int busca_hash(int a[], int x, int n) { int i, cont = 0 ; i = hash(x); // procura x a partir da posio i while (a[i] != x) {if (a[i] == -1) return 1; // no achou x if (++cont == n) return 2; // a tabela est cheia if (++i == n) i = 0; // tabela circular }// encontrou return i;
A escolha bastante livre, mas o objetivo sempre espalhar ao mximo dentro da tabela os valores da funo para eliminar as colises.
A funo de Hash
A funo de hash deve ser escolhida de forma a atender melhor a particularidade da tabela com a qual se trabalha. Os elementos procurados, no precisam ser somente nmeros para se usar hashing. hashing. Uma chave com caracteres pode ser transformada num valor numrico.
etc.
N e N-1 so primos entre si, para que o resto entre os 2 seja diferente de 0.
10 p h1 ( 10 ) = 3 p 3 est vazio; vazio; 12 p h1 ( 12 ) = 5 p 5 est ocupado, faz-se h2; faz 12 p h2 ( 12 ) = 1 p (C1+C2)%7 p 6 est vazio; 19 p h1 ( 19 ) = 5 p 5 est ocupado, faz-se h2; faz 19 p h2 ( 19) = 2 p (C1+2C2)%7 p 0 p (5+2*1)%7=0
0 1 2 3 4 5 6
19
10
5 12
vazio; vazio;
. . .
19
79
29
final;
Colises
Cada um dos mtodos apresentados tem seus prs e contras:
A Lista linear o mais rpido se o tamanho de memria permite
tamanho de memria que permita que a tabela continue bem esparsa. de memria.
Colises
Em particular, a probabilidade de coliso pode ser reduzida usando uma tabela suficientemente grande em relao ao nmero total de posies a serem ocupadas. Por exemplo, uma tabela com 1000 entradas para uma empresa que deseja armazenar 500 posies haveria uma probabilidade de 50% de coliso, se fosse feita a insero de uma nova chave. ConsideraConsidera-se que, em uma tabela hash bem dimensionada, devemos ter 1,5 acessos tabela, em mdia, para encontrar um elemento. Isto corresponde a uma situao em que metade dos acessos feita diretamente, e, para a outra metade, ocorre uma coliso.
Hash perfeita
O ideal para a funo hash que sejam sempre fornecidos ndices nicos para as chaves de entrada. A funo perfeita (hash perfeita) seria a que, para quaisquer (hash entradas A e B, sendo A diferente de B, fornecesse sadas diferentes. A tabela deve conter o mesmo nmero de elementos. Nem sempre o nmero de elementos conhecido a priori. Na prtica, funes hash perfeitas ou quase perfeitas so encontradas apenas onde a coliso intolervel (por exemplo, nas funes hash da criptografia, ou quando se conhece previamente o contedo da tabela armazenada.
Exerccios
1. Escolha uma boa funo de hash e o nmero de elementos da tabela para os nmeros:
1.2 1.7 1.3 1.8 1.42 1.51
3. Idem com um mximo de 1.000 nmeros entre 0 e 1 com no mximo 5 algarismos significativos. 4. Usando a funo: h(K) =K%13 insira as chaves:
18, 41, 22, 44, 59, 32, 31, 73
Remoo
Normalmente no se utilizam tabelas hash em situaes em que elementos devem ser removidos, pelas dificuldades impostas pelos esquemas de tratamento de colises. Quando se remove um elemento, a tabela perde sua estrutura de hash. hash. Suponha que a tabela hash a seguir trata colises por Lista Linear e o elemento x removido.
Com a remoo de x apenas u e v continuariam acessveis: o acesso a w, y e z seria perdido. Para remover x, de forma correta, seria necessrio mudar diversos outros elementos de posio na tabela.
Remoo
Uma tcnica simples, que cria bastante desperdcio, a de marcar a posio do elemento removido como apagada (mas no livre). Isso evita a necessidade de movimentar elementos na tabela mas cria muito lixo. Uma melhoria nessa tcnica reaproveitar as posies marcadas como removidas no caso de novas inseres. eficiente se a freqncia de inseres for equivalente de remoes. Em casos extremos necessrio refazer o hashing completo dos elementos.
Tabelas Hash
Embora permita o acesso direto ao contedo das informaes, o mecanismo das tabelas hash possui uma desvantagem em relao a listas e rvores. Numa tabela hash virtualmente impossvel estabelecer uma ordem para os elementos,ou seja, a funo de hash faz indexao, mas no preserva ordem.