2026-rff_mp/svetlakovkyu/docs/data/01/codes/experiment.py
2026-04-20 18:41:33 +03:00

101 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import random
import time
import csv
import sys
sys.setrecursionlimit(20000)
from codes.LL import ll_insert, ll_find, ll_delete
from codes.HT import ht_insert, ht_delete, ht_find
from codes.BST import bst_delete, bst_find, bst_insert
# Экспериментальная часть
def generate_records(N):
records =[]
for i in range(N):
name = f"User_{i:05d}"
phone =str(random.randint(100000,999999))
records.append((name,phone))
return records
def run_test(structure_name, mode, input_data, search_names, delete_names):
print(f"Тест {structure_name} в режиме {mode}")
ins_times = []
find_times = []
del_times = []
for _ in range(5):
if structure_name == "LL":
container = None
elif structure_name == "BST":
container = None
elif structure_name == "HT":
container = [None]*150
#А
start = time.perf_counter()
for name, phone in input_data:
if structure_name == "LL":
container = ll_insert(container, name, phone)
elif structure_name == "BST":
container = bst_insert(container, name, phone)
elif structure_name == "HT":
ht_insert(container, name, phone)
ins_times.append(time.perf_counter() - start)
start = time.perf_counter()
for name in search_names:
if structure_name == "LL": ll_find(container, name)
elif structure_name == "BST": bst_find(container, name)
else: ht_find(container, name)
find_times.append(time.perf_counter() - start)
#В
start = time.perf_counter()
for name in delete_names:
if structure_name == "LL": container = ll_delete(container, name)
elif structure_name == "BST": container = bst_delete(container, name)
else: ht_delete(container, name)
del_times.append(time.perf_counter() - start)
results = []
for i in range(5):
results.append([structure_name, mode, f"Вставка (попытка {i+1})", ins_times[i]])
results.append([structure_name, mode, "Вставка СРЕДНЕЕ", sum(ins_times) / 5])
for i in range(5):
results.append([structure_name, mode, f"Поиск (попытка {i+1})", find_times[i]])
results.append([structure_name, mode, "Поиск СРЕДНЕЕ", sum(find_times) / 5])
for i in range(5):
results.append([structure_name, mode, f"Удаление (попытка {i+1})", del_times[i]])
results.append([structure_name, mode, "Удаление СРЕДНЕЕ", sum(del_times) / 5])
return results
def main_experiment():
N = 10000
data = generate_records(N)
random.shuffle(data)
data_sort = sorted(data, key = lambda x: x[0])
search_names = [r[0] for r in random.sample(data, 100)] + [f"None_{i}" for i in range(10)]
delete_names = [r[0] for r in random.sample(data, 50)]
results = [["Structure", "Mode", "Operation", "Time"]]
for mode_name, mode_data in [("shufled", data), ("sorted", data_sort)]:
results += run_test("LL", mode_name, mode_data, search_names, delete_names)
results += run_test("BST", mode_name, mode_data, search_names, delete_names)
results += run_test("HT", mode_name, mode_data, search_names, delete_names)
with open("results.csv", "w", newline = "") as f:
writer = csv.writer(f)
writer.writerows(results)
print("Результаты сохранены в файл")
if __name__ == "__main__":
main_experiment()