diff --git a/.gitignore b/.gitignore
index ed8ebf583..4341d1cd0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-__pycache__
\ No newline at end of file
+__pycache__
+/Pipfile
+/Pipfile.lock
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 000000000..e7e9d11d4
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
diff --git a/.idea/Hash-Tables.iml b/.idea/Hash-Tables.iml
new file mode 100644
index 000000000..01c5eb368
--- /dev/null
+++ b/.idea/Hash-Tables.iml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 000000000..105ce2da2
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 000000000..dc841e568
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 000000000..f61a7ebb3
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 000000000..94a25f7f4
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dynamic_array/dynamic_array.py b/dynamic_array/dynamic_array.py
new file mode 100644
index 000000000..af3f2f835
--- /dev/null
+++ b/dynamic_array/dynamic_array.py
@@ -0,0 +1,46 @@
+class DynamicArray:
+ def __init__(self, capacity=8):
+ self.count = 0
+ self.capacity = capacity
+ self.storage = [None] * self.capacity
+
+ def insert(self, index, value):
+ if self.count == self.capacity:
+ # increase size
+ print("ERROR:, Array is full")
+ return
+
+ if index >= self.count:
+ print('Error: Index out of bounds')
+ return
+
+ for i in range(self.count, index -1):
+ self.storage[i] = self.storage[i-1]
+
+ self.storage[index] = value
+ self.count += 1
+
+ def append(self, value):
+ if self.count == self.capacity:
+ # increase size
+ print("ERROR:, Array is full")
+ return
+
+ # self.count += 1
+ # # account for zero index... - 1
+ # self.storage[self.count - 1] = value
+ #
+ # same as above
+ self.storage[self.count] = value
+ self.count += 1
+
+ # Double the size
+ def double_size(self):
+ self.capacity *= 2
+ new_storage = [None] * self.capacity
+
+ for i in range(self.count):
+ new_storage[i] = self.storage[i]
+
+ # change pointer
+ self.storage = new_storage
diff --git a/hashes/hashes.py b/hashes/hashes.py
new file mode 100644
index 000000000..9cce23eb9
--- /dev/null
+++ b/hashes/hashes.py
@@ -0,0 +1,14 @@
+import hashlib
+
+# b string - bytes string - strips away -- .encode() works too
+key = b"str"
+my_string = "normal string"
+
+for i in range (10):
+ hashed = hashlib.sha256(key).hexdigest()
+ print(hashed)
+
+
+# for i in range(10):
+# hashed = hash(key)
+# print(hashed % 8)??????
diff --git a/hashes1/hashesClass.py b/hashes1/hashesClass.py
new file mode 100644
index 000000000..a7c427c18
--- /dev/null
+++ b/hashes1/hashesClass.py
@@ -0,0 +1,14 @@
+import hashlib
+
+# b string - bytes string - strips away -- .encode() works too
+key = b"str"
+my_string = "normal string".encode()
+
+# for i in range (10):
+# hashed = hashlib.sha256(key).hexdigest()
+# print(hashed)
+
+
+for i in range(10):
+ hashed = hash(key)
+ print(hashed % 8)
diff --git a/src/collisions.py b/src/collisions.py
new file mode 100644
index 000000000..3ca459fd5
--- /dev/null
+++ b/src/collisions.py
@@ -0,0 +1,42 @@
+
+
+import random
+
+
+def how_many_before_collision(buckets, loops=1):
+ for i in range(loops):
+ tries = 0
+ tried = set()
+ while True:
+ random_key = str(random.random())
+ hash_index = hash(random_key) % buckets
+ if hash_index not in tried:
+ tried.add(hash_index)
+ tries += 1
+
+ else:
+ break
+
+ print(f"{buckets} buckets, {tries} hashes before collision. ({tries / buckets * 100:.1f})")
+
+how_many_before_collision(32, 10)
+
+
+def longest_linked_list_chain(keys, buckets, loops=10):
+ for i in range(loops):
+ key_counts = {}
+
+ for i in range(buckets):
+ key_counts[i] = 0
+
+ for i in range(keys):
+ random_key = str(random.random())
+ hash_index = hash(random_key) % buckets
+ key_counts[hash_index] += 1
+
+ largest_number = 0
+ for key in key_counts:
+ if key_counts[key] > largest_number:
+ largest_number = key
+
+ print(f"Longest linked list chain for {keys} keys in {buckets}(Load Factor: {keys/ buckets:2f}: {largest_number}")
\ No newline at end of file
diff --git a/src/hashtable.py b/src/hashtable.py
index a68c6ea1c..ebb6773cb 100644
--- a/src/hashtable.py
+++ b/src/hashtable.py
@@ -1,6 +1,9 @@
# '''
# Linked List hash table key/value pair
# '''
+
+from dynamic_array import dynamic_array
+
class LinkedPair:
def __init__(self, key, value):
self.key = key
@@ -16,15 +19,18 @@ def __init__(self, capacity):
self.capacity = capacity # Number of buckets in the hash table
self.storage = [None] * capacity
-
+ # _ means private function, should not be used outside of class, but you can
def _hash(self, key):
'''
Hash an arbitrary key and return an integer.
You may replace the Python hash with DJB2 as a stretch goal.
'''
- return hash(key)
+ x = hash(key)
+ print('x', x)
+ return x
+ # _hash(3,'8')
def _hash_djb2(self, key):
'''
@@ -43,6 +49,18 @@ def _hash_mod(self, key):
return self._hash(key) % self.capacity
+ # if self.capacity is not FULL:
+ # if self.capacity:
+ # current_next = self.next
+ # self.next = LinkedPair(value, self, current_next)
+ # else:
+ # self.key = key
+ # print('k',self.key)
+ # self.value = value
+ # print('v',self.value)
+ #
+ # print(insert(3, 3, 5))
+
def insert(self, key, value):
'''
Store the value with the given key.
@@ -51,9 +69,16 @@ def insert(self, key, value):
Fill this in.
'''
- pass
+ index = self._hash_mod(key)
+
+ if self.storage[index] is not None:
+ print(f"WARNING: Collusion has occured at {index}")
+
+ else:
+ self.storage[index] = (key, value)
+ return
def remove(self, key):
'''
@@ -63,8 +88,18 @@ def remove(self, key):
Fill this in.
'''
- pass
+ index = self._hash_mod(key)
+
+ if self.storage[index] is not None:
+ if self.storage[index][0] == key:
+ self.storage[index] = None
+ else:
+ print(f"WARNING: Collusion has occured at {index}")
+ else:
+ print(f"Warning key ({key}) not found")
+
+ return
def retrieve(self, key):
'''
@@ -74,8 +109,18 @@ def retrieve(self, key):
Fill this in.
'''
- pass
+ index = self._hash_mod(key)
+ if self.storage[index] is not None:
+ if self.storage[index][0] == key:
+ return self.storage[index][1]
+ else:
+ print(f"WARNING: Collusion has occured at {index}")
+
+ else:
+ return None
+
+ return
def resize(self):
'''
@@ -84,8 +129,12 @@ def resize(self):
Fill this in.
'''
- pass
+ old_storage = self.storage
+ self.capacity *= 2
+ self.storage = [None] * self.capacity
+ for item in old_storage:
+ self.insert(item[0], item[1])
if __name__ == "__main__":
diff --git a/src/test_hashtable.py b/src/test_hashtable.py
index b5a4d8194..d089d8295 100644
--- a/src/test_hashtable.py
+++ b/src/test_hashtable.py
@@ -87,110 +87,116 @@ def test_hash_table_insertion_overwrites_correctly(self):
self.assertTrue(return_value == "new-val-9")
def test_hash_table_removes_correctly(self):
- ht = HashTable(8)
-
- ht.insert("key-0", "val-0")
- ht.insert("key-1", "val-1")
- ht.insert("key-2", "val-2")
- ht.insert("key-3", "val-3")
- ht.insert("key-4", "val-4")
- ht.insert("key-5", "val-5")
- ht.insert("key-6", "val-6")
- ht.insert("key-7", "val-7")
- ht.insert("key-8", "val-8")
- ht.insert("key-9", "val-9")
-
- return_value = ht.retrieve("key-0")
- self.assertTrue(return_value == "val-0")
- return_value = ht.retrieve("key-1")
- self.assertTrue(return_value == "val-1")
- return_value = ht.retrieve("key-2")
- self.assertTrue(return_value == "val-2")
- return_value = ht.retrieve("key-3")
- self.assertTrue(return_value == "val-3")
- return_value = ht.retrieve("key-4")
- self.assertTrue(return_value == "val-4")
- return_value = ht.retrieve("key-5")
- self.assertTrue(return_value == "val-5")
- return_value = ht.retrieve("key-6")
- self.assertTrue(return_value == "val-6")
- return_value = ht.retrieve("key-7")
- self.assertTrue(return_value == "val-7")
- return_value = ht.retrieve("key-8")
- self.assertTrue(return_value == "val-8")
- return_value = ht.retrieve("key-9")
- self.assertTrue(return_value == "val-9")
-
- ht.remove("key-9")
- ht.remove("key-8")
- ht.remove("key-7")
- ht.remove("key-6")
- ht.remove("key-5")
- ht.remove("key-4")
- ht.remove("key-3")
- ht.remove("key-2")
- ht.remove("key-1")
- ht.remove("key-0")
-
- return_value = ht.retrieve("key-0")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-1")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-2")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-3")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-4")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-5")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-6")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-7")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-8")
- self.assertTrue(return_value is None)
- return_value = ht.retrieve("key-9")
- self.assertTrue(return_value is None)
-
- def test_hash_table_resize(self):
- ht = HashTable(8)
-
- ht.insert("key-0", "val-0")
- ht.insert("key-1", "val-1")
- ht.insert("key-2", "val-2")
- ht.insert("key-3", "val-3")
- ht.insert("key-4", "val-4")
- ht.insert("key-5", "val-5")
- ht.insert("key-6", "val-6")
- ht.insert("key-7", "val-7")
- ht.insert("key-8", "val-8")
- ht.insert("key-9", "val-9")
-
- ht.resize()
-
- self.assertTrue(len(ht.storage) == 16)
-
- return_value = ht.retrieve("key-0")
- self.assertTrue(return_value == "val-0")
- return_value = ht.retrieve("key-1")
- self.assertTrue(return_value == "val-1")
- return_value = ht.retrieve("key-2")
- self.assertTrue(return_value == "val-2")
- return_value = ht.retrieve("key-3")
- self.assertTrue(return_value == "val-3")
- return_value = ht.retrieve("key-4")
- self.assertTrue(return_value == "val-4")
- return_value = ht.retrieve("key-5")
- self.assertTrue(return_value == "val-5")
- return_value = ht.retrieve("key-6")
- self.assertTrue(return_value == "val-6")
- return_value = ht.retrieve("key-7")
- self.assertTrue(return_value == "val-7")
- return_value = ht.retrieve("key-8")
- self.assertTrue(return_value == "val-8")
- return_value = ht.retrieve("key-9")
- self.assertTrue(return_value == "val-9")
+ ht1 = HashTable(8)
+
+ ht1.insert("key1","Hello")
+ ht1.insert("key2", "goodbybe")
+ ht1.remove("key1")
+
+ print(ht1.storage)
+ #
+ # ht.insert("key-0", "val-0")
+ # ht.insert("key-1", "val-1")
+ # ht.insert("key-2", "val-2")
+ # ht.insert("key-3", "val-3")
+ # ht.insert("key-4", "val-4")
+ # ht.insert("key-5", "val-5")
+ # ht.insert("key-6", "val-6")
+ # ht.insert("key-7", "val-7")
+ # ht.insert("key-8", "val-8")
+ # ht.insert("key-9", "val-9")
+ #
+ # return_value = ht.retrieve("key-0")
+ # self.assertTrue(return_value == "val-0")
+ # return_value = ht.retrieve("key-1")
+ # self.assertTrue(return_value == "val-1")
+ # return_value = ht.retrieve("key-2")
+ # self.assertTrue(return_value == "val-2")
+ # return_value = ht.retrieve("key-3")
+ # self.assertTrue(return_value == "val-3")
+ # return_value = ht.retrieve("key-4")
+ # self.assertTrue(return_value == "val-4")
+ # return_value = ht.retrieve("key-5")
+ # self.assertTrue(return_value == "val-5")
+ # return_value = ht.retrieve("key-6")
+ # self.assertTrue(return_value == "val-6")
+ # return_value = ht.retrieve("key-7")
+ # self.assertTrue(return_value == "val-7")
+ # return_value = ht.retrieve("key-8")
+ # self.assertTrue(return_value == "val-8")
+ # return_value = ht.retrieve("key-9")
+ # self.assertTrue(return_value == "val-9")
+ #
+ # ht.remove("key-9")
+ # ht.remove("key-8")
+ # ht.remove("key-7")
+ # ht.remove("key-6")
+ # ht.remove("key-5")
+ # ht.remove("key-4")
+ # ht.remove("key-3")
+ # ht.remove("key-2")
+ # ht.remove("key-1")
+ # ht.remove("key-0")
+ #
+ # return_value = ht.retrieve("key-0")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-1")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-2")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-3")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-4")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-5")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-6")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-7")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-8")
+ # self.assertTrue(return_value is None)
+ # return_value = ht.retrieve("key-9")
+ # self.assertTrue(return_value is None)
+ #
+ # def test_hash_table_resize(self):
+ # ht = HashTable(8)
+ #
+ # ht.insert("key-0", "val-0")
+ # ht.insert("key-1", "val-1")
+ # ht.insert("key-2", "val-2")
+ # ht.insert("key-3", "val-3")
+ # ht.insert("key-4", "val-4")
+ # ht.insert("key-5", "val-5")
+ # ht.insert("key-6", "val-6")
+ # ht.insert("key-7", "val-7")
+ # ht.insert("key-8", "val-8")
+ # ht.insert("key-9", "val-9")
+ #
+ # ht.resize()
+ #
+ # self.assertTrue(len(ht.storage) == 16)
+ #
+ # return_value = ht.retrieve("key-0")
+ # self.assertTrue(return_value == "val-0")
+ # return_value = ht.retrieve("key-1")
+ # self.assertTrue(return_value == "val-1")
+ # return_value = ht.retrieve("key-2")
+ # self.assertTrue(return_value == "val-2")
+ # return_value = ht.retrieve("key-3")
+ # self.assertTrue(return_value == "val-3")
+ # return_value = ht.retrieve("key-4")
+ # self.assertTrue(return_value == "val-4")
+ # return_value = ht.retrieve("key-5")
+ # self.assertTrue(return_value == "val-5")
+ # return_value = ht.retrieve("key-6")
+ # self.assertTrue(return_value == "val-6")
+ # return_value = ht.retrieve("key-7")
+ # self.assertTrue(return_value == "val-7")
+ # return_value = ht.retrieve("key-8")
+ # self.assertTrue(return_value == "val-8")
+ # return_value = ht.retrieve("key-9")
+ # self.assertTrue(return_value == "val-9")
if __name__ == '__main__':