Added doctest to hash_map.py (#11082)

* Added doctest to heap.py

* Added doctest to hash_map.py

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update hash_map.py

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
Suyash Dongre 2023-10-29 21:31:54 +05:30 committed by GitHub
parent 3ad90cea83
commit 67c85ee289
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -54,6 +54,14 @@ class HashMap(MutableMapping[KEY, VAL]):
Get next index. Get next index.
Implements linear open addressing. Implements linear open addressing.
>>> HashMap(5)._get_next_ind(3)
4
>>> HashMap(5)._get_next_ind(5)
1
>>> HashMap(5)._get_next_ind(6)
2
>>> HashMap(5)._get_next_ind(9)
0
""" """
return (ind + 1) % len(self._buckets) return (ind + 1) % len(self._buckets)
@ -82,6 +90,14 @@ class HashMap(MutableMapping[KEY, VAL]):
Return true if we have reached safe capacity. Return true if we have reached safe capacity.
So we need to increase the number of buckets to avoid collisions. So we need to increase the number of buckets to avoid collisions.
>>> hm = HashMap(2)
>>> hm._add_item(1, 10)
>>> hm._add_item(2, 20)
>>> hm._is_full()
True
>>> HashMap(2)._is_full()
False
""" """
limit = len(self._buckets) * self._capacity_factor limit = len(self._buckets) * self._capacity_factor
return len(self) >= int(limit) return len(self) >= int(limit)
@ -114,17 +130,104 @@ class HashMap(MutableMapping[KEY, VAL]):
ind = self._get_next_ind(ind) ind = self._get_next_ind(ind)
def _add_item(self, key: KEY, val: VAL) -> None: def _add_item(self, key: KEY, val: VAL) -> None:
"""
Try to add 3 elements when the size is 5
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm._add_item(2, 20)
>>> hm._add_item(3, 30)
>>> hm
HashMap(1: 10, 2: 20, 3: 30)
Try to add 3 elements when the size is 5
>>> hm = HashMap(5)
>>> hm._add_item(-5, 10)
>>> hm._add_item(6, 30)
>>> hm._add_item(-7, 20)
>>> hm
HashMap(-5: 10, 6: 30, -7: 20)
Try to add 3 elements when size is 1
>>> hm = HashMap(1)
>>> hm._add_item(10, 13.2)
>>> hm._add_item(6, 5.26)
>>> hm._add_item(7, 5.155)
>>> hm
HashMap(10: 13.2)
Trying to add an element with a key that is a floating point value
>>> hm = HashMap(5)
>>> hm._add_item(1.5, 10)
>>> hm
HashMap(1.5: 10)
5. Trying to add an item with the same key
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm._add_item(1, 20)
>>> hm
HashMap(1: 20)
"""
for ind in self._iterate_buckets(key): for ind in self._iterate_buckets(key):
if self._try_set(ind, key, val): if self._try_set(ind, key, val):
break break
def __setitem__(self, key: KEY, val: VAL) -> None: def __setitem__(self, key: KEY, val: VAL) -> None:
"""
1. Changing value of item whose key is present
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm.__setitem__(1, 20)
>>> hm
HashMap(1: 20)
2. Changing value of item whose key is not present
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm.__setitem__(0, 20)
>>> hm
HashMap(0: 20, 1: 10)
3. Changing the value of the same item multiple times
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm.__setitem__(1, 20)
>>> hm.__setitem__(1, 30)
>>> hm
HashMap(1: 30)
"""
if self._is_full(): if self._is_full():
self._size_up() self._size_up()
self._add_item(key, val) self._add_item(key, val)
def __delitem__(self, key: KEY) -> None: def __delitem__(self, key: KEY) -> None:
"""
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm._add_item(2, 20)
>>> hm._add_item(3, 30)
>>> hm.__delitem__(3)
>>> hm
HashMap(1: 10, 2: 20)
>>> hm = HashMap(5)
>>> hm._add_item(-5, 10)
>>> hm._add_item(6, 30)
>>> hm._add_item(-7, 20)
>>> hm.__delitem__(-5)
>>> hm
HashMap(6: 30, -7: 20)
# Trying to remove a non-existing item
>>> hm = HashMap(5)
>>> hm._add_item(1, 10)
>>> hm._add_item(2, 20)
>>> hm._add_item(3, 30)
>>> hm.__delitem__(4)
Traceback (most recent call last):
...
KeyError: 4
"""
for ind in self._iterate_buckets(key): for ind in self._iterate_buckets(key):
item = self._buckets[ind] item = self._buckets[ind]
if item is None: if item is None:
@ -156,7 +259,13 @@ class HashMap(MutableMapping[KEY, VAL]):
yield from (item.key for item in self._buckets if item) yield from (item.key for item in self._buckets if item)
def __repr__(self) -> str: def __repr__(self) -> str:
val_string = " ,".join( val_string = ", ".join(
f"{item.key}: {item.val}" for item in self._buckets if item f"{item.key}: {item.val}" for item in self._buckets if item
) )
return f"HashMap({val_string})" return f"HashMap({val_string})"
if __name__ == "__main__":
import doctest
doctest.testmod()