From 147e3da0535bfb7e513bb7bd1f658db0e15b946e Mon Sep 17 00:00:00 2001 From: FamutdinovMD Date: Tue, 21 Apr 2026 19:51:43 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=88=D0=B0=D0=B1=D0=BB?= =?UTF-8?q?=D0=BE=D0=BD=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=83=D0=BA=D1=82=D1=83=D1=80=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- famutdinovmd/tasks/1/BinaryTree.py | 23 +++++++++++++++++++++++ famutdinovmd/tasks/1/HashTable.py | 27 +++++++++++++++++++++++++++ famutdinovmd/tasks/1/LinkedList.py | 25 +++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 famutdinovmd/tasks/1/BinaryTree.py create mode 100644 famutdinovmd/tasks/1/HashTable.py create mode 100644 famutdinovmd/tasks/1/LinkedList.py diff --git a/famutdinovmd/tasks/1/BinaryTree.py b/famutdinovmd/tasks/1/BinaryTree.py new file mode 100644 index 0000000..d460942 --- /dev/null +++ b/famutdinovmd/tasks/1/BinaryTree.py @@ -0,0 +1,23 @@ +""" +Двоичное дерево поиска + +Узел — словарь: +{'name': 'Имя', 'phone': '123', 'left': None, 'right': None}. +""" + +def bst_insert(root, name, phone): + """Итеративно вставляет, возвращает новый корень (если корень меняется).""" + + +def bst_find(root, name): + """Поиск в ширину.""" + +def bst_delete(root, name): + """Удаляет узел и возвращает новый корень.""" + + +def bst_list_all(root): + """Центрированный обход. + Рекурсивно собирает записи в отсортированном порядке.""" + + \ No newline at end of file diff --git a/famutdinovmd/tasks/1/HashTable.py b/famutdinovmd/tasks/1/HashTable.py new file mode 100644 index 0000000..bcc7268 --- /dev/null +++ b/famutdinovmd/tasks/1/HashTable.py @@ -0,0 +1,27 @@ +""" +Хеш-таблица + +Хранится как список buckets фиксированной длины, +каждый элемент — голова связного списка (или None). +""" + +from LinkedList import * + +def hash_fun(name, size) : + """Принимает имя и возвращает индекс бакета для него.""" + +def ht_insert(buckets, name, phone, blen=50): + """Возвращает новый массив бакетов + Вычисляет индекс, вызывает ll_insert для соответствующего бакета. + Функция не меняет размер массива бакетов автоматически!""" + +def ht_delete(buckets, name): + """Возвращает новый массив бакетов без элемента с именем name""" + + +def ht_find(buckets, name): + """поиск в хеш таблице хз че это загугли""" + +def ht_list_all(buckets): + """Собирает все записи из всех бакетов и сортирует""" + \ No newline at end of file diff --git a/famutdinovmd/tasks/1/LinkedList.py b/famutdinovmd/tasks/1/LinkedList.py new file mode 100644 index 0000000..2698f8d --- /dev/null +++ b/famutdinovmd/tasks/1/LinkedList.py @@ -0,0 +1,25 @@ +""" +Связный список (LinkedListPhoneBook) + +Узел представляется словарём: +{'name': 'Имя', 'phone': '123', 'next': None}. +""" + + +def ll_insert(head, name, phone): + """ + Проходит до конца (или сразу добавляет в конец) и возвращает новую + голову (если вставка в начало) или изменяет список по ссылке. + Удобнее возвращать новую голову, если вставка может быть в начало. + """ + +def ll_find(head, name): + """Ищет узел, возвращает телефон или None.""" + +def ll_delete(head, name): + """Удаляет узел, возвращает новую голову.""" + +def ll_list_all(head): + """Cобирает все записи в список и сортирует. + сортировка вынесена отдельно).""" + \ No newline at end of file -- 2.43.0 From 5212aff3d6a8a33dd2aa5cb8b64b255031fb1e89 Mon Sep 17 00:00:00 2001 From: FamutdinovMD Date: Sun, 17 May 2026 18:18:36 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=B2=D1=81=D0=B5=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- famutdinovmd/tasks/1/BinaryTree.py | 59 +++++++++++++++++++++++++++++- famutdinovmd/tasks/1/HashTable.py | 36 +++++++++++++++++- famutdinovmd/tasks/1/LinkedList.py | 39 +++++++++++++++++++- 3 files changed, 131 insertions(+), 3 deletions(-) diff --git a/famutdinovmd/tasks/1/BinaryTree.py b/famutdinovmd/tasks/1/BinaryTree.py index d460942..17c11b8 100644 --- a/famutdinovmd/tasks/1/BinaryTree.py +++ b/famutdinovmd/tasks/1/BinaryTree.py @@ -7,17 +7,74 @@ def bst_insert(root, name, phone): """Итеративно вставляет, возвращает новый корень (если корень меняется).""" + if root == None: + return {'name': name, 'phone': phone, 'left': None, 'right': None} + current = root + while True: + if current['name'] == name: + current['phone'] == phone + elif current['name'] < name: + if current['left'] == None: + current['left'] = bst_insert(None, name, phone) + return root + else: + current = current['left'] + else: + if current['right'] == None: + current['right'] = bst_insert(None, name, phone) + return root + else: + current = current['right'] + -def bst_find(root, name): +def find_node_to_delete(root: dict, name: str) -> dict|None: """Поиск в ширину.""" + while root != None: + if root['name'] == name: + return root + elif name < root['name']: + root = root['left'] + else: + root = root['right'] + return None + +def find_minimal_child(root: dict) -> dict|None: + while root['left']: + root = root['left'] + return root def bst_delete(root, name): """Удаляет узел и возвращает новый корень.""" + 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: + # Случай 1: нет детей или один ребенок + if root['left'] is None: + return root['right'] + elif root['right'] is None: + return root['left'] + + # Случай 2: два ребенка + min_node = find_minimal_child(root['right']) + 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): """Центрированный обход. Рекурсивно собирает записи в отсортированном порядке.""" + if root is None: + return [] + node_values = {"name": root['name'], "phone": root['phone']} + return bst_list_all(root['left']) + [node_values] + bst_list_all(root['right']) \ No newline at end of file diff --git a/famutdinovmd/tasks/1/HashTable.py b/famutdinovmd/tasks/1/HashTable.py index bcc7268..74a337a 100644 --- a/famutdinovmd/tasks/1/HashTable.py +++ b/famutdinovmd/tasks/1/HashTable.py @@ -9,19 +9,53 @@ 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]) \ No newline at end of file diff --git a/famutdinovmd/tasks/1/LinkedList.py b/famutdinovmd/tasks/1/LinkedList.py index 2698f8d..833325c 100644 --- a/famutdinovmd/tasks/1/LinkedList.py +++ b/famutdinovmd/tasks/1/LinkedList.py @@ -12,14 +12,51 @@ def ll_insert(head, name, phone): голову (если вставка в начало) или изменяет список по ссылке. Удобнее возвращать новую голову, если вставка может быть в начало. """ + newNode = {'name': name, 'phone': phone, 'next': next} + if head == None: + return newNode + currentNode = head + while currentNode ['next'] != None: + currentNode = currentNode['next'] + currentNode ['next'] = newNode + return head + def ll_find(head, name): """Ищет узел, возвращает телефон или None.""" - + currentNode = head + while currentNode != None: + if currentNode['name'] == name: + return currentNode['phone'] + currentNode = currentNode['next'] + return None + + + def ll_delete(head, name): """Удаляет узел, возвращает новую голову.""" + if head == None: + return None + if head['name'] == name: + return head['next'] + + currentNode = head + while currentNode['next'] != None: + if currentNode['next']['name'] == name: + currentNode['next'] = currentNode['next']['next'] + return head + currentNode = currentNode['next'] + return head + def ll_list_all(head): """Cобирает все записи в список и сортирует. сортировка вынесена отдельно).""" + records = [] + currentNobe = head + while currentNobe != None: + records.append(currentNobe['name'], currentNobe['phone']) + currentNobe = currentNobe['next'] + records.sort(key=lambda item: item[0]) + return records \ No newline at end of file -- 2.43.0 From 95f6d90af344c11687ed2176493c703b23753e1d Mon Sep 17 00:00:00 2001 From: FamutdinovMD Date: Sun, 24 May 2026 15:41:51 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- famutdinovmd/428b.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 famutdinovmd/428b.md diff --git a/famutdinovmd/428b.md b/famutdinovmd/428b.md deleted file mode 100644 index e69de29..0000000 -- 2.43.0