2026-rff_mp/famutdinovmd/tasks/1/HashTable.py

61 lines
2.1 KiB
Python
Raw Normal View History

"""
Хеш-таблица
Хранится как список buckets фиксированной длины,
каждый элемент голова связного списка (или None).
"""
from LinkedList import *
def hash_fun(name, size) :
"""Принимает имя и возвращает индекс бакета для него."""
if size <= 0:
raise ValueError("size должен быть больше 0")
hash_sum = 0
base = 1103
for i, letter in enumerate(name):
power = len(name) - i - 1 # или просто i
hash_sum += ord(letter) * (base ** power)
return hash_sum % size
def ht_insert(buckets, name, phone, blen=50):
"""Возвращает новый массив бакетов
Вычисляет индекс, вызывает ll_insert для соответствующего бакета.
Функция не меняет размер массива бакетов автоматически!"""
if buckets == []:
raise ValueError("Длинна buckets должна быть больше 0")
size = len(buckets)
index = hash_fun(name, size)
buckets[index] = ll_insert(buckets[index], name, phone)
return buckets
def ht_delete(buckets, name):
"""Возвращает новый массив бакетов без элемента с именем name"""
if buckets == []:
raise ValueError("Длинна buckets должна быть больше 0")
size = len(buckets)
index = hash_fun(name, size)
buckets[index] = ll_delete(buckets[index], name)
return buckets
def ht_find(buckets, name):
if buckets == []:
raise ValueError("Длинна buckets должна быть больше 0")
size = len(buckets)
index = hash_fun(name, size)
return ll_find(buckets[index], name)
def ht_list_all(buckets):
"""Собирает все записи из всех бакетов и сортирует"""
allRecords = []
for bucket in buckets:
allRecords.extend(ll_list_all(bucket))
return sorted(allRecords, key=lambda x: x[0])