2026-rff_mp/PaulVA/lab1/experiments.py

185 lines
4.4 KiB
Python

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()