mirror of
https://codeberg.org/andyscott/HashMaps.git
synced 2024-12-21 12:33:10 -05:00
All remaining methods implemented
This commit is contained in:
parent
1dba75f273
commit
0cccf1873c
1 changed files with 44 additions and 20 deletions
|
@ -62,14 +62,10 @@ class HashMap:
|
||||||
Value to add, or update if the key is already present
|
Value to add, or update if the key is already present
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# remember, if the load factor is greater than or equal to 0.5,
|
# resize if necessary
|
||||||
# resize the table before putting the new key/value pair
|
|
||||||
|
|
||||||
if self.table_load() >= 0.5:
|
if self.table_load() >= 0.5:
|
||||||
self.resize_table(self._capacity * 2)
|
self.resize_table(self._capacity * 2)
|
||||||
|
# calculate proper index and add/update HashEntry
|
||||||
|
|
||||||
|
|
||||||
hash = self._hash_function(key)
|
hash = self._hash_function(key)
|
||||||
initial_index = hash % self._capacity
|
initial_index = hash % self._capacity
|
||||||
is_placed = False
|
is_placed = False
|
||||||
|
@ -84,6 +80,7 @@ class HashMap:
|
||||||
self._buckets[index].key = key
|
self._buckets[index].key = key
|
||||||
self._buckets[index].value = value
|
self._buckets[index].value = value
|
||||||
self._buckets[index].is_tombstone = False
|
self._buckets[index].is_tombstone = False
|
||||||
|
self._size += 1
|
||||||
is_placed = True
|
is_placed = True
|
||||||
elif self._buckets[index].key == key:
|
elif self._buckets[index].key == key:
|
||||||
self._buckets[index].value = value
|
self._buckets[index].value = value
|
||||||
|
@ -119,7 +116,6 @@ class HashMap:
|
||||||
count += 1
|
count += 1
|
||||||
return count
|
return count
|
||||||
|
|
||||||
|
|
||||||
def resize_table(self, new_capacity: int) -> None:
|
def resize_table(self, new_capacity: int) -> None:
|
||||||
"""Changes the capacity of the hash table
|
"""Changes the capacity of the hash table
|
||||||
|
|
||||||
|
@ -132,7 +128,7 @@ class HashMap:
|
||||||
New capacity for the hash table
|
New capacity for the hash table
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# immediately return if new_capacity is less than 1
|
# immediately return if new_capacity is invalid
|
||||||
if new_capacity < 1 or new_capacity < self._size:
|
if new_capacity < 1 or new_capacity < self._size:
|
||||||
return
|
return
|
||||||
# create new hash table
|
# create new hash table
|
||||||
|
@ -161,9 +157,19 @@ class HashMap:
|
||||||
The value associated with the key if it exists, otherwise None
|
The value associated with the key if it exists, otherwise None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for i in range(self._capacity):
|
hash = self._hash_function(key)
|
||||||
if self._buckets[i] is not None and self._buckets[i].key == key:
|
initial_index = hash % self._capacity
|
||||||
return self._buckets[i].value
|
index = initial_index
|
||||||
|
quadratic_factor = 0
|
||||||
|
while self._buckets[index] is not None:
|
||||||
|
if (
|
||||||
|
self._buckets[index].key == key
|
||||||
|
and not self._buckets[index].is_tombstone
|
||||||
|
):
|
||||||
|
return self._buckets[index].value
|
||||||
|
else:
|
||||||
|
quadratic_factor += 1
|
||||||
|
index = (initial_index + quadratic_factor**2) % self._capacity
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def contains_key(self, key: str) -> bool:
|
def contains_key(self, key: str) -> bool:
|
||||||
|
@ -180,9 +186,16 @@ class HashMap:
|
||||||
True if the key is in the hash map, otherwise False
|
True if the key is in the hash map, otherwise False
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for i in range(self._capacity):
|
hash = self._hash_function(key)
|
||||||
if self._buckets[i] is not None and self._buckets[i].key == key:
|
initial_index = hash % self._capacity
|
||||||
|
index = initial_index
|
||||||
|
quadratic_factor = 0
|
||||||
|
while self._buckets[index] is not None:
|
||||||
|
if self._buckets[index].key == key:
|
||||||
return True
|
return True
|
||||||
|
else:
|
||||||
|
quadratic_factor += 1
|
||||||
|
index = (initial_index + quadratic_factor**2) % self._capacity
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def remove(self, key: str) -> None:
|
def remove(self, key: str) -> None:
|
||||||
|
@ -194,10 +207,21 @@ class HashMap:
|
||||||
Key to look up in the hash map
|
Key to look up in the hash map
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for i in range(self._capacity):
|
hash = self._hash_function(key)
|
||||||
if self._buckets[i] is not None and self._buckets[i].key == key:
|
initial_index = hash % self._capacity
|
||||||
self._buckets[i].is_tombstone = True
|
index = initial_index
|
||||||
|
quadratic_factor = 0
|
||||||
|
while self._buckets[index] is not None:
|
||||||
|
if (
|
||||||
|
self._buckets[index].key == key
|
||||||
|
and not self._buckets[index].is_tombstone
|
||||||
|
):
|
||||||
|
self._buckets[index].is_tombstone = True
|
||||||
self._size -= 1
|
self._size -= 1
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
quadratic_factor += 1
|
||||||
|
index = (initial_index + quadratic_factor**2) % self._capacity
|
||||||
|
|
||||||
def clear(self) -> None:
|
def clear(self) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -206,8 +230,7 @@ class HashMap:
|
||||||
|
|
||||||
self._buckets = DynamicArray()
|
self._buckets = DynamicArray()
|
||||||
self._size = 0
|
self._size = 0
|
||||||
self._capacity = self._buckets.length()
|
for i in range(self._capacity):
|
||||||
for i in range(self._buckets.length()):
|
|
||||||
self._buckets.append(None)
|
self._buckets.append(None)
|
||||||
|
|
||||||
def get_keys(self) -> DynamicArray:
|
def get_keys(self) -> DynamicArray:
|
||||||
|
@ -219,10 +242,11 @@ class HashMap:
|
||||||
Array containing the hash maps keys
|
Array containing the hash maps keys
|
||||||
"""
|
"""
|
||||||
|
|
||||||
keys = DynamicArray
|
keys = DynamicArray()
|
||||||
for i in range(self._capacity):
|
for i in range(self._capacity):
|
||||||
if self._buckets[i] is not None:
|
if self._buckets[i] is not None and not self._buckets[i].is_tombstone:
|
||||||
keys.append(self._buckets[i].key)
|
keys.append(self._buckets[i].key)
|
||||||
|
return keys
|
||||||
|
|
||||||
|
|
||||||
# ------------------- BASIC TESTING ---------------------------------------- #
|
# ------------------- BASIC TESTING ---------------------------------------- #
|
||||||
|
|
Loading…
Reference in a new issue