From 792142a2608d8326d6fc7de04589f6bd2a26e6ec Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 20 May 2026 18:00:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=87=D0=B0=D1=81=D1=82=D0=B8=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MylnikovAS/task_1/data/experiment_part.py | 92 +++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 MylnikovAS/task_1/data/experiment_part.py diff --git a/MylnikovAS/task_1/data/experiment_part.py b/MylnikovAS/task_1/data/experiment_part.py new file mode 100644 index 0000000..fb8b9dd --- /dev/null +++ b/MylnikovAS/task_1/data/experiment_part.py @@ -0,0 +1,92 @@ +def main(): + N = 10000 + random.seed(42) + + records_sorted = [(f"User_{i:05d}", f"8-999-123-{i:04d}") for i in range(N)] + records_shuffled = records_sorted.copy() + random.shuffle(records_shuffled) + + search_existing = [random.choice(records_sorted)[0] for _ in range(100)] + search_non_existing = [f"None_{i}" for i in range(10)] + search_names = search_existing + search_non_existing + delete_names = [random.choice(records_sorted)[0] for _ in range(50)] + + csv_rows = [["Structure", "Mode", "Operation", "Time (sec)"]] + plot_data = [] + + def run_experiment(struct_type, mode, dataset): + print(f"Start: {struct_type} | Mode: {mode}...") + times_insert, times_find, times_delete = [], [], [] + + for round_idx in range(1, 6): + if struct_type == "LinkedList": container = None + elif struct_type == "HashTable": container = ht_create(size=1000) + elif struct_type == "BST": container = None + + # А. Вставка + start = time.perf_counter() + if struct_type == "LinkedList": + for name, phone in dataset: container = ll_insert(container, name, phone) + elif struct_type == "HashTable": + for name, phone in dataset: ht_insert(container, name, phone) + elif struct_type == "BST": + for name, phone in dataset: container = bst_insert(container, name, phone) + t_ins = time.perf_counter() - start + times_insert.append(t_ins) + csv_rows.append([struct_type, mode, f"insert (number {round_idx})", f"{t_ins:.6f}"]) + + # Б. Поиск + start = time.perf_counter() + if struct_type == "LinkedList": + for name in search_names: ll_find(container, name) + elif struct_type == "HashTable": + for name in search_names: ht_find(container, name) + elif struct_type == "BST": + for name in search_names: bst_find(container, name) + t_find = time.perf_counter() - start + times_find.append(t_find) + csv_rows.append([struct_type, mode, f"find (number {round_idx})", f"{t_find:.6f}"]) + + # В. Удаление + start = time.perf_counter() + if struct_type == "LinkedList": + for name in delete_names: container = ll_delete(container, name) + elif struct_type == "HashTable": + for name in delete_names: ht_delete(container, name) + elif struct_type == "BST": + for name in delete_names: container = bst_delete(container, name) + t_del = time.perf_counter() - start + times_delete.append(t_del) + csv_rows.append([struct_type, mode, f"delete (number {round_idx})", f"{t_del:.6f}"]) + + # Запись средних значений + csv_rows.append([struct_type, mode, "Insert (average)", f"{sum(times_insert)/5:.6f}"]) + csv_rows.append([struct_type, mode, "Find (average)", f"{sum(times_find)/5:.6f}"]) + csv_rows.append([struct_type, mode, "Delete (average)", f"{sum(times_delete)/5:.6f}"]) + + avg_ins = sum(times_insert) / 5 + avg_find = sum(times_find) / 5 + avg_del = sum(times_delete) / 5 + + plot_data.append((struct_type, mode, avg_ins, avg_find, avg_del)) + + # Запуск всех тестов + run_experiment("LinkedList", "random", records_shuffled) + run_experiment("LinkedList", "sorted", records_sorted) + run_experiment("HashTable", "random", records_shuffled) + run_experiment("HashTable", "sorted", records_sorted) + run_experiment("BST", "random", records_shuffled) + run_experiment("BST", "sorted", records_sorted) + + # Сохранение в CSV + with open("results.csv", "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerows(csv_rows) + print("\n[Успех] Все тесты завершены! Результаты сохранены в 'results.csv'.") + + generate_performance_charts(plot_data) + +if __name__ == '__main__': + experiment_thread = threading.Thread(target=main) + experiment_thread.start() + experiment_thread.join() \ No newline at end of file