diff --git a/meosyam/docs/data/1/phonebook.py b/meosyam/docs/data/1/phonebook.py index e16dd5c..da959eb 100644 --- a/meosyam/docs/data/1/phonebook.py +++ b/meosyam/docs/data/1/phonebook.py @@ -1,3 +1,9 @@ +import random +import time +import csv +import sys +sys.setrecursionlimit(20000) + def ll_insert(head, name, phone): cur = head while cur: @@ -46,7 +52,7 @@ def ll_list_all(head): res.sort(key=lambda x: x[0]) return res -SIZE = 5 +SIZE = 10 def hash_func(name): s = 0 @@ -144,9 +150,6 @@ def bst_list_all(root): inorder(root) return res -import random, time, csv, sys -sys.setrecursionlimit(20000) - def generate_records(n, seed=42): random.seed(seed) rec = [] @@ -162,7 +165,7 @@ def prepare_datasets(base): sorted_rec = sorted(base, key=lambda x: x[0]) return shuffled, sorted_rec -def run_experiment(funcs, records, mode, repeats=3): +def run_experiment(funcs, records, mode, repeats=5): results = [] for rep in range(repeats): struct = funcs['create']() @@ -170,39 +173,42 @@ def run_experiment(funcs, records, mode, repeats=3): for name, phone in records: struct = funcs['insert'](struct, name, phone) t1 = time.perf_counter() - ins = t1 - t0 + insert_time = t1 - t0 + existing = [n for n, _ in records] - sample = random.sample(existing, 100) - non_ex = [f"None_{i}" for i in range(10)] - to_search = sample + non_ex - random.shuffle(to_search) + sample_existing = random.sample(existing, 100) + non_existing = [f"None_{i}" for i in range(10)] + search_names = sample_existing + non_existing + random.shuffle(search_names) t0 = time.perf_counter() - for name in to_search: + for name in search_names: _ = funcs['find'](struct, name) t1 = time.perf_counter() - find_t = t1 - t0 - to_del = random.sample(existing, 10) + search_time = t1 - t0 + + to_delete = random.sample(existing, 50) t0 = time.perf_counter() - for name in to_del: + for name in to_delete: struct = funcs['delete'](struct, name) t1 = time.perf_counter() - del_t = t1 - t0 + delete_time = t1 - t0 + results.append({ 'structure': funcs['name'], 'mode': mode, - 'rep': rep+1, - 'insert': ins, - 'search': find_t, - 'delete': del_t + 'repetition': rep+1, + 'insert': insert_time, + 'search': search_time, + 'delete': delete_time }) return results def main(): N = 1000 - base = generate_records(N) - shuffled, sorted_rec = prepare_datasets(base) + base_records = generate_records(N) + shuffled, sorted_records = prepare_datasets(base_records) - structs = { + structures = { 'LinkedList': { 'name': 'LinkedList', 'create': lambda: None, @@ -229,20 +235,27 @@ def main(): } } - all_res = [] - for name, funcs in structs.items(): - print(f"Testing {name} random...") - all_res += run_experiment(funcs, shuffled, 'random') - print(f"Testing {name} sorted...") - all_res += run_experiment(funcs, sorted_rec, 'sorted') + all_results = [] + for name, funcs in structures.items(): + print(f"Testing {name} on random order...") + all_results.extend(run_experiment(funcs, shuffled, 'random')) + print(f"Testing {name} on sorted order...") + all_results.extend(run_experiment(funcs, sorted_records, 'sorted')) with open('results.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) - writer.writerow(['Structure','Mode','Repeat','Insert','Search','Delete']) - for r in all_res: - writer.writerow([r['structure'], r['mode'], r['rep'], - f"{r['insert']:.6f}", f"{r['search']:.6f}", f"{r['delete']:.6f}"]) - print("Done. Results in results.csv") + writer.writerow(['Structure', 'Mode', 'Repetition', 'Insert (sec)', 'Search (sec)', 'Delete (sec)']) + for r in all_results: + writer.writerow([ + r['structure'], + r['mode'], + r['repetition'], + f"{r['insert']:.6f}", + f"{r['search']:.6f}", + f"{r['delete']:.6f}" + ]) + + print("Experiment finished. Results saved to esults.csv") if __name__ == '__main__': main() \ No newline at end of file