2026-rff_mp/SimonovaMS/analyz_1.py
2026-03-15 18:54:31 +03:00

134 lines
5.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import csv
import matplotlib.pyplot as plt
import numpy as np
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) # пропускаем заголовок
print(f"{header}")
report_file.write(f"{header}\n")
for row in reader:
if len(row) >= 4:
struct = row[0] # LinkedList, HashTable, Bst
mode = row[1] # shuffled или sorted
op = row[2] # insert, find, delete
time_val = float(row[3])
data[struct][mode][op] = time_val
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}")
report_file.write(f"{'Структура':<15} {'Режим':<10} {'вставка':<15} {'поиск':<15} {'удаление':<15}\n")
for struct in structures:
for mode in modes:
insert_time = data[struct][mode]['insert']
find_time = data[struct][mode]['find']
delete_time = data[struct][mode]['delete']
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):
ax = axes[idx]
x = np.arange(len(structures))
width = 0.35
shuffled_vals = [data[s]["shuffled"][op] for s in structures]
sorted_vals = [data[s]["sorted"][op] for s in structures]
bars1 = ax.bar(x - width/2, shuffled_vals, width, label='shuffled', color='orange', alpha=0.8)
bars2 = ax.bar(x + width/2, sorted_vals, width, label='sorted', color='cyan', alpha=0.8)
ax.set_xlabel('Структура')
ax.set_ylabel('Время (сек)')
ax.set_title(f'{op_names[op]}')
ax.set_xticks(x)
ax.set_xticklabels(structures, rotation=45)
ax.legend()
ax.set_yscale('log')
# Добавляем значения
for bar in bars1:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2, height,
f'{height:.3f}', ha='center', va='bottom', fontsize=8)
for bar in bars2:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2, height,
f'{height:.3f}', ha='center', va='bottom', fontsize=8)
plt.tight_layout()
plot_filename = "results_plot.png"
plt.savefig('results_plot.png', dpi=150)
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")
# Среднее по двум режимам
avg_times = []
for s in structures:
avg = (data[s]["shuffled"][op] + data[s]["sorted"][op]) / 2
avg_times.append((s, avg))
avg_times.sort(key=lambda x: x[1])
print(f" Лучшая: {avg_times[0][0]} ({avg_times[0][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[-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 как для отсортированных, так и для неотсортированных данных")
print("BST неплох для отсортированных данных, но всё равно хуже HashTable")
print("LinkedList показал худшие результаты")
print("HashTable - оптимальный выбор для телефонного справочника")
report_file.write("Для вставок, поиска и удаления лучше всего использовать HashTable как для отсортированных, так и для неотсортированных данных\n")
report_file.write("BST неплох для отсортированных данных, но всё равно хуже HashTable\n")
report_file.write("LinkedList показал худшие результаты\n")
report_file.write("HashTable - оптимальный выбор для телефонного справочника\n")
report_file.close()