[1] struct_data
This commit is contained in:
parent
557d45e06e
commit
ad2d65b1cc
|
|
@ -5,12 +5,11 @@ from collections import defaultdict
|
||||||
import os
|
import os
|
||||||
|
|
||||||
report_file = open("analysis_report.txt", "w", encoding="utf-8")
|
report_file = open("analysis_report.txt", "w", encoding="utf-8")
|
||||||
# Читаем файл
|
|
||||||
data = defaultdict(lambda: defaultdict(dict))
|
data = defaultdict(lambda: defaultdict(dict))
|
||||||
|
|
||||||
with open("C:/Users/Honor/Documents/dep2k/lab_inf_1/data/results.csv", "r", encoding="utf-8") as f:
|
with open("C:/Users/Honor/Documents/dep2k/lab_inf_1/data/results.csv", "r", encoding="utf-8") as f:
|
||||||
reader = csv.reader(f)
|
reader = csv.reader(f)
|
||||||
header = next(reader) # пропускаем заголовок
|
header = next(reader)
|
||||||
print(f"{header}")
|
print(f"{header}")
|
||||||
report_file.write(f"{header}\n")
|
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}")
|
print(f"{struct} | {mode} | {op} | {time_val:.6f}")
|
||||||
report_file.write(f"{struct} | {mode} | {op} | {time_val:.6f}\n")
|
report_file.write(f"{struct} | {mode} | {op} | {time_val:.6f}\n")
|
||||||
|
|
||||||
# Словарь для нормальных названий операций
|
|
||||||
op_names = {
|
op_names = {
|
||||||
'insert': 'вставка',
|
'insert': 'вставка',
|
||||||
'find': 'поиск',
|
'find': 'поиск',
|
||||||
'delete': 'удаление'
|
'delete': 'удаление'
|
||||||
}
|
}
|
||||||
|
|
||||||
# Структуры и режимы
|
|
||||||
structures = ["LinkedList", "HashTable", "Bst"]
|
structures = ["LinkedList", "HashTable", "Bst"]
|
||||||
modes = ["shuffled", "sorted"]
|
modes = ["shuffled", "sorted"]
|
||||||
operations = ["insert", "find", "delete"]
|
operations = ["insert", "find", "delete"]
|
||||||
|
|
||||||
# Вывод таблицы результатов
|
|
||||||
print("Результаты:")
|
print("Результаты:")
|
||||||
report_file.write("\nРезультаты:\n")
|
report_file.write("\nРезультаты:\n")
|
||||||
print(f"{'Структура':<15} {'Режим':<10} {'вставка':<15} {'поиск':<15} {'удаление':<15}")
|
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}")
|
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")
|
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))
|
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
|
||||||
|
|
||||||
for idx, op in enumerate(operations):
|
for idx, op in enumerate(operations):
|
||||||
|
|
@ -74,7 +70,6 @@ for idx, op in enumerate(operations):
|
||||||
ax.legend()
|
ax.legend()
|
||||||
ax.set_yscale('log')
|
ax.set_yscale('log')
|
||||||
|
|
||||||
# Добавляем значения
|
|
||||||
for bar in bars1:
|
for bar in bars1:
|
||||||
height = bar.get_height()
|
height = bar.get_height()
|
||||||
ax.text(bar.get_x() + bar.get_width()/2, height,
|
ax.text(bar.get_x() + bar.get_width()/2, height,
|
||||||
|
|
@ -91,11 +86,10 @@ plt.show()
|
||||||
|
|
||||||
report_file.write("График\n")
|
report_file.write("График\n")
|
||||||
report_file.write(f"График сохранён в файл: {plot_filename}\n")
|
report_file.write(f"График сохранён в файл: {plot_filename}\n")
|
||||||
# Анализ
|
|
||||||
print("Анализ:")
|
print("Анализ:")
|
||||||
report_file.write("\nАнализ:\n")
|
report_file.write("\nАнализ:\n")
|
||||||
|
|
||||||
# Для каждой операции определяем лучшую структуру
|
|
||||||
for op in operations:
|
for op in operations:
|
||||||
print(f"\n{op_names[op].upper()}:")
|
print(f"\n{op_names[op].upper()}:")
|
||||||
report_file.write(f"\n{op_names[op].upper()}:\n")
|
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} сек)")
|
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[0][0]} ({avg_times[0][1]:.6f} сек)\n")
|
||||||
report_file.write(f" Худшая: {avg_times[-1][0]} ({avg_times[-1][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("Вывод:")
|
print("Вывод:")
|
||||||
report_file.write("\nВывод:\n")
|
report_file.write("\nВывод:\n")
|
||||||
print("Для вставок, поиска и удаления лучше всего использовать HashTable как для отсортированных, так и для неотсортированных данных")
|
print("Для вставок, поиска и удаления лучше всего использовать HashTable как для отсортированных, так и для неотсортированных данных")
|
||||||
|
|
|
||||||
|
|
@ -26,23 +26,4 @@ def generate_delete(records, count=50):
|
||||||
names = [name for name, _ in records]
|
names = [name for name, _ in records]
|
||||||
return random.sample(names, min(count, len(names)))
|
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)
|
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,6 @@ def ll_insert(head, name, phone):
|
||||||
|
|
||||||
if head is None:
|
if head is None:
|
||||||
return new_node
|
return new_node
|
||||||
# if head['name'] == name:
|
|
||||||
# new_node['next']=head['next']
|
|
||||||
# return new_node
|
|
||||||
current = head
|
current = head
|
||||||
while current['next'] is not None:
|
while current['next'] is not None:
|
||||||
if current['next']['name'] == name:
|
if current['next']['name'] == name:
|
||||||
|
|
@ -119,8 +116,6 @@ def bst_insert(root, name, phone):
|
||||||
|
|
||||||
|
|
||||||
def bst_find(root, name):
|
def bst_find(root, name):
|
||||||
# if root is None:
|
|
||||||
# return None
|
|
||||||
current = root
|
current = root
|
||||||
while current is not None:
|
while current is not None:
|
||||||
if name == current['name']:
|
if name == current['name']:
|
||||||
|
|
@ -139,34 +134,26 @@ def bst_find_min(node):
|
||||||
|
|
||||||
|
|
||||||
def bst_delete(root, name):
|
def bst_delete(root, name):
|
||||||
"""ИТЕРАТИВНОЕ удаление (без рекурсии)"""
|
|
||||||
if root is None:
|
if root is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Специальный случай: удаляем корень
|
|
||||||
if root['name'] == name:
|
if root['name'] == name:
|
||||||
# Нет потомков
|
|
||||||
if root['left'] is None and root['right'] is None:
|
if root['left'] is None and root['right'] is None:
|
||||||
return None
|
return None
|
||||||
# Только правый потомок
|
|
||||||
if root['left'] is None:
|
if root['left'] is None:
|
||||||
return root['right']
|
return root['right']
|
||||||
# Только левый потомок
|
|
||||||
if root['right'] is None:
|
if root['right'] is None:
|
||||||
return root['left']
|
return root['left']
|
||||||
# Есть оба потомка
|
|
||||||
# Находим минимальный узел в правом поддереве
|
|
||||||
parent = root
|
parent = root
|
||||||
min_node = root['right']
|
min_node = root['right']
|
||||||
while min_node['left']:
|
while min_node['left']:
|
||||||
parent = min_node
|
parent = min_node
|
||||||
min_node = min_node['left']
|
min_node = min_node['left']
|
||||||
|
|
||||||
# Копируем данные
|
|
||||||
root['name'] = min_node['name']
|
root['name'] = min_node['name']
|
||||||
root['phone'] = min_node['phone']
|
root['phone'] = min_node['phone']
|
||||||
|
|
||||||
# Удаляем минимальный узел
|
|
||||||
if parent == root:
|
if parent == root:
|
||||||
parent['right'] = min_node['right']
|
parent['right'] = min_node['right']
|
||||||
else:
|
else:
|
||||||
|
|
@ -174,7 +161,6 @@ def bst_delete(root, name):
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
|
||||||
# Ищем узел для удаления и его родителя
|
|
||||||
parent = None
|
parent = None
|
||||||
current = root
|
current = root
|
||||||
while current and current['name'] != name:
|
while current and current['name'] != name:
|
||||||
|
|
@ -184,45 +170,42 @@ def bst_delete(root, name):
|
||||||
else:
|
else:
|
||||||
current = current['right']
|
current = current['right']
|
||||||
|
|
||||||
# Если не нашли
|
|
||||||
if current is None:
|
if current is None:
|
||||||
return root
|
return root
|
||||||
|
|
||||||
# Случай 1: нет потомков
|
|
||||||
if current['left'] is None and current['right'] is None:
|
if current['left'] is None and current['right'] is None:
|
||||||
if parent['left'] == current:
|
if parent['left'] == current:
|
||||||
parent['left'] = None
|
parent['left'] = None
|
||||||
else:
|
else:
|
||||||
parent['right'] = None
|
parent['right'] = None
|
||||||
|
|
||||||
# Случай 2: только правый потомок
|
|
||||||
elif current['left'] is None:
|
elif current['left'] is None:
|
||||||
if parent['left'] == current:
|
if parent['left'] == current:
|
||||||
parent['left'] = current['right']
|
parent['left'] = current['right']
|
||||||
else:
|
else:
|
||||||
parent['right'] = current['right']
|
parent['right'] = current['right']
|
||||||
|
|
||||||
# Случай 3: только левый потомок
|
|
||||||
elif current['right'] is None:
|
elif current['right'] is None:
|
||||||
if parent['left'] == current:
|
if parent['left'] == current:
|
||||||
parent['left'] = current['left']
|
parent['left'] = current['left']
|
||||||
else:
|
else:
|
||||||
parent['right'] = current['left']
|
parent['right'] = current['left']
|
||||||
|
|
||||||
# Случай 4: есть оба потомка
|
|
||||||
else:
|
else:
|
||||||
# Находим минимальный узел в правом поддереве
|
|
||||||
min_parent = current
|
min_parent = current
|
||||||
min_node = current['right']
|
min_node = current['right']
|
||||||
while min_node['left']:
|
while min_node['left']:
|
||||||
min_parent = min_node
|
min_parent = min_node
|
||||||
min_node = min_node['left']
|
min_node = min_node['left']
|
||||||
|
|
||||||
# Копируем данные
|
|
||||||
current['name'] = min_node['name']
|
current['name'] = min_node['name']
|
||||||
current['phone'] = min_node['phone']
|
current['phone'] = min_node['phone']
|
||||||
|
|
||||||
# Удаляем минимальный узел
|
|
||||||
if min_parent == current:
|
if min_parent == current:
|
||||||
min_parent['right'] = min_node['right']
|
min_parent['right'] = min_node['right']
|
||||||
else:
|
else:
|
||||||
|
|
@ -232,7 +215,6 @@ def bst_delete(root, name):
|
||||||
|
|
||||||
|
|
||||||
def bst_list_all(root):
|
def bst_list_all(root):
|
||||||
"""Центрированный обход с использованием стека"""
|
|
||||||
records = []
|
records = []
|
||||||
stack = []
|
stack = []
|
||||||
current = root
|
current = root
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user