-
Notifications
You must be signed in to change notification settings - Fork 0
/
Hash_function.py
executable file
·73 lines (64 loc) · 2.43 KB
/
Hash_function.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
71
72
73
class TablaHash:
def __init__(self):
#self.tamano = 11
self.tamano = 997
self.ranuras = [None] * self.tamano
self.datos = [None] * self.tamano
def agregar(self,clave,dato):
valorHash = self.funcionHash(clave,len(self.ranuras))
if self.ranuras[valorHash] == None:
self.ranuras[valorHash] = clave
self.datos[valorHash] = dato
else:
if self.ranuras[valorHash] == clave:
self.datos[valorHash] = dato #reemplazo
else:
proximaRanura = self.rehash(valorHash,len(self.ranuras))
while self.ranuras[proximaRanura] != None and \
self.ranuras[proximaRanura] != clave:
proximaRanura = self.rehash(proximaRanura,len(self.ranuras))
if self.ranuras[proximaRanura] == None:
self.ranuras[proximaRanura]=clave
self.datos[proximaRanura]=dato
else:
self.datos[proximaRanura] = dato #reemplazo
def funcionHash(self,clave,tamano):
return clave%tamano
def rehash(self,hashViejo,tamano):
return (hashViejo+1)%tamano
def obtener(self,clave):
ranuraInicio = self.funcionHash(clave,len(self.ranuras))
dato = None
parar = False
encontrado = False
posicion = ranuraInicio
while self.ranuras[posicion] != None and \
not encontrado and not parar:
if self.ranuras[posicion] == clave:
encontrado = True
dato = self.datos[posicion]
else:
posicion=self.rehash(posicion,len(self.ranuras))
if posicion == ranuraInicio:
parar = True
return dato
def existe(self,clave):
ranuraInicio = self.funcionHash(clave,len(self.ranuras))
dato = None
parar = False
encontrado = False
posicion = ranuraInicio
while self.ranuras[posicion] != None and \
not encontrado and not parar:
if self.ranuras[posicion] == clave:
encontrado = True
dato = self.datos[posicion]
else:
posicion=self.rehash(posicion,len(self.ranuras))
if posicion == ranuraInicio:
parar = True
return encontrado
def __getitem__(self,clave):
return self.obtener(clave)
def __setitem__(self,clave,dato):
self.agregar(clave,dato)