import time import random import csv import sys from linked_list_phonebook import * from hash_table_phonebook import * from bst_phonebook import * sys.setrecursionlimit(100000) def generate_test_data(n=10000): """Генерация тестовых данных""" uniform_records = [(f"User_{i:05d}", f"+7-999-{i:07d}") for i in range(n)] shuffled_records = uniform_records.copy() random.shuffle(shuffled_records) sorted_records = sorted(uniform_records, key=lambda x: x[0]) existing_names = [f"User_{i:05d}" for i in random.sample(range(n), 100)] non_existing_names = [f"None_{i:05d}" for i in range(10)] search_names = existing_names + non_existing_names delete_names = [f"User_{i:05d}" for i in random.sample(range(n), 50)] return { 'shuffled': shuffled_records, 'sorted': sorted_records, 'search_names': search_names, 'delete_names': delete_names } def run_benchmarks(): print("Генерация тестовых данных...") N = 10000 test_data = generate_test_data(N) results = [] structures = [ ('LinkedList', 'll'), ('HashTable', 'ht'), ('BST', 'bst') ] modes = [ ('случайный', test_data['shuffled']), ('отсортированный', test_data['sorted']) ] for struct_name, struct_type in structures: print(f"\n=== Тестирование {struct_name} ===") for mode_name, records in modes: print(f" Режим: {mode_name}") # Создаем структуру и меряем вставку if struct_type == 'll': structure = None start = time.perf_counter() for name, phone in records: structure = ll_insert(structure, name, phone) end = time.perf_counter() insert_time = end - start elif struct_type == 'ht': structure = create_hash_table(5000) start = time.perf_counter() for name, phone in records: ht_insert(structure, name, phone) end = time.perf_counter() insert_time = end - start elif struct_type == 'bst': structure = None start = time.perf_counter() for name, phone in records: structure = bst_insert(structure, name, phone) end = time.perf_counter() insert_time = end - start print(f" Вставка: {insert_time:.6f} сек") results.append([struct_name, mode_name, "вставка", insert_time]) # Поиск start = time.perf_counter() for name in test_data['search_names']: if struct_type == 'll': ll_find(structure, name) elif struct_type == 'ht': ht_find(structure, name) elif struct_type == 'bst': bst_find(structure, name) end = time.perf_counter() find_time = end - start print(f" Поиск (60 запросов): {find_time:.6f} сек") results.append([struct_name, mode_name, "поиск", find_time]) # Удаление start = time.perf_counter() for name in test_data['delete_names']: if struct_type == 'll': structure = ll_delete(structure, name) elif struct_type == 'ht': ht_delete(structure, name) elif struct_type == 'bst': structure = bst_delete(structure, name) end = time.perf_counter() delete_time = end - start print(f" Удаление (30 записей): {delete_time:.6f} сек") results.append([struct_name, mode_name, "удаление", delete_time]) # Сохраняем в CSV with open('docs/data/results.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['Структура', 'Режим', 'Операция', 'Время (сек)']) writer.writerows(results) print("\n" + "="*60) print("ИТОГОВЫЕ РЕЗУЛЬТАТЫ (в секундах)") print("="*60) print(f"{'Структура':12} {'Режим':12} {'Операция':10} {'Время':>10}") print("-"*50) for row in results: print(f"{row[0]:12} {row[1]:12} {row[2]:10} {row[3]:10.6f}") print(f"\nРезультаты сохранены в docs/data/results.csv") if __name__ == "__main__": random.seed(42) run_benchmarks()