@@ -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+
102125class 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