From c6e0d0c63b2cab667f815a5c85f5399548058381 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 9 Jul 2018 17:53:56 +1000 Subject: [PATCH] now with collision handling --- python/app/hash_table.py | 25 +++++++++++++++++++++++-- python/tests/test_hash_table.py | 19 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/python/app/hash_table.py b/python/app/hash_table.py index b3956a0..c9675e0 100644 --- a/python/app/hash_table.py +++ b/python/app/hash_table.py @@ -5,10 +5,31 @@ def __init__(self, size=100): self.values = self.size * [None] def get(self, x): - return self.values[self.h(x)] + if not x: + raise ValueError('Invalid key') + + i = self.h(x) + result = None + + if self.values[i]: + pair = [p[1] for p in self.values[i] if p[0] == x] + if pair: + result = pair[0] + + return result def set(self, x, y): - self.values[self.h(x)] = y + """Uses separate chaining for collsions + """ + if not x: + raise ValueError('Invalid key') + + i = self.h(x) + + if not self.values[i]: + self.values[i] = [] + + self.values[i].append([x, y]) def h(self, x): return hash(x) % self.size diff --git a/python/tests/test_hash_table.py b/python/tests/test_hash_table.py index 724e19c..aaaf453 100644 --- a/python/tests/test_hash_table.py +++ b/python/tests/test_hash_table.py @@ -1,3 +1,4 @@ +import pytest from app.hash_table import HashTable @@ -6,3 +7,21 @@ def test_get_set(): ht.set('test', 1) assert ht.get('test') == 1 assert ht.get('invalid') is None + + +def test_invalid_key(): + ht = HashTable() + with pytest.raises(ValueError): + ht.set(None, 1) + + with pytest.raises(ValueError): + ht.get(None) + + +def test_collisions(): + ht = HashTable(1) + ht.set('test', 1) + ht.set('test2', 2) + assert ht.get('test') == 1 + assert ht.get('test2') == 2 + assert ht.get('test3') is None