73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
# Запуск экспериментального сравнения трёх структур данных
|
|
# Результаты сохраняются в experiment_results.csv
|
|
|
|
import csv
|
|
import sys
|
|
sys.setrecursionlimit(20000)
|
|
|
|
import linked_list as ll
|
|
import hash_table as ht
|
|
import bst
|
|
import data_utils
|
|
import benchmark
|
|
|
|
def main():
|
|
N = 10000 # количество записей
|
|
base_records = data_utils.generate_records(N)
|
|
shuffled, sorted_records = data_utils.prepare_datasets(base_records)
|
|
|
|
# Описания структур для бенчмарка
|
|
structures = {
|
|
'LinkedList': {
|
|
'name': 'LinkedList',
|
|
'create': lambda: None,
|
|
'insert': ll.ll_insert,
|
|
'find': ll.ll_find,
|
|
'delete': ll.ll_delete
|
|
},
|
|
'HashTable': {
|
|
'name': 'HashTable',
|
|
'create': lambda: ht.create_hash_table(10), # 10 корзин
|
|
'insert': ht.ht_insert,
|
|
'find': ht.ht_find,
|
|
'delete': ht.ht_delete
|
|
},
|
|
'BST': {
|
|
'name': 'BST',
|
|
'create': lambda: None,
|
|
'insert': bst.bst_insert,
|
|
'find': bst.bst_find,
|
|
'delete': bst.bst_delete
|
|
}
|
|
}
|
|
|
|
all_results = []
|
|
REPEATS = 5 # минимум 5 повторений
|
|
|
|
for name, struct in structures.items():
|
|
print(f"Testing {name} on random order...")
|
|
res_random = benchmark.measure_operations(struct, shuffled, 'random', REPEATS)
|
|
all_results.extend(res_random)
|
|
|
|
print(f"Testing {name} on sorted order...")
|
|
res_sorted = benchmark.measure_operations(struct, sorted_records, 'sorted', REPEATS)
|
|
all_results.extend(res_sorted)
|
|
|
|
# Сохранение CSV
|
|
with open('experiment_results.csv', 'w', newline='', encoding='utf-8') as f:
|
|
writer = csv.writer(f)
|
|
writer.writerow(['Structure', 'Mode', 'Repeat', 'Insert (sec)', 'Search (sec)', 'Delete (sec)'])
|
|
for row in all_results:
|
|
writer.writerow([
|
|
row['structure'],
|
|
row['mode'],
|
|
row['repetition'],
|
|
f"{row['insert_time']:.6f}",
|
|
f"{row['find_time']:.6f}",
|
|
f"{row['delete_time']:.6f}"
|
|
])
|
|
|
|
print("Experiment finished. Results saved to experiment_results.csv")
|
|
|
|
if __name__ == '__main__':
|
|
main() |