Você está na página 1de 13

TAD CONJUNTO

Tabelas de dispersão
Operações sobre conjuntos
1 - Operação de busca (acesso):
Existe um determinado elemento dentro
de um conjunto;
2 - Operação de inserção;

Essas operações podem ser implementadas da mesma forma que vimos com as
sequências, isso resolverá o problema. Mas se for feito da mesma forma, será
eficiente?
Operações sobre conjuntos
O conjunto A B C D é igual ao conjunto B C D A, mas em se tratando de
sequências, são duas sequências diferentes.

Portanto para uma sequência, que é um tipo específico de conjunto, há mais


restrições
Operações sobre conjuntos
Implementação do TAD conjunto com vetor:
A inserção O(1) para vetor circular, porém a busca é O(N), pois quando eu insiro o
novo elemento no início ou no fim, a minha sequência não é necessariamente
ordenada, o que implica numa busca sequencial, e não binária.
Abaixo foi inserido o elemento X no vetor

C D F X C D F

Caso queira-se usar a busca binária, O(log2N), é necessário ordenar o vetor com
o novo elemento considerando o novo elemento inserido, o que pode implicar em
complexidade O(N) no pior caso.
Operações sobre conjuntos
E se a implementação for com uma Lista Ligada?

Neste caso há o problema de que não é possível fazer busca binária de forma
eficiente, pois não é possível fazer o acesso ao elemento do meio diretamente,
com complexidade constante. Portanto implicaria numa inserção no início por
exemplo, com O(1) e um acesso com busca sequencial, O(N).

A questão é: Como melhorar a complexidade da busca para o caso do conjunto.


Operações sobre conjuntos
Uma forma de acelerar a busca é se conseguirmos saber onde cada elemento
estará dentro da minha estrutura de dados. Como nos exemplos:

A B C D E F A B C D E F

B E F B C E F

Observe que o elemento F, por exemplo, não muda de posição,


independentemente dos elementos que vem ou não antes.
Operações sobre conjuntos
Para esse tipo de implementação é necessário fazer o mapeamento entre os
espaços de memória e os valores que serão armazenados.
Deve-se criar uma tabela (look-up table) onde é feita uma associação entre os
elementos e os endereços onde eles serão alocados. Pode-se também ter uma função
(fórmula) de mapeamento entre o valor e o endereço.
Contudo essa solução tem um problema quando o universo de possíveis valores a
serem inseridos é muito grande. Imagine uma base de dados de CPFs do Brasil por
exemplo. Seria necessário um espaço mapeado para cada possível CPF a ser inserido.
Tabela de dispersão - Hash Table
A tabela de dispersão é uma estrutura de dados que permite mapear vários
valores diferentes no mesmo espaço de memória, uma relação 1 para N. O custo
que ocorre e que precisa ser resolvido é que dois elementos podem ter que ser
inseridos na mesma posição.
O conceito principal por trás da tabela de dispersão é a função de dispersão,
ou função Hash.
Ex: 073.371.429-73, os 2 dígitos finais são dígitos verificadores que são
calculados a partir dos 9 dígitos anteriores utilizando uma função hash.
As funções hash tem várias aplicações, como na segurança da informação,
quando se verifica a integridade de um arquivo.
Tabela de dispersão - Hash Table
Portanto a função de dispersão mapeará o espaço de valores no espaço de
endereços, bem menor.

Há o risco, é claro, de 2 valores serem mapeados no mesmo endereço. Mas


há mecanismos de contornar este problema. No caso do CPF, a função hash
calcula a chave de uma forma a qual você precisa errar dois dígitos do CPF para
ser possível uma chave de controle (últimos 2 dígitos) igual.
Tabela de dispersão - Hash Table
Para implementar uma tabela de dispersão teremos um vetor com diferentes
endereços e um valor com uma função de dispersão que resultará no endereço a
ser mapeado no vetor. Não havendo conflitos, o custo para o acesso e inserção
será constante, O(1).
Tabela de dispersão - Hash Table
É preciso definir uma estratégia de tratamento de conflitos, ou seja, o que fazer quando, ao
tentar inserir um elemento, já existir um outro elemento no mesmo espaço.
Ex: Vetor: 0 1 2 3 4 5 6 7
NMax = 8
Inserir os elementos 7, 13 e 23
F(valor):end -> Ex: end = valor % 8
I(7) -> B(7) 0 1 2 3 4 5 6 7

I(13) -> B(5) 23 13 7


I(23) -> B(7), no exemplo, como houve o conflito, o 23 foi inserido na posição seguinte(0),
considerando uma implementação com vetor circular.
I = Inserção, B = Busca
Tabela de dispersão - Hash Table
No exemplo anterior, para o pior caso, a complexidade pode ser
linear.

Há inúmeras formas de se implementar funções hash, e com isso


buscar soluções mais otimizadas em relação à complexidade.
Resumo
Conjunto - Tabela de Dispersão

- Função de dispersão
- Estratégia de tratamento de conflitos
- Caso ótimo: Acesso e inserção constantes
- Caso ruim: Acesso e inserção lineares

Você também pode gostar