[1] struct_data

This commit is contained in:
Маргарита Симонова 2026-03-15 19:17:37 +03:00
parent 557d45e06e
commit ad2d65b1cc
3 changed files with 11 additions and 61 deletions

View File

@ -5,12 +5,11 @@ from collections import defaultdict
import os
report_file = open("analysis_report.txt", "w", encoding="utf-8")
# Читаем файл
data = defaultdict(lambda: defaultdict(dict))
with open("C:/Users/Honor/Documents/dep2k/lab_inf_1/data/results.csv", "r", encoding="utf-8") as f:
reader = csv.reader(f)
header = next(reader) # пропускаем заголовок
header = next(reader)
print(f"{header}")
report_file.write(f"{header}\n")
@ -25,19 +24,16 @@ with open("C:/Users/Honor/Documents/dep2k/lab_inf_1/data/results.csv", "r", enco
print(f"{struct} | {mode} | {op} | {time_val:.6f}")
report_file.write(f"{struct} | {mode} | {op} | {time_val:.6f}\n")
# Словарь для нормальных названий операций
op_names = {
'insert': 'вставка',
'find': 'поиск',
'delete': 'удаление'
}
# Структуры и режимы
structures = ["LinkedList", "HashTable", "Bst"]
modes = ["shuffled", "sorted"]
operations = ["insert", "find", "delete"]
# Вывод таблицы результатов
print("Результаты:")
report_file.write("\nРезультаты:\n")
print(f"{'Структура':<15} {'Режим':<10} {'вставка':<15} {'поиск':<15} {'удаление':<15}")
@ -51,7 +47,7 @@ for struct in structures:
print(f"{struct:<15} {mode:<10} {insert_time:<15.6f} {find_time:<15.6f} {delete_time:<15.6f}")
report_file.write(f"{struct:<15} {mode:<10} {insert_time:<15.6f} {find_time:<15.6f} {delete_time:<15.6f}\n")
# Создаём графики
#графики
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for idx, op in enumerate(operations):
@ -74,7 +70,6 @@ for idx, op in enumerate(operations):
ax.legend()
ax.set_yscale('log')
# Добавляем значения
for bar in bars1:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2, height,
@ -91,11 +86,10 @@ plt.show()
report_file.write("График\n")
report_file.write(f"График сохранён в файл: {plot_filename}\n")
# Анализ
print("Анализ:")
report_file.write("\nАнализ:\n")
# Для каждой операции определяем лучшую структуру
for op in operations:
print(f"\n{op_names[op].upper()}:")
report_file.write(f"\n{op_names[op].upper()}:\n")
@ -111,15 +105,8 @@ for op in operations:
print(f" Худшая: {avg_times[-1][0]} ({avg_times[-1][1]:.6f} сек)")
report_file.write(f" Лучшая: {avg_times[0][0]} ({avg_times[0][1]:.6f} сек)\n")
report_file.write(f" Худшая: {avg_times[-1][0]} ({avg_times[-1][1]:.6f} сек)\n")
# Влияние порядка на BST
# print("ВЛИЯНИЕ ПОРЯДКА ДАННЫХ НА BST:")
# bst_insert_shuffled = data["Bst"]["shuffled"]["insert"]
# bst_insert_sorted = data["Bst"]["sorted"]["insert"]
# print(f" Вставка shuffled: {bst_insert_shuffled:.6f} сек")
# print(f" Вставка sorted: {bst_insert_sorted:.6f} сек")
# print(f" Разница: {bst_insert_sorted/bst_insert_shuffled:.1f} раз")
# Итоговый вывод
print("Вывод:")
report_file.write("\nВывод:\n")
print("Для вставок, поиска и удаления лучше всего использовать HashTable как для отсортированных, так и для неотсортированных данных")

View File

@ -26,23 +26,4 @@ def generate_delete(records, count=50):
names = [name for name, _ in records]
return random.sample(names, min(count, len(names)))
## Генерируем данные
# shuffled, sorted_records = generate_data(10) # 10 записей для примера
#
# print("=== Перемешанные записи (первые 5) ===")
# for record in shuffled[:5]:
# print(f" {record}")
#
# print("\n=== Отсортированные записи (первые 5) ===")
# for record in sorted_records[:5]:
# print(f" {record}")
#
# # Генерируем поисковые запросы
# search_queries = generate_search(sorted_records, exist_count=5, no_exist_count=3)
# print(f"\n=== Поисковые запросы (всего {len(search_queries)}) ===")
# print(search_queries)
#
# # Генерируем запросы на удаление
# delete_queries = generate_delete(sorted_records, count=5)
# print(f"\n=== Запросы на удаление (всего {len(delete_queries)}) ===")
# print(delete_queries)

View File

@ -14,9 +14,6 @@ def ll_insert(head, name, phone):
if head is None:
return new_node
# if head['name'] == name:
# new_node['next']=head['next']
# return new_node
current = head
while current['next'] is not None:
if current['next']['name'] == name:
@ -119,8 +116,6 @@ def bst_insert(root, name, phone):
def bst_find(root, name):
# if root is None:
# return None
current = root
while current is not None:
if name == current['name']:
@ -139,34 +134,26 @@ def bst_find_min(node):
def bst_delete(root, name):
"""ИТЕРАТИВНОЕ удаление (без рекурсии)"""
if root is None:
return None
# Специальный случай: удаляем корень
if root['name'] == name:
# Нет потомков
if root['left'] is None and root['right'] is None:
return None
# Только правый потомок
if root['left'] is None:
return root['right']
# Только левый потомок
if root['right'] is None:
return root['left']
# Есть оба потомка
# Находим минимальный узел в правом поддереве
parent = root
min_node = root['right']
while min_node['left']:
parent = min_node
min_node = min_node['left']
# Копируем данные
root['name'] = min_node['name']
root['phone'] = min_node['phone']
# Удаляем минимальный узел
if parent == root:
parent['right'] = min_node['right']
else:
@ -174,7 +161,6 @@ def bst_delete(root, name):
return root
# Ищем узел для удаления и его родителя
parent = None
current = root
while current and current['name'] != name:
@ -184,45 +170,42 @@ def bst_delete(root, name):
else:
current = current['right']
# Если не нашли
if current is None:
return root
# Случай 1: нет потомков
if current['left'] is None and current['right'] is None:
if parent['left'] == current:
parent['left'] = None
else:
parent['right'] = None
# Случай 2: только правый потомок
elif current['left'] is None:
if parent['left'] == current:
parent['left'] = current['right']
else:
parent['right'] = current['right']
# Случай 3: только левый потомок
elif current['right'] is None:
if parent['left'] == current:
parent['left'] = current['left']
else:
parent['right'] = current['left']
# Случай 4: есть оба потомка
else:
# Находим минимальный узел в правом поддереве
min_parent = current
min_node = current['right']
while min_node['left']:
min_parent = min_node
min_node = min_node['left']
# Копируем данные
current['name'] = min_node['name']
current['phone'] = min_node['phone']
# Удаляем минимальный узел
if min_parent == current:
min_parent['right'] = min_node['right']
else:
@ -232,7 +215,6 @@ def bst_delete(root, name):
def bst_list_all(root):
"""Центрированный обход с использованием стека"""
records = []
stack = []
current = root