forked from UNN/2026-rff_mp
185 lines
4.4 KiB
Python
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() |