78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
import copy
|
|
|
|
|
|
class Node:
|
|
def __init__(self, key, value):
|
|
self.key = key
|
|
self.value = value
|
|
self.next = None
|
|
|
|
|
|
class HashTable:
|
|
def __init__(self):
|
|
self.capacity = 2
|
|
self.noOfElements = 0
|
|
self.elementList = [None] * 2
|
|
|
|
def hash(self, value):
|
|
if isinstance(value, int):
|
|
return value % self.capacity
|
|
|
|
sum = 0
|
|
for l in value:
|
|
sum += ord(l)
|
|
return sum % self.capacity
|
|
|
|
def insert(self, key, value):
|
|
if self.noOfElements and (self.capacity // self.noOfElements < 2):
|
|
self.resizeAndRehash()
|
|
hash_key = self.hash(key)
|
|
element = self.elementList[hash_key]
|
|
|
|
if element is None:
|
|
self.elementList[hash_key] = Node(key, value)
|
|
self.noOfElements += 1
|
|
return
|
|
|
|
while element.next is not None:
|
|
element = element.next
|
|
element.next = Node(key, value)
|
|
self.noOfElements += 1
|
|
|
|
def get(self, key):
|
|
element = self.elementList[self.hash(key)]
|
|
while element is not None:
|
|
if element.key == key:
|
|
return element.value
|
|
element = element.next
|
|
return None
|
|
|
|
def getPosition(self, key):
|
|
element = self.elementList[self.hash(key)]
|
|
position = 0
|
|
while element is not None:
|
|
if element.key == key:
|
|
return (key,position)
|
|
element = element.next
|
|
position += 1
|
|
return None
|
|
|
|
def resizeAndRehash(self):
|
|
self.capacity *= 2
|
|
|
|
copyElementList = copy.deepcopy(self.elementList)
|
|
self.elementList = [None] * self.capacity
|
|
self.noOfElements = 0
|
|
for element in copyElementList:
|
|
copyElement = copy.deepcopy(element)
|
|
while copyElement is not None:
|
|
self.insert(copyElement.key, copyElement.value)
|
|
copyElement = copyElement.next
|
|
|
|
def __str__(self):
|
|
var = ""
|
|
for element in self.elementList:
|
|
while element is not None:
|
|
var += f"{element.key} -> {element.value}\n"
|
|
element = element.next
|
|
return var |