From 928ac824f246cc17b1e88a31116c29b61dbcf3e7 Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 20 May 2026 17:18:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D1=85=20=D1=82?= =?UTF-8?q?=D1=80=D1=91=D1=85=20=D1=8D=D1=82=D0=B0=D0=BF=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MylnikovAS/task_1/data/ll_ht_bst.py | 153 ++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 MylnikovAS/task_1/data/ll_ht_bst.py diff --git a/MylnikovAS/task_1/data/ll_ht_bst.py b/MylnikovAS/task_1/data/ll_ht_bst.py new file mode 100644 index 0000000..a2058f7 --- /dev/null +++ b/MylnikovAS/task_1/data/ll_ht_bst.py @@ -0,0 +1,153 @@ +import csv +import random +import sys +import time +import threading + + +sys.setrecursionlimit(30000) +threading.stack_size(64*1024*1024) + + +def ll_insert(head, name, phone): + """Добавляет запись или обновляет телефон, если имя уже существует. Возвращает новую голову списка.""" + curr = head + while curr is not None: + if curr["name"] == name: + curr["phone"] = phone + return head + curr = curr["next"] + + new_node = {"name": name, "phone": phone, "next": head} + return new_node + +def ll_find(head, name): + """Ищет узел по имени. Возвращает телефон или None.""" + curr = head + while curr is not None: + if curr["name"] == name: + return curr["phone"] + curr = curr["next"] + return None + +def ll_delete(head, name): + """Удаляет узел по имени. Возвращает новую голову списка.""" + curr = head + prev = None + + while curr is not None: + if curr["name"] == name: + if prev is None: + return curr["next"] + else: + prev["next"] = curr["next"] + return head + prev = curr + curr = curr["next"] + + return head + +def ll_list_all(head): + """Собирает все записи в список и сортирует их по имени.""" + records = [] + curr = head + while curr is not None: + records.append((curr["name"], curr["phone"])) + curr = curr["next"] + records.sort(key=lambda x: x[0]) + return records + + +def ht_create(size=1000): + """Создает пустую хеш-таблицу заданного размера.""" + return [None] * size + +def ht_insert(buckets, name, phone): + """Вычисляет индекс бакета и вызывает ll_insert.""" + idx = abs(hash(name)) % len(buckets) + buckets[idx] = ll_insert(buckets[idx], name, phone) + +def ht_find(buckets, name): + """Вычисляет индекс бакета и вызывает ll_find.""" + idx = abs(hash(name)) % len(buckets) + return ll_find(buckets[idx], name) + +def ht_delete(buckets, name): + """Вычисляет индекс бакета и вызывает ll_delete.""" + idx = abs(hash(name)) % len(buckets) + buckets[idx] = ll_delete(buckets[idx], name) + +def ht_list_all(buckets): + """Собирает записи из всех бакетов и сортирует их по имени.""" + records = [] + for head in buckets: + curr = head + while curr is not None: + records.append((curr["name"], curr["phone"])) + curr = curr["next"] + records.sort(key=lambda x: x[0]) + return records + + +def bst_insert(root, name, phone): + """Рекурсивно вставляет узел или обновляет телефон.""" + if root is None: + return {"name": name, "phone": phone, "left": None, "right": None} + + if name == root["name"]: + root["phone"] = phone + elif name < root["name"]: + root["left"] = bst_insert(root["left"], name, phone) + else: + root["right"] = bst_insert(root["right"], name, phone) + + return root + +def bst_find(root, name): + """Рекурсивный поиск по дереву.""" + if root is None: + return None + + if name == root["name"]: + return root["phone"] + elif name < root["name"]: + return bst_find(root["left"], name) + else: + return bst_find(root["right"], name) + +def bst_delete(root, name): + """Рекурсивное удаление узла из BST.""" + if root is None: + return None + + if name < root["name"]: + root["left"] = bst_delete(root["left"], name) + elif name > root["name"]: + root["right"] = bst_delete(root["right"], name) + else: + if root["left"] is None: + return root["right"] + if root["right"] is None: + return root["left"] + + min_node = root["right"] + while min_node["left"] is not None: + min_node = min_node["left"] + + root["name"] = min_node["name"] + root["phone"] = min_node["phone"] + root["right"] = bst_delete(root["right"], min_node["name"]) + + return root + +def bst_list_all(root): + """Центрированный обход дерева для сбора записей.""" + records = [] + def _inorder(node): + if node is not None: + _inorder(node["left"]) + records.append((node["name"], node["phone"])) + _inorder(node["right"]) + + _inorder(root) + return records \ No newline at end of file