As a hash map fills up, buckets get long and lookups slow down. The fix is to grow the table once the load factor (size divided by num_buckets) passes a threshold.
put already calls self._resize() once the load factor exceeds 0.75. Your job is to implement _resize: save the current buckets, double num_buckets, rebuild an empty list of buckets, reset size to 0, and re-insert every existing pair with put so each lands in its new bucket.
class HashMap:
def __init__(self, num_buckets=8):
self.num_buckets = num_buckets
self.buckets = [[] for _ in range(num_buckets)]
self.size = 0
def _hash(self, key):
h = 0
for ch in str(key):
h = (h * 31 + ord(ch)) & 0xffffffff
return h
def _bucket(self, key):
return self.buckets[self._hash(key) % self.num_buckets]
def put(self, key, value):
bucket = self._bucket(key)
for i, (k, v) in enumerate(bucket):
if k == key:
bucket[i] = (key, value)
return
bucket.append((key, value))
self.size += 1
if self.size / self.num_buckets > 0.75:
self._resize()
def _resize(self):
"""Double num_buckets and re-insert every existing entry."""
# TODO: save old buckets, double num_buckets, rebuild empty buckets,
# reset self.size to 0, then put() every (k, v) from the old buckets
pass
def get(self, key):
for k, v in self._bucket(key):
if k == key:
return v
return None
def delete(self, key):
bucket = self._bucket(key)
for i, (k, v) in enumerate(bucket):
if k == key:
del bucket[i]
self.size -= 1
return
def __len__(self):
return self.sizeThe editor and the test runner need a wide screen. Open this page on a desktop browser and your progress will be waiting.
As a hash map fills up, buckets get long and lookups slow down. The fix is to grow the table once the load factor (size divided by num_buckets) passes a threshold.
put already calls self._resize() once the load factor exceeds 0.75. Your job is to implement _resize: save the current buckets, double num_buckets, rebuild an empty list of buckets, reset size to 0, and re-insert every existing pair with put so each lands in its new bucket.
Press Run Tests or ββ© to check your solution.