Module dsa.hashtable

Module containing hash table class.

Classes

class HashTable (capacity=20)

A hashtable implementation.

Args

capacity
the capacity of the hashtable
Expand source code
class HashTable:
    """ 
    A hashtable implementation. 
    """
    def __init__(self, capacity=20):
        """
        Args:
            capacity: the capacity of the hashtable
        """
        self.capacity = capacity

        self.array = []
        for _ in range(self.capacity):
            self.array.append([])

        #: the number of items in the hashtable
        self.count = 0
        
    def hash_function(self, key) -> int:
        """ 
        Return a hash value based on a given key. 

        Args:
            key: the key to convert to a hashvalue
        Returns:
        hash value modded to the hashtable capacity
        """
        charsum = sum(ord(c) * i for i, c in enumerate(key, 1))
        return charsum % self.capacity      
        
    def key_exists(self, key) -> bool:
        """ 
        Returns a Boolean on whether a key exists in the hashtable or not 

        Args:
            key: the key to check for in the hashtable
        Returns:
        Boolean of key existence
        """
        bucket = self.hash_function(key)
        if self.array[bucket] is None:
            return False
        
        for e in self.array[bucket]:
            if e[0] == key:
                return True
        return False

    def set(self, key, value):
        """ 
        if key exists, replace the value 
        otherwise, create a new key-pair
        Args:
            key: the key to check for
            value: the value to set or create
        """

        bucket = self.hash_function(key)

        # linear searh for key 
        for e in self.array[bucket]:
            if e[0] == key:
                e[1] = value
                break
        else:
            self.array[bucket].append([ key, value ])
            self.count += 1

    def get(self, key):
        """ 
        get corresponding value of key

        Args:
            key: the key to check for
            value: the value to set or create
        Returns:
        corresponding value of key
        None if key is not found
        """
        bucket = self.hash_function(key)

        for e in self.array[bucket]:
            if e[0] == key:
                return e[1]

        return None

    def delete(self, key):
        """ 
        Delete key-value pair if specified key is found 

        Args:
            key: the key to check for
        """
        bucket = self.hash_function(key)

        for i in range(len(self.array[bucket])):
            kvpair = self.array[bucket][i]
            if kvpair and kvpair[0] == key:
                del self.array[bucket][i]
                self.count -= 1
                break
    
    def __repr__(self):
        s = ""
        for i, bucket in enumerate(self.array):
            s += f"Bucket {i}: {bucket}\n"
        return s

Instance variables

var count

the number of items in the hashtable

Methods

def delete(self, key)

Delete key-value pair if specified key is found

Args

key
the key to check for
def get(self, key)

get corresponding value of key

Args

key
the key to check for
value
the value to set or create

Returns: corresponding value of key None if key is not found

def hash_function(self, key) ‑> int

Return a hash value based on a given key.

Args

key
the key to convert to a hashvalue

Returns: hash value modded to the hashtable capacity

def key_exists(self, key) ‑> bool

Returns a Boolean on whether a key exists in the hashtable or not

Args

key
the key to check for in the hashtable

Returns: Boolean of key existence

def set(self, key, value)

if key exists, replace the value otherwise, create a new key-pair

Args

key
the key to check for
value
the value to set or create