@@ -6,10 +6,12 @@ class HashMap {
66
77 /**
88 * Initialize array that holds the values. Default is size 1,000
9- * @param {number } initialCapacity
9+ * @param {number } initialCapacity initial size of the array
10+ * @param {number } loadFactor if set, the Map will automatically rehash when the load factor threshold is met
1011 */
11- constructor ( initialCapacity = 1000 ) {
12+ constructor ( initialCapacity = 1000 , loadFactor = 0 ) {
1213 this . buckets = new Array ( initialCapacity ) ;
14+ this . loadFactor = loadFactor ;
1315 this . size = 0 ;
1416 this . collisions = 0 ;
1517 this . keys = [ ] ;
@@ -63,6 +65,11 @@ class HashMap {
6365 this . buckets [ bucketIndex ] [ entryIndex ] . value = value ;
6466 }
6567
68+ // check if a rehash is due
69+ if ( this . loadFactor > 0 && this . getLoadFactor ( ) > this . loadFactor ) {
70+ this . rehash ( this . buckets . length * 2 ) ;
71+ }
72+
6673 return this ;
6774 }
6875
@@ -147,7 +154,7 @@ class HashMap {
147154 }
148155
149156 /**
150- *
157+ * Load factor - measure how full the Map is. It's ratio between items on the map and total size of buckets
151158 */
152159 getLoadFactor ( ) {
153160 return this . size / this . buckets . length ;
@@ -207,3 +214,31 @@ hashMap.rehash(1000);
207214console . log ( hashMap . collisions ) ;
208215console . log ( hashMap . buckets ) ;
209216assert . equal ( hashMap . getLoadFactor ( ) , 5 / 1000 ) ;
217+
218+ // automatic rehashing based on loadFactor
219+ const dynamicMap = new HashMap ( 2 , 0.75 ) ;
220+
221+ dynamicMap . set ( 'uno' , 1 ) ;
222+ assert . equal ( dynamicMap . buckets . length , 2 ) ;
223+ assert . equal ( dynamicMap . getLoadFactor ( ) , 1 / 2 ) ;
224+ console . log ( hashMap . collisions ) ;
225+
226+ dynamicMap . set ( 'dos' , 2 ) ;
227+ assert . equal ( dynamicMap . buckets . length , 4 ) ; // <-- rehash took place
228+ assert . equal ( dynamicMap . getLoadFactor ( ) , 1 / 2 ) ;
229+ console . log ( hashMap . collisions ) ;
230+
231+ dynamicMap . set ( 'tres' , 3 ) ;
232+ assert . equal ( dynamicMap . buckets . length , 4 ) ; // <-- no rehash
233+ assert . equal ( dynamicMap . getLoadFactor ( ) , 3 / 4 ) ;
234+ console . log ( hashMap . collisions ) ;
235+
236+ dynamicMap . set ( 'cuatro' , 4 ) ;
237+ assert . equal ( dynamicMap . buckets . length , 8 ) ; // <-- rehash took place
238+ assert . equal ( dynamicMap . getLoadFactor ( ) , 4 / 8 ) ;
239+ console . log ( hashMap . collisions ) ;
240+
241+ dynamicMap . set ( 'cinco' , 5 ) ;
242+ assert . equal ( dynamicMap . buckets . length , 8 ) ; // <-- no rehash
243+ assert . equal ( dynamicMap . getLoadFactor ( ) , 5 / 8 ) ;
244+ console . log ( hashMap . collisions ) ;
0 commit comments