diff --git a/nikolaevda/task1/Zadanie1.py b/nikolaevda/task1/Zadanie1.py index f68a5a5..cfa955b 100644 --- a/nikolaevda/task1/Zadanie1.py +++ b/nikolaevda/task1/Zadanie1.py @@ -92,4 +92,72 @@ def ll_list_all(head): if result[j][0] > result[j + 1][0]: result[j], result[j + 1] = result[j + 1], result[j] - return result \ No newline at end of file + return result + + +def hash_table(size): + """создание хеш-таблицы""" + return [None] * size + + +def hash_func(name, buckets_count): + """ + использует умножение на простое число для лучшего распределения + """ + h = 0 + multiplier = 1 + for char in name: + h = (h + ord(char) * multiplier) % buckets_count + multiplier = (multiplier * 31) % buckets_count + return h + + +def ht_insert(buckets, name, phone): + """добавить или обновить запись""" + if buckets is None: + return + + index = hash_func(name, len(buckets)) + buckets[index] = ll_insert(buckets[index], name, phone) + + +def ht_find(buckets, name): + """найти телефон по имени""" + idx = hash_func(name, len(buckets)) + return ll_find(buckets[idx], name) + + +def ht_delete(buckets, name): + """ + удалить запись + """ + idx = hash_func(name, len(buckets)) + buckets[idx] = ll_delete(buckets[idx], name) + + +def bubble_sort(records): + """пузырьковая сортировка""" + n = len(records) + for i in range(n - 1): + swapped = False + for j in range(n - 1 - i): + if records[j][0] > records[j + 1][0]: + records[j], records[j + 1] = records[j + 1], records[j] + swapped = True + if not swapped: + break + return records + + +def ht_list_all(buckets): + """ + собрание всех записей и сортировка + """ + # Собираем все записи + full_data = [] + for head in buckets: + ll_collect(head, full_data) + + # Сортируем пузырьком + bubble_sort(full_data) + return full_data