2026-04-21 16:51:43 +00:00
|
|
|
|
"""
|
|
|
|
|
|
Хеш-таблица
|
|
|
|
|
|
|
|
|
|
|
|
Хранится как список buckets фиксированной длины,
|
|
|
|
|
|
каждый элемент — голова связного списка (или None).
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
|
|
from LinkedList import *
|
|
|
|
|
|
|
|
|
|
|
|
def hash_fun(name, size) :
|
|
|
|
|
|
"""Принимает имя и возвращает индекс бакета для него."""
|
2026-05-17 15:18:36 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
2026-04-21 16:51:43 +00:00
|
|
|
|
|
|
|
|
|
|
def ht_insert(buckets, name, phone, blen=50):
|
|
|
|
|
|
"""Возвращает новый массив бакетов
|
|
|
|
|
|
Вычисляет индекс, вызывает ll_insert для соответствующего бакета.
|
|
|
|
|
|
Функция не меняет размер массива бакетов автоматически!"""
|
2026-05-17 15:18:36 +00:00
|
|
|
|
if buckets == []:
|
|
|
|
|
|
raise ValueError("Длинна buckets должна быть больше 0")
|
|
|
|
|
|
|
|
|
|
|
|
size = len(buckets)
|
|
|
|
|
|
index = hash_fun(name, size)
|
|
|
|
|
|
buckets[index] = ll_insert(buckets[index], name, phone)
|
|
|
|
|
|
return buckets
|
2026-04-21 16:51:43 +00:00
|
|
|
|
|
|
|
|
|
|
def ht_delete(buckets, name):
|
|
|
|
|
|
"""Возвращает новый массив бакетов без элемента с именем name"""
|
2026-05-17 15:18:36 +00:00
|
|
|
|
if buckets == []:
|
|
|
|
|
|
raise ValueError("Длинна buckets должна быть больше 0")
|
|
|
|
|
|
|
|
|
|
|
|
size = len(buckets)
|
|
|
|
|
|
index = hash_fun(name, size)
|
|
|
|
|
|
buckets[index] = ll_delete(buckets[index], name)
|
|
|
|
|
|
return buckets
|
2026-04-21 16:51:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ht_find(buckets, name):
|
2026-05-17 15:18:36 +00:00
|
|
|
|
if buckets == []:
|
|
|
|
|
|
raise ValueError("Длинна buckets должна быть больше 0")
|
|
|
|
|
|
|
|
|
|
|
|
size = len(buckets)
|
|
|
|
|
|
index = hash_fun(name, size)
|
|
|
|
|
|
return ll_find(buckets[index], name)
|
|
|
|
|
|
|
2026-04-21 16:51:43 +00:00
|
|
|
|
|
|
|
|
|
|
def ht_list_all(buckets):
|
|
|
|
|
|
"""Собирает все записи из всех бакетов и сортирует"""
|
2026-05-17 15:18:36 +00:00
|
|
|
|
allRecords = []
|
|
|
|
|
|
for bucket in buckets:
|
|
|
|
|
|
allRecords.extend(ll_list_all(bucket))
|
|
|
|
|
|
return sorted(allRecords, key=lambda x: x[0])
|
2026-04-21 16:51:43 +00:00
|
|
|
|
|