forked from UNN/2026-rff_mp
90 lines
3.1 KiB
Python
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
|
||
|
|
}
|