Module dsa.hashtable

Module containing hash table class.

Classes

class HashTable (capacity=20)

A hashtable implementation.

Initialize a hashtable with a given capacity.

Args

capacity
The capacity of the hashtable.
Expand source code
class HashTable:
    """ 
    A hashtable implementation. 
    """
    def __init__(self, capacity=20):
        """
        Initialize a hashtable with a given capacity.

        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: str) -> 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.
        """
        mult = 31
        hash_val = 0
        for character in key:
            hash_val *= mult
            hash_val += ord(character)
            hash_val %= (2**32)

        return hash_val % self.capacity
        
    def key_exists(self, key: str) -> 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)
        
        for e in self.array[bucket]:
            if e[0] == key:
                return True
        return False

    def set(self, key: str, value):
        """ 
        Set a key-value pair in the hashtable.

        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: str):
        """ 
        Get corresponding value of a given key in the hash table.

        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: str):
        """ 
        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):
        """
        Return a string representation of the hashtable.
        """
        s = "{"
        pairs = []
        for bucket in self.array:
            if bucket:
                for chain_link in bucket:
                    pairs.append(f"{chain_link[0]}:{chain_link[1]}")
        s += ", ".join(pairs)
        return s + "}"

    def show_buckets(self):
        """
        Return a string displaying the contents of all buckets in the hashtable.
        """
        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: str)

Delete key-value pair if specified key is found.

Args

key
The key to check for.
def get(self, key: str)

Get corresponding value of a given key in the hash table.

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: str) ‑> 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: str) ‑> 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: str, value)

Set a key-value pair in the hashtable.

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.
def show_buckets(self)

Return a string displaying the contents of all buckets in the hashtable.