Skip to content

Commit d33e4ff

Browse files
committed
DoubleHashing.py finally approved
1 parent 097fdac commit d33e4ff

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
class HashItem:
2+
def __init__(self, key, value):
3+
self.key = key
4+
self.value = value
5+
6+
class DoubleHashTable:
7+
8+
def __init__(self):
9+
self.size = 256
10+
self.slots = [None for i in range(self.size)]
11+
self.count = 0
12+
self.MAXLOADFACTOR = 0.65
13+
self.prime_num = 5
14+
15+
#just for internal use (main hash function)
16+
def _hash(self, key):
17+
hv = 0
18+
mult = 1
19+
for ch in key:
20+
hv += mult * ord(ch)
21+
mult += 1
22+
return hv % self.size
23+
24+
#secondary hash function
25+
def h2(self, key):
26+
mult = 1
27+
hv = 0
28+
for ch in key:
29+
hv += mult * ord(ch)
30+
mult += 1
31+
return hv
32+
33+
def put(self, key, value):
34+
item = HashItem(key, value)
35+
h = self._hash(key)
36+
j=1
37+
38+
while self.slots[h]!= None:
39+
if self.slots[h].key == key:
40+
break
41+
h = (h + j * (self.prime_num - (self.h2(key) % self.prime_num))) % self.size
42+
j = j+1
43+
44+
if self.slots[h] == None:
45+
self.count += 1
46+
self.slots[h] = item
47+
self.check_growth()
48+
49+
def get(self, key):
50+
h = self._hash(key)
51+
j = 1
52+
while self.slots[h] != None:
53+
if self.slots[h].key == key:
54+
return self.slots[h].value
55+
h = (h + j * (self.prime_num - (self.h2(key) % self.prime_num))) % self.size
56+
j = j + 1
57+
return None
58+
59+
def check_growth(self):
60+
loadfactor = self.count / self.size
61+
if loadfactor > self.MAXLOADFACTOR:
62+
print("Load factor before growing the hash table", self.count / self.size )
63+
self.growth()
64+
print("Load factor after growing the hash table", self.count / self.size )
65+
66+
def growth(self):
67+
new_hash_table = HashTable()
68+
new_hash_table.size = 2 * self.size
69+
new_hash_table.slots = [None for i in range(new_hash_table.size)]
70+
71+
for i in range(self.size):
72+
if self.slots[i] != None:
73+
new_hash_table.put(self.slots[i].key, self.slots[i].value)
74+
75+
self.size = new_hash_table.size
76+
self.slots = new_hash_table.slots
77+
78+
79+
80+
ht = DoubleHashTable()
81+
ht.put("good", "eggs")
82+
ht.put("better", "spam")
83+
ht.put("best", "cool")
84+
ht.put("ad", "donot")
85+
ht.put("ga", "collide")
86+
ht.put("awd", "hello")
87+
ht.put("addition", "ok")
88+
89+
for key in ("good", "better", "best", "worst", "ad", "ga"):
90+
v = ht.get(key)
91+
print(v)
92+
print("The number of elements is: {}".format(ht.count))

0 commit comments

Comments
 (0)