Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Sumrio da Apresentao
Espalhamento
Sumrio da Apresentao
Espalhamento
A idia inicial de espalhamento
Exemplo
Mtodos de Espalhamento
Mtodo da Diviso
Mtodo da Multiplicao
Implementao das funes Hash
Chaves Fundamentais
Espalhamento de Objetos
Espalhamento de Containers
Associaes
3
Sumrio da Apresentao
Hash com encadeamento em rea separada
Encadeamento Separado
Implementao
Encontro de itens
Hash com encadeamento em rea primria
Implementao
Excluso de itens
4
Sumrio da Apresentao
Hash usando Endereamento Aberto
Sondagem linear
Sondagem Quadrtica
Duplo Hashing
Implementao
Construtor e Destrutor
Insero de itens
Encontro de itens
Excluso de itens
Espalhamento
x
"sju
"tta
"nio
"tio
"elva
"tolv
h(x)
7
8
9
10
11
12
Espalhamento em memria
Secundria
O Espalhamento em memria secundria
o processo preferencial para a implantao
dos arquivos de acesso direto.
10
Buckets (1)
O arquivo dividido em sees menores denominadas
"buckets", que podem conter um ou mais registros.
A funo "Hash" atribui a cada registro um endereo de
"bucket" ("home address"), onde este pode ser
acomodado.
O tamanho de bucket determinado pelo nmero de
registros que este pode armazenar, ou ainda, pelo
nmero de "slots" que ele contm. Um "slot" uma
unidade de armazenamento que contm espao para
um registro.
Um arquivo com 1000 registros pode ser composto de
1.000 "buckets" de tamanho 1, ou 500 "buckets" de
tamanho 2, etc...
Pode-se relacionar o tamanho do "bucket" a
caractersticas fsicas do meio de armazenamento.
Logo, o tempo de transporte do bucket para a
memria principal proporcional ao tamanho do bucket.
11
Buckets (2)
Ocorre uma coliso quando durante uma incluso de
registros, dois deles tm o mesmo endereo calculado pela
funo hash. Estes registros so chamados sinnimos.
As colises no constituem problemas enquanto no se
atingir a capacidade do "bucket" correspondente. A partir
da, ocorre transbordamento, que consiste no fato de um
registro no poder ser acomodado em "home bucket".
Define-se como "home bucket" aquele que est associado
ao "home address" do registro, que fora calculado pela
funo "hash" aplicada chave do registro.
Aumentando o tamanho dos "buckets" diminui a
probabilidade de transbordamento mas aumenta o tempo
de busca do registro no "bucket". Contudo, o acesso
memria principal mais rpido comparado com o tempo
de busca em memria secundria, uma vez que o bucket
ser transferido para memria principal.
12
Mtodos de Espalhamento
15
Mtodo da Multiplicao
Uma variao do mtodo do meio do quadrado o
mtodo da multiplicao, pelo qual hash de x no
multiplica x por si mesmo e sim por uma constante a
A escolha de a deve ser tal que seja relativamente
primo com W, o que se consegue achando a' tal que aa
= 1 (mod W). Ou seja, a' a inversa de a modulo W.
Vale a propriedade axa'=aa'x=1x.
Para palavras de 32 bits pode-se escolher a =
2.654.435.769 cuja representao binria
10 011 110 001 101 110 111 100 110 111 001.
Sua inversa
O cdigo que se segue mostra esta implementao
unsigned
unsigned
unsigned
unsigned
int
int
int
int
16
Implementao das
funes Hash
Sumrio do item
Implementao das funes Hash
Chaves Inteiras
Chaves de Ponto Flutuante
Chaves de Cadeias de
Caracteres
Espalhamento de Objetos
Espalhamento de Containers
Associaes
18
Fundamentos
As chaves dos objetos podem ser de quaisquer tipos de dados
at estruturas como associaes ou containers.
Para um conjunto de chaves, K, e uma constante positiva M,
uma funo hash da forma h: K {0,1,..., M-1}
conveniente implementar a funo h como uma composio
de duas funes f e g. A funo f mapeia chaves em inteiros
f: K Z+
aonde Z+ o conjunto dos inteiros no negativos. A funo g
mapeia inteiros no negativos em {0, 1, ..., M-1}, g: Z + {0,
1, ..., M-1}
Desde que sejam conhecidas as funes f e g, a funo hash
h definida como a composio delas: h = f g
19
Implementao das
funes Hash
Implementao C++
Chaves Inteiras
A funo f que mapeia chaves em inteiros para chaves
constitudas de inteiros f(x) = x
Definio da Funo Hash de Inteiros
// pgm08_01.cpp
typedef unsigned int HashValue;
HashValue Hash (char c)
{ return abs (c); }
HashValue Hash (int i)
{ return abs (i); }
21
22
Espalhamento de Objetos
Um template da classe Wrapper usado para envelopar
instncias de tipos de dados C++ construdos em uma
interface abstrata Object. Usando o template as quatro
classes Char, Int, Double, and String so declaradas da
forma:
typedef
typedef
typedef
typedef
Wrapper<char> Char;
Wrapper<int> Int;
Wrapper<double> Double;
Wrapper<string> String;
26
Espalhamento de Containers
A funo hash f(c) de um container c, com n objetos, o1, o2,
, on definida como
27
Espalhamento de Containers
// pgm08_05.cpp
class HashingVisitor : public Visitor {
HashValue value;
public:
HashingVisitor (HashValue _value) : value (_value) {}
void Visit (Object& object)
{ value += object.Hash (); }
HashValue Value () const
{ return value; }
};
HashValue Container::Hash () const {
HashingVisitor visitor (::Hash (typeid (*this).name()));
Accept (visitor);
return visitor.Value ();
}
28
Associaes
29
Implementao das
funes Hash
Implementao Java
33
35
36
Espalhamento de Containers
A funo hash f(c) de um container c, com
n objetos, o1, o2, , on definida como
Para obter o hash de um container
calcula-se a soma dos valores hash dos
objetos contidos.
37
38
Associaes
Implementao do Espalhamento
Encadeamento Separado
Hash com encadeamento em rea primria
Sondagem linear
Sondagem Quadrtica
Duplo Hashing
Implementao
42
Implementao do
Espalhamento
Implementao C++
Tabelas Hash
44
Implementao do Espalhamento
C++
Hash com encadeamento em rea separada
Tabelas Hash
Definio das funes H Member e do Constructor da
Classe HashTable
//pgm08_08.cpp
HashTable::HashTable (unsigned int _length) :
length (_length)
{}
unsigned int HashTable::H (Object const& object) const
{ return object.Hash () % length; }
Encadeamento Separado
Tabela Hash usando Encadeamento Separado
47
Definio da Classe
ChainedHashTable
// pgm08_09.cpp
class ChainedHashTable : public HashTable
{
Array<LinkedList<Object*> > array;
public:
ChainedHashTable (unsigned int);
// ...
};
48
49
50
51
52
Implementao do Espalhamento
C++
Hash com encadeamento em rea primria
54
Definio da Classe
ChainedScatterTable
// pgm08_13.cpp
class ChainedScatterTable : public HashTable
{
class Entry {
public:
enum { null = ~0U };
Object* object;
unsigned int next;
Entry ();
};
Array<Entry> array;
public:
ChainedScatterTable (unsigned int);
// ...
};
55
//pgm08_14.cpp
ChainedScatterTable::Entry::Entry () :
object (0),
next (null)
{}
ChainedScatterTable::ChainedScatterTable (unsigned int
_length) :
HashTable (_length),
array (_length)
{}
56
57
// pgm08_15.cpp
60
62
Implementao do Espalhamento
C++
Hash usando Endereamento Aberto
para i = 0,1,,M-1
hi ( x) (h(c(i)
x) crepresenta
(i )) mod M i a estratgia de resoluo de
A funo
transbordamentos.
64
c(i ) (i )
Ou, da maneira mais comumc (i )
(i )
hi (h( x) i ) mod M
65
66
c(i ) i 2 i
Na sondagem linear a funo c(i) quadrtica em i.
Ou, da maneira mais comum
c(i ) i 2
67
68
Construtores e Destrutores
O construtor default para a classe
OpenScatterTable::Entry faz com que uma entrada no
ocupada tenha o ponteiro para seu objeto zerada e o
estado default de todas as entradas empty. Este
construtor default inicializa as duas variveis membro
de maneira adequada.
70
(0) {}
OpenScatterTable::OpenScatterTable (unsigned int _length) :
HashTable (_length), array (_length) {}
void OpenScatterTable::Purge() {
for (unsigned int i = 0; i < length; ++i) {
if (array [i].state == Entry::occupied) {
if (IsOwner ())
delete array [i].object;
array [i] = Entry ();
}
}
count = 0;
}
OpenScatterTable::~OpenScatterTable ()
{ Purge (); }
71
75
76
78
Implementao Java
Implementao do Espalhamento
Java
Hash com encadeamento em rea separada
Tabelas Hash
Interface HashTable
// pgm08_06.java
public interface HashTable extends SearchableContainer
{
double getLoadFactor();
}
81
Mtodos AbstractHashTable
// pgm08_07.java
public abstract class AbstractHashTable
extends AbstractSearchableContainer implements HashTable
{
public abstract int getLength();
protected final int f(Object object) {
return object.hashCode();
}
protected final int g(int x) {
return Math.abs(x) % getLength();
}
protected final int h(Object object) {
return g( f(object) );
}
// ...
}
82
Encadeamento Separado
Tabela Hash usando Encadeamento Separado
83
Campos ChainedHashTable
// pgm08_08.java
public class ChainedHashTable extends AbstractHashTable
{
protected LinkedList[] array;
// ...
}
84
86
87
Implementao do Espalhamento
Java
Hash com encadeamento em rea primria
Classe ChainedScatterTable.Entry e
campos ChainedScatterTable
// pgm08_13.java
public class ChainedScatterTable extends AbstractHashTable
{
protected Entry[] array;
static final int nil = -1;
protected static final class Entry {
Comparable object;
int next = nil;
void purge() {
object = null;
next = nil;
}
}
// ...
}
91
95
98
99
Implementao do Espalhamento
Java
Hash usando Endereamento Aberto
101
OpenScatterTable.Entry e campos
OpenScatterTable fields
// pgm08_17.java
public class OpenScatterTable extends AbstractHashTable {
protected Entry[] array;
static final int empty = 0;
static final int occupied = 1;
static final int deleted = 2;
protected static final class Entry {
int state = empty;
Comparable object;
void purge() {
state = empty;
object = null;
}
}
// ...
102
}
106
107
Mtodo OpenScatterTableV2
withdraw (1)
// pgm08_22.java
public class OpenScatterTableV2 extends OpenScatterTable {
public void withdraw(Comparable object) {
if(count == 0)
throw new ContainerEmptyException();
int i = findInstance(object);
if(i < 0)
throw new IllegalArgumentException("object not found");
for(;;) {
int j = (i + 1) % getLength();
while(array[j].state == occupied) {
int h = h(array[j].object);
if((h <= i && i < j) || (i < j && j < h) ||
(j < h && h <= i))
break;
j = (j + 1) % getLength();
109
}
Mtodo OpenScatterTableV2
withdraw (2)
// pgm08_22.java (Continuao)
if(array[j].state == empty)
break;
array[i].state = array[j].state;
array[i].object = array[j].object;
i = j;
}
array[i].state = empty;
array[i].object = null;
--count;
}
// ...
}
110
Aplicao
Java
114
Aplicaes
Aplicao da Hash/Scatter Table--Contando Palavras
Uma aplicao de espalhamento a contagem do
nmero de ocorrncias distintas de cada palavra
contida em um arquivo texto.
AplicaesAplicao da Hash/Scatter Table--Contando
Palavras (1)
//pgm08_23.cpp
class Counter : public Int {
public:
Counter (int i) : Int(i) {}
void operator ++ ()
{ ++datum; }
};
115
Aplicaes
AplicaesAplicao da Hash/Scatter Table--Contando Palavras (2)
// pgm08_23.cpp (Continuao)
void CountWords(HashTable& table) {
std::string word;
while (cin >> word, !cin.eof ()) {
Object& obj = table.Find(Association (*new String (word)));
if(obj.IsNull ())
table.Insert( *new Association(*new String(word),
*new Counter (1)) );
else {
Association& assoc = dynamic_cast<Association&> (obj);
Counter& i = dynamic_cast<Counter&> (assoc.Value ());
++i;
}
}
cout << table << endl;
}
116
Implementao Java
Hierarquia de Classes
118
Tabelas Hash
Interface HashTable
// pgm08_06.java
public interface HashTable extends SearchableContainer
{
double getLoadFactor();
}
119
Mtodos AbstractHashTable
// pgm08_07.java
public abstract class AbstractHashTable
extends AbstractSearchableContainer implements HashTable
{
public abstract int getLength();
protected final int f(Object object) {
return object.hashCode();
}
protected final int g(int x) {
return Math.abs(x) % getLength();
}
protected final int h(Object object) {
return g( f(object) );
}
// ...
}
121
Encadeamento Separado
Tabela Hash usando Encadeamento Separado
122
Campos ChainedHashTable
// pgm08_08.java
public class ChainedHashTable extends AbstractHashTable
{
protected LinkedList[] array;
// ...
}
123
125
126
129
Classe ChainedScatterTable.Entry e
campos ChainedScatterTable
// pgm08_13.java
public class ChainedScatterTable extends AbstractHashTable
{
protected Entry[] array;
static final int nil = -1;
protected static final class Entry {
Comparable object;
int next = nil;
void purge() {
object = null;
next = nil;
}
}
// ...
}
130
134
137
138
para i = 0,1,,M-1
hi ( x) (h(c(i)
x) crepresenta
(i )) mod M i a estratgia de resoluo de
A funo
transbordamentos.
140
c(i ) (i )
Ou, da maneira mais comumc (i )
(i )
hi (h( x) i ) mod M
141
Tabela de
Espalhamento usando
Endereamento Aberto
e Sondagem Linear
142
OpenScatterTable.Entry e campos
OpenScatterTable fields
// pgm08_17.java
public class OpenScatterTable extends AbstractHashTable {
protected Entry[] array;
static final int empty = 0;
static final int occupied = 1;
static final int deleted = 2;
protected static final class Entry {
int state = empty;
Comparable object;
void purge() {
state = empty;
object = null;
}
}
// ...
143
}
147
148
Mtodo OpenScatterTableV2
withdraw (1)
// pgm08_22.java
public class OpenScatterTableV2 extends OpenScatterTable {
public void withdraw(Comparable object) {
if(count == 0)
throw new ContainerEmptyException();
int i = findInstance(object);
if(i < 0)
throw new IllegalArgumentException("object not found");
for(;;) {
int j = (i + 1) % getLength();
while(array[j].state == occupied) {
int h = h(array[j].object);
if((h <= i && i < j) || (i < j && j < h) ||
(j < h && h <= i))
break;
j = (j + 1) % getLength();
150
}
Mtodo OpenScatterTableV2
withdraw (2)
// pgm08_22.java (Continuao)
if(array[j].state == empty)
break;
array[i].state = array[j].state;
array[i].object = array[j].object;
i = j;
}
array[i].state = empty;
array[i].object = null;
--count;
}
// ...
}
151
154