avp26/u7/hash_table.py
2026-10-29 21:38:52 +01:00

89 lines
2.7 KiB
Python

"""Hash tabuľka s lineárnym sondovaním a reťazcovými kľúčmi."""
from operator import index
from unittest import result
class HashTable:
def __init__(self, capacity=10):
"""Vytvor prázdnu tabuľku s kladnou celočíselnou kapacitou."""
if not isinstance(capacity, int) or capacity <= 0:
raise ValueError("kapacita ma byt + a cela")
self.empty = object()
self.deleted = object()
self._capacity = capacity
self.size = 0
self.table = []
for i in range(capacity):
self.table.append(self.empty)
@property
def capacity(self):
"""Vráť aktuálny počet pozícií v poli."""
return self._capacity
def hash(self, key):
"""Vráť polynomiálny hash kľúča modulo aktuálna kapacita."""
if not isinstance(key, str):
raise TypeError("kluc ma byt retaz")
result = 0
for char in str(key):
result = result * 31 + ord(char)
return result % self.capacity
def probe(self, key):
"""Vráť index kľúča alebo miesta na vloženie bez zmeny tabuľky."""
if not isinstance(key, str):
raise TypeError("kluc ma byt retaz")
i = 0
del_slot = None
while i < self.capacity:
index = (self.hash(key) + i) % self.capacity
if self.table[index] is self.empty:
if del_slot is None:
return index
else:
return del_slot
elif self.table[index] is self.deleted:
if del_slot is None:
del_slot = index
elif self.table[index][0] == key:
return index
i += 1
raise KeyError(key)
def load_factor(self):
"""Vráť podiel počtu aktívnych položiek a kapacity."""
return self.size / self.capacity if self._capacity > 0 else 0
def __getitem__(self, key):
index = self.probe(key)
return self.table[index][1]
def __setitem__(self, key, value):
index = self.probe(key)
if self.table[index] is self.empty:
self.size += 1
self.table[index] = (key, value)
def __delitem__(self, key):
index = self.probe(key)
if self.table[index] is not self.empty:
self.table[index] = self.deleted
self.size -= 1
def __contains__(self, key):
try:
self.probe(key)
return True
except KeyError:
return False
def __len__(self):
return self.size
def __iter__(self):
for bucket in self.table:
if bucket is not self.empty:
yield bucket[0]