forked from UNN/2026-rff_mp
Реализованы все структуры
This commit is contained in:
parent
147e3da053
commit
5212aff3d6
|
|
@ -7,17 +7,74 @@
|
||||||
|
|
||||||
def bst_insert(root, name, phone):
|
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):
|
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):
|
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'])
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -9,19 +9,53 @@ from LinkedList import *
|
||||||
|
|
||||||
def hash_fun(name, size) :
|
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):
|
def ht_insert(buckets, name, phone, blen=50):
|
||||||
"""Возвращает новый массив бакетов
|
"""Возвращает новый массив бакетов
|
||||||
Вычисляет индекс, вызывает ll_insert для соответствующего бакета.
|
Вычисляет индекс, вызывает 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):
|
def ht_delete(buckets, name):
|
||||||
"""Возвращает новый массив бакетов без элемента с именем 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):
|
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):
|
def ht_list_all(buckets):
|
||||||
"""Собирает все записи из всех бакетов и сортирует"""
|
"""Собирает все записи из всех бакетов и сортирует"""
|
||||||
|
allRecords = []
|
||||||
|
for bucket in buckets:
|
||||||
|
allRecords.extend(ll_list_all(bucket))
|
||||||
|
return sorted(allRecords, key=lambda x: x[0])
|
||||||
|
|
||||||
|
|
@ -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):
|
def ll_find(head, name):
|
||||||
"""Ищет узел, возвращает телефон или None."""
|
"""Ищет узел, возвращает телефон или None."""
|
||||||
|
currentNode = head
|
||||||
|
while currentNode != None:
|
||||||
|
if currentNode['name'] == name:
|
||||||
|
return currentNode['phone']
|
||||||
|
currentNode = currentNode['next']
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def ll_delete(head, name):
|
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):
|
def ll_list_all(head):
|
||||||
"""Cобирает все записи в список и сортирует.
|
"""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
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user