From 610bef792601c743e61bbf7d8341e57aa934ba0b Mon Sep 17 00:00:00 2001 From: ivanchenkoam Date: Sat, 23 May 2026 16:46:58 +0300 Subject: [PATCH] [1] csv --- ivanchenkoam/laba1.txt | 96 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/ivanchenkoam/laba1.txt b/ivanchenkoam/laba1.txt index 0a7132a..eb68b99 100644 --- a/ivanchenkoam/laba1.txt +++ b/ivanchenkoam/laba1.txt @@ -327,3 +327,99 @@ def measure_delete(structure_type: str, structure: Any, end = time.perf_counter() return end - start +def run_experiment(n_records: int = 10000, n_find: int = 110, + n_delete: int = 50, n_runs: int = 5) -> List[List]: + """Запуск всех замеров""" + + # Генерация данных + all_records = generate_records(n_records) + records_shuffled = all_records.copy() + random.shuffle(records_shuffled) + records_sorted = sorted(all_records, key=lambda x: x[0]) + + # Имена для поиска + all_names = [name for name, _ in all_records] + existing_names = random.sample(all_names, n_find - 10) + missing_names = [f"None_{i}" for i in range(10)] + + # Имена для удаления + names_to_delete = random.sample(all_names, n_delete) + + structures = ["LinkedList", "HashTable", "BST"] + modes = {"shuffled": records_shuffled, "sorted": records_sorted} + + # Заголовок CSV + results = [["Структура", "Режим", "Операция", + "Замер1", "Замер2", "Замер3", "Замер4", "Замер5", "Среднее"]] + + for structure in structures: + for mode_name, mode_data in modes.items(): + print(f"\nТестирование: {structure}, режим: {mode_name}") + + # Вставка + insertion_times = [] + for run in range(n_runs): + print(f" Вставка, run {run+1}/{n_runs}...") + t = measure_insertion(structure, mode_data) + insertion_times.append(t) + + avg_insertion = sum(insertion_times) / n_runs + results.append([structure, mode_name, "вставка"] + + [f"{t:.6f}" for t in insertion_times] + + [f"{avg_insertion:.6f}"]) + print(f" Замеры: {[f'{t:.6f}' for t in insertion_times]}") + print(f" Среднее: {avg_insertion:.6f} сек") + + # Поиск + find_times = [] + for run in range(n_runs): + print(f" Поиск, run {run+1}/{n_runs}...") + t, _ = measure_find(structure, mode_data, + existing_names, missing_names) + find_times.append(t) + + avg_find = sum(find_times) / n_runs + results.append([structure, mode_name, "поиск"] + + [f"{t:.6f}" for t in find_times] + + [f"{avg_find:.6f}"]) + print(f" Замеры: {[f'{t:.6f}' for t in find_times]}") + print(f" Среднее: {avg_find:.6f} сек") + + # Удаление + delete_times = [] + for run in range(n_runs): + print(f" Удаление, run {run+1}/{n_runs}...") + # Создаём свежую структуру для каждого замера удаления + if structure == "LinkedList": + head = None + for name, phone in mode_data: + head = ll_insert(head, name, phone) + t = measure_delete(structure, head, names_to_delete) + elif structure == "HashTable": + buckets = ht_create() + for name, phone in mode_data: + ht_insert(buckets, name, phone) + t = measure_delete(structure, buckets, names_to_delete) + elif structure == "BST": + root = None + for name, phone in mode_data: + root = bst_insert(root, name, phone) + t = measure_delete(structure, root, names_to_delete) + + delete_times.append(t) + + avg_delete = sum(delete_times) / n_runs + results.append([structure, mode_name, "удаление"] + + [f"{t:.6f}" for t in delete_times] + + [f"{avg_delete:.6f}"]) + print(f" Замеры: {[f'{t:.6f}' for t in delete_times]}") + print(f" Среднее: {avg_delete:.6f} сек") + + return results + +def save_results(results: List[List], filename: str = "results.csv"): + """Сохранение результатов в CSV""" + with open(filename, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerows(results) + print(f"\nРезультаты сохранены в {filename}")