mirror of
https://github.com/jlengrand/Coding4Interviews.git
synced 2026-03-10 08:11:24 +00:00
Tests add with collisions
This commit is contained in:
@@ -24,9 +24,7 @@ class HashMap():
|
|||||||
self._size += 1
|
self._size += 1
|
||||||
else:
|
else:
|
||||||
raise Exception("Collision detected at index %d", key)
|
raise Exception("Collision detected at index %d", key)
|
||||||
|
|
||||||
# TODO: Keep implementing
|
|
||||||
|
|
||||||
def get(self, key):
|
def get(self, key):
|
||||||
"""
|
"""
|
||||||
Finds the element in the hash table that may contain the id for
|
Finds the element in the hash table that may contain the id for
|
||||||
@@ -63,16 +61,48 @@ class HMTableCollision(HashMap):
|
|||||||
each index will contain a list. This means several elements can be
|
each index will contain a list. This means several elements can be
|
||||||
stored with the same index.
|
stored with the same index.
|
||||||
"""
|
"""
|
||||||
|
def __init__(self, hash_size=513):
|
||||||
|
self._hash_size = hash_size
|
||||||
|
self._size = 0
|
||||||
|
self.hmap = [None] * self._hash_size
|
||||||
|
|
||||||
def add(self, key, value):
|
def add(self, key, value):
|
||||||
"""
|
"""
|
||||||
Adds the provided value to the hashmap.
|
Adds the provided value to the hashmap.
|
||||||
Raises an Exception if a collision is detected
|
Raises an Exception if a collision is detected
|
||||||
"""
|
"""
|
||||||
my_key = self._hash(key)
|
my_key = self._hash(key)
|
||||||
|
|
||||||
|
if self.hmap[my_key] == None:
|
||||||
|
self.hmap[my_key] = [value]
|
||||||
|
else:
|
||||||
|
self.hmap[my_key].append(value)
|
||||||
|
self._size += 1
|
||||||
|
|
||||||
|
def get(self, key):
|
||||||
|
"""
|
||||||
|
Finds the element in the hash table that may contain the id for
|
||||||
|
the string we are looking for
|
||||||
|
"""
|
||||||
|
my_key = self._hash(key)
|
||||||
|
return self.hmap[my_key]
|
||||||
|
|
||||||
|
def size(self):
|
||||||
|
return self._size
|
||||||
|
|
||||||
|
def _hash(self, value):
|
||||||
|
"""
|
||||||
|
Generates a hash for the given value.
|
||||||
|
The input is expected to be a String, with only ASCII characters.
|
||||||
|
|
||||||
|
# hash function taken from HT3.
|
||||||
|
# We shift and add : << 4 is a *16
|
||||||
|
"""
|
||||||
|
if len(value) < 1:
|
||||||
|
raise Exception("Size of value must be greater than one")
|
||||||
|
|
||||||
|
h = 0
|
||||||
|
for letter in value:
|
||||||
|
h = (h << 4) + ord(letter)
|
||||||
|
|
||||||
|
return h % self._hash_size
|
||||||
if self.hmap[my_key] == None:
|
|
||||||
self.hmap[my_key] = value
|
|
||||||
self._size += 1
|
|
||||||
else:
|
|
||||||
raise Exception("Collision detected at index %d", key)
|
|
||||||
|
|||||||
@@ -10,16 +10,15 @@ from hm import HMTableCollision
|
|||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
class test_hash_map_table_collision(unittest.TestCase):
|
class test_hash_map_table_collision(unittest.TestCase):
|
||||||
|
|
||||||
def test_add(self):
|
def test_add(self):
|
||||||
hm = HMTableCollision()
|
hm = HMTableCollision()
|
||||||
|
|
||||||
hm.add("a", "Ibiza")
|
hm.add("a", "Ibiza")
|
||||||
self.assertEqual(hm.size(), 1)
|
self.assertEqual(hm.size(), 1)
|
||||||
|
|
||||||
# Tests Collision
|
hm.add("a", "Ibiza")
|
||||||
self.assertRaises(Exception, lambda x : hm.add("a", "Ibiza"))
|
self.assertEqual(hm.size(), 2)
|
||||||
self.assertEqual(hm.size(), 1)
|
|
||||||
|
|
||||||
class test_hash_map(unittest.TestCase):
|
class test_hash_map(unittest.TestCase):
|
||||||
|
|
||||||
@@ -47,6 +46,7 @@ class test_hash_map(unittest.TestCase):
|
|||||||
value = ""
|
value = ""
|
||||||
self.assertRaises(Exception, lambda x : hm._hash(value))
|
self.assertRaises(Exception, lambda x : hm._hash(value))
|
||||||
|
|
||||||
|
|
||||||
def test_add(self):
|
def test_add(self):
|
||||||
hm = HashMap()
|
hm = HashMap()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user