2026-rff_mp/ZelentsovAV/task1/experiment.py
2026-05-24 20:18:54 +03:00

90 lines
3.1 KiB
Python

import time
import numpy as np
from linkedlist import ll_insert, ll_find, ll_delete
from hashtable import ht_create, ht_insert, ht_find, ht_delete
from bst import bst_insert, bst_find, bst_delete
def measure_insert(records, struct_type, params=None): #Замер времени вставки всех записей
start = time.perf_counter()
if struct_type == 'linkedlist':
head = None
for name, phone in records:
head = ll_insert(head, name, phone)
result = head
elif struct_type == 'hashtable':
size = params.get('size', 1000) if params else 1000
buckets = ht_create(size)
for name, phone in records:
ht_insert(buckets, name, phone)
result = buckets
elif struct_type == 'bst':
root = None
for name, phone in records:
root = bst_insert(root, name, phone)
result = root
end = time.perf_counter()
return end - start, result
def measure_find(structure, names_to_find, struct_type): #Замер времени поиска записей
start = time.perf_counter()
for name in names_to_find:
if struct_type == 'linkedlist':
ll_find(structure, name)
elif struct_type == 'hashtable':
ht_find(structure, name)
elif struct_type == 'bst':
bst_find(structure, name)
end = time.perf_counter()
return end - start
def measure_delete(structure, names_to_delete, struct_type): #Замер времени удаления записей
start = time.perf_counter()
for name in names_to_delete:
if struct_type == 'linkedlist':
structure = ll_delete(structure, name)
elif struct_type == 'hashtable':
ht_delete(structure, name)
elif struct_type == 'bst':
structure = bst_delete(structure, name)
end = time.perf_counter()
return end - start, structure
def run_single_experiment(struct_type, mode, data_records, names_to_find, names_to_delete, repeats, params=None): #Запуск одного эксперимента
insert_times = []
find_times = []
delete_times = []
for i in range(repeats):
if struct_type == 'hashtable':
insert_time, structure = measure_insert(data_records, struct_type, params)
else:
insert_time, structure = measure_insert(data_records, struct_type)
insert_times.append(insert_time)
find_time = measure_find(structure, names_to_find, struct_type)
find_times.append(find_time)
delete_time, structure = measure_delete(structure, names_to_delete, struct_type)
delete_times.append(delete_time)
return {
'structure': struct_type,
'mode': mode,
'insert_mean': np.mean(insert_times),
'insert_std': np.std(insert_times),
'insert_all': insert_times,
'find_mean': np.mean(find_times),
'find_std': np.std(find_times),
'find_all': find_times,
'delete_mean': np.mean(delete_times),
'delete_std': np.std(delete_times),
'delete_all': delete_times
}