forked from levysiqueira/py-pcs3110
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hash.py
70 lines (58 loc) · 2.15 KB
/
hash.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
class TabelaHash:
""" Implementação de uma tabela Hash usando o método da divisão e endereçamento aberto
com sondagem linear para resolver colisões.
"""
def __init__(self, tamanho = 10):
self.lista = [None] * tamanho
def insere(self, elemento):
""" Insere o elemento na tabela Hash.
"""
pos = elemento.chave % len(self.lista)
deu_volta = False
while not deu_volta:
if self.lista[pos] is None or \
self.lista[pos] is TabelaHash.VAZIO: #
self.lista[pos] = elemento
return
pos = (pos + 1) % len(self.lista)
deu_volta = pos == elemento.chave % len(self.lista)
raise RuntimeError('Sem espaço disponível')
def busca(self, chave):
""" Busca o elemento com a chave na tabela Hash e o retorna.
"""
pos = chave % len(self.lista)
deu_volta = False
while not deu_volta:
if self.lista[pos] is None:
return None
elif self.lista[pos] is TabelaHash.VAZIO: #
pass
elif self.lista[pos].chave == chave:
return self.lista[pos]
pos = (pos + 1) % len(self.lista)
deu_volta = pos == chave % len(self.lista)
return None
class Vazio:
""" Marcador de elemento removido.
"""
pass
VAZIO = Vazio()
def remove(self, elemento):
""" Remove um elemento na tabela Hash (usando o Vazio como marcador.)
"""
pos = elemento.chave % len(self.lista)
deu_volta = False
while not deu_volta:
if self.lista[pos] is None:
raise ValueError('Elemento inexistente')
elif self.lista[pos] is elemento:
self.lista[pos] = TabelaHash.VAZIO
return
pos = (pos + 1) % len(self.lista)
deu_volta = pos == elemento.chave % len(self.lista)
raise ValueError('Elemento inexistente')
class Elemento:
""" Classe simples que possui o atributo chave.
"""
def __init__(self, chave):
self.chave = chave