[1] struct_data
This commit is contained in:
parent
557d45e06e
commit
ad2d65b1cc
|
|
@ -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 как для отсортированных, так и для неотсортированных данных")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user