We use separate chaining to handle collisions. We create a list of "buckets", where each bucket is a linked list (or simple list) of (key, value) pairs.
__init__: Createself.size = 1000andself.buckets = [[] for _ in range(self.size)]._hash(key): Returnkey % self.size.put(key, value):- Find bucket. Iterate through pairs. If key exists, update value and return.
- If not found, append
[key, value].
get(key):- Find bucket. Iterate. If key found, return value.
- Else return -1.
remove(key):- Find bucket. Iterate. If key exists,
poporremovefrom bucket.
- Find bucket. Iterate. If key exists,
- Time Complexity: O(N / K) average, where K is size (1000).
- Space Complexity: O(N + K).
class MyHashMap:
def __init__(self):
self.size = 1000
self.buckets = [[] for _ in range(self.size)]
def _hash(self, key):
return key % self.size
def put(self, key: int, value: int) -> None:
idx = self._hash(key)
for i, (k, v) in enumerate(self.buckets[idx]):
if k == key:
self.buckets[idx][i] = (key, value)
return
self.buckets[idx].append((key, value))
def get(self, key: int) -> int:
idx = self._hash(key)
for k, v in self.buckets[idx]:
if k == key:
return v
return -1
def remove(self, key: int) -> None:
idx = self._hash(key)
for i, (k, v) in enumerate(self.buckets[idx]):
if k == key:
self.buckets[idx].pop(i)
return