import random import time import csv import os from phonebook import * N = 10000 REPEATS = 5 def generate_test_data(): records = [ (f"User_{i:05d}", f"+7900000{i:04d}") for i in range(N) ] records_shuffled = records.copy() random.shuffle(records_shuffled) records_sorted = records.copy() return records_shuffled, records_sorted def measure_experiment(insert_function, find_function, delete_function, records): insert_times = [] find_times = [] delete_times = [] for _ in range(REPEATS): structure = None start = time.perf_counter() for name, phone in records: structure = insert_function(structure, name, phone) insert_times.append(time.perf_counter() - start) structure_for_find = structure names = [name for name, phone in records] search_names = random.sample(names, 100) + [ "NotFound_001", "NotFound_002", "NotFound_003", "NotFound_004", "NotFound_005", "NotFound_006", "NotFound_007", "NotFound_008", "NotFound_009", "NotFound_010" ] for _ in range(REPEATS): start = time.perf_counter() for name in search_names: find_function(structure_for_find, name) find_times.append(time.perf_counter() - start) delete_names = random.sample(names, 50) for _ in range(REPEATS): structure = structure_for_find start = time.perf_counter() for name in delete_names: structure = delete_function(structure, name) delete_times.append(time.perf_counter() - start) return insert_times, find_times, delete_times def measure_hash(records): insert_times = [] find_times = [] delete_times = [] names = [name for name, phone in records] search_names = random.sample(names, 100) + [ f"NotFound_{i:03d}" for i in range(10) ] delete_names = random.sample(names, 50) for _ in range(REPEATS): buckets = ht_create() start = time.perf_counter() for name, phone in records: ht_insert(buckets, name, phone) insert_times.append(time.perf_counter() - start) structure_for_find = buckets for _ in range(REPEATS): start = time.perf_counter() for name in search_names: ht_find(structure_for_find, name) find_times.append(time.perf_counter() - start) for _ in range(REPEATS): buckets = structure_for_find.copy() start = time.perf_counter() for name in delete_names: ht_delete(buckets, name) delete_times.append(time.perf_counter() - start) return insert_times, find_times, delete_times def average(values): return sum(values) / len(values) def run(): records_shuffled, records_sorted = generate_test_data() results = [] for order_name, records in [ ("random", records_shuffled), ("sorted", records_sorted) ]: print("Order:", order_name) ll = measure_experiment( ll_insert, ll_find, ll_delete, records ) results.append(["LinkedList", order_name, "insert", *ll[0]]) results.append(["LinkedList", order_name, "find", *ll[1]]) results.append(["LinkedList", order_name, "delete", *ll[2]]) ht = measure_hash(records) results.append(["HashTable", order_name, "insert", *ht[0]]) results.append(["HashTable", order_name, "find", *ht[1]]) results.append(["HashTable", order_name, "delete", *ht[2]]) bst = measure_experiment( bst_insert, bst_find, bst_delete, records ) results.append(["BST", order_name, "insert", *bst[0]]) results.append(["BST", order_name, "find", *bst[1]]) results.append(["BST", order_name, "delete", *bst[2]]) os.makedirs("docs/data", exist_ok=True) with open("docs/data/results.csv", "w", newline="", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow([ "structure", "order", "operation", "run1", "run2", "run3", "run4", "run5", "average" ]) for row in results: writer.writerow(row + [average(row[3:])]) print("Results saved to docs/data/results.csv") if __name__ == "__main__": run()