From 52a5aa8fc66ce9297a2f8604898963e1ed8ef042 Mon Sep 17 00:00:00 2001 From: novikovsd Date: Sun, 24 May 2026 13:34:12 +0000 Subject: [PATCH] FINISH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit создана функция, проводящая замеры, функция сохраняющая замеры --- novikovsd/hashtab.py | 88 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/novikovsd/hashtab.py b/novikovsd/hashtab.py index 45dc225..358d22d 100644 --- a/novikovsd/hashtab.py +++ b/novikovsd/hashtab.py @@ -217,4 +217,90 @@ def measure_delete(obj, struct_name, names_to_delete): for name in names_to_delete: obj = bst_delete(obj, name) elapsed = time.perf_counter() - start - return elapsed, obj \ No newline at end of file + return elapsed, obj + +def run_experiment(n=10000, repeats=5): + records_sorted, records_shuffled = generate_test_data(n) + existing_names = [name for name, _ in records_sorted[:100]] + nonexisting_names = [f"None_{i}" for i in range(10)] + all_names = [name for name, _ in records_sorted] + + structures = ["LinkedList", "HashTable", "BST"] + modes = [("shuffled", records_shuffled), ("sorted", records_sorted)] + + results = [] + for struct_name in structures: + for mode_name, records in modes: + for rep in range(repeats): + insert_time, obj = measure_insert(struct_name, records) + results.append([struct_name, mode_name, "insert", rep+1, insert_time]) + + find_time = measure_find(obj, struct_name, existing_names, nonexisting_names) + results.append([struct_name, mode_name, "find", rep+1, find_time]) + + random.seed(rep) + to_delete = random.sample(all_names, 50) + delete_time, obj = measure_delete(obj, struct_name, to_delete) + results.append([struct_name, mode_name, "delete", rep+1, delete_time]) + + return results + +def save_results_to_csv(results, filename="docs/data/results.csv"): + os.makedirs(os.path.dirname(filename), exist_ok=True) + with open(filename, 'w', newline='', encoding='utf-8') as f: + writer = csv.writer(f) + writer.writerow(["Structure", "Mode", "Operation", "Repeat", "Time_sec"]) + writer.writerows(results) + print(f"Результаты сохранены в {filename}") + + +def aggregate_results(results): + from collections import defaultdict + agg = defaultdict(list) + for row in results: + struct, mode, op, rep, t = row + agg[(struct, mode, op)].append(t) + means = {k: sum(v)/len(v) for k, v in agg.items()} + return means + + +def plot_results(means, output_dir="docs"): + try: + import matplotlib.pyplot as plt + import numpy as np + except ImportError: + print("Matplotlib не установлен. Графики не построены.") + return + + operations = ["insert", "find", "delete"] + structures = ["LinkedList", "HashTable", "BST"] + modes = ["shuffled", "sorted"] + + 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_means = [means.get((struct, "shuffled", op), 0) for struct in structures] + sorted_means = [means.get((struct, "sorted", op), 0) for struct in structures] + ax.bar(x - width/2, shuffled_means, width, label='случайный порядок', color='skyblue') + ax.bar(x + width/2, sorted_means, width, label='отсортированный порядок', color='salmon') + ax.set_xticks(x) + ax.set_xticklabels(structures, rotation=15) + ax.set_ylabel('Время (сек)') + ax.set_title(f'{op.upper()}') + ax.legend() + ax.grid(axis='y', linestyle='--', alpha=0.7) + + plt.tight_layout() + plt.savefig(os.path.join(output_dir, "comparison.png"), dpi=150) + plt.show() + +if __name__ == "__main__": + results = run_experiment(n=10000, repeats=5) + save_results_to_csv(results) + means = aggregate_results(results) + print("\nСреднее время по операциям (сек):") + for (struct, mode, op), t in sorted(means.items()): + print(f"{struct:12} {mode:8} {op:6} : {t:.6f}") + plot_results(means) \ No newline at end of file