Skip to content

Commit c320bb6

Browse files
committed
HashTable: Added Resizable HashTable implementation by over loading the put method
to grow the table by a factor of 2 each time the table has more than 2/3 of it full (same as __builtin__ dict)
1 parent 8fba7d8 commit c320bb6

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

map/hashtable.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,29 @@ def __len__(self):
9999
return self._len
100100

101101

102+
class ResizableHashTable(HashTable):
103+
MIN_SIZE = 8
104+
105+
def __init__(self):
106+
super().__init__(self.MIN_SIZE)
107+
108+
def put(self, key, value):
109+
rv = super().put(key, value)
110+
# increase size of dict * 2 if filled >= 2/3 size (like python dict)
111+
if len(self) >= (self.size * 2) / 3:
112+
self.__resize()
113+
114+
def __resize(self):
115+
keys, values = self._keys, self._values
116+
self.size *= 2 # this will be the new size
117+
self._len = 0
118+
self._keys = [self._empty] * self.size
119+
self._values = [self._empty] * self.size
120+
for key, value in zip(keys, values):
121+
if key is not self._empty and key is not self._deleted:
122+
self.put(key, value)
123+
124+
102125
class TestHashTable(TestCase):
103126
def test_one_entry(self):
104127
m = HashTable(10)
@@ -165,3 +188,13 @@ def test_len_after_deletions(self):
165188
self.assertEqual(0, len(m))
166189
m.put(11, 42)
167190
self.assertEqual(1, len(m))
191+
192+
def test_resizable_hash_table(self):
193+
m = ResizableHashTable()
194+
self.assertEqual(ResizableHashTable.MIN_SIZE, m.size)
195+
for i in range(ResizableHashTable.MIN_SIZE):
196+
m.put(i, 'foo')
197+
self.assertEqual(ResizableHashTable.MIN_SIZE * 2, m.size)
198+
self.assertEqual('foo', m.get(1))
199+
self.assertEqual('foo', m.get(3))
200+
self.assertEqual('foo', m.get(ResizableHashTable.MIN_SIZE - 1))

0 commit comments

Comments
 (0)