[1,2]newlaba2 #304

Merged
AlexanderVah merged 12 commits from ivanchenkoam/2026-rff_mp:newlaba2 into develop 2026-05-30 11:23:35 +00:00
Showing only changes of commit 610bef7926 - Show all commits

View File

@ -327,3 +327,99 @@ def measure_delete(structure_type: str, structure: Any,
end = time.perf_counter()
return end - start
def run_experiment(n_records: int = 10000, n_find: int = 110,
n_delete: int = 50, n_runs: int = 5) -> List[List]:
"""Запуск всех замеров"""
# Генерация данных
all_records = generate_records(n_records)
records_shuffled = all_records.copy()
random.shuffle(records_shuffled)
records_sorted = sorted(all_records, key=lambda x: x[0])
# Имена для поиска
all_names = [name for name, _ in all_records]
existing_names = random.sample(all_names, n_find - 10)
missing_names = [f"None_{i}" for i in range(10)]
# Имена для удаления
names_to_delete = random.sample(all_names, n_delete)
structures = ["LinkedList", "HashTable", "BST"]
modes = {"shuffled": records_shuffled, "sorted": records_sorted}
# Заголовок CSV
results = [["Структура", "Режим", "Операция",
"Замер1", "Замер2", "Замер3", "Замер4", "Замер5", "Среднее"]]
for structure in structures:
for mode_name, mode_data in modes.items():
print(f"\nТестирование: {structure}, режим: {mode_name}")
# Вставка
insertion_times = []
for run in range(n_runs):
print(f" Вставка, run {run+1}/{n_runs}...")
t = measure_insertion(structure, mode_data)
insertion_times.append(t)
avg_insertion = sum(insertion_times) / n_runs
results.append([structure, mode_name, "вставка"] +
[f"{t:.6f}" for t in insertion_times] +
[f"{avg_insertion:.6f}"])
print(f" Замеры: {[f'{t:.6f}' for t in insertion_times]}")
print(f" Среднее: {avg_insertion:.6f} сек")
# Поиск
find_times = []
for run in range(n_runs):
print(f" Поиск, run {run+1}/{n_runs}...")
t, _ = measure_find(structure, mode_data,
existing_names, missing_names)
find_times.append(t)
avg_find = sum(find_times) / n_runs
results.append([structure, mode_name, "поиск"] +
[f"{t:.6f}" for t in find_times] +
[f"{avg_find:.6f}"])
print(f" Замеры: {[f'{t:.6f}' for t in find_times]}")
print(f" Среднее: {avg_find:.6f} сек")
# Удаление
delete_times = []
for run in range(n_runs):
print(f" Удаление, run {run+1}/{n_runs}...")
# Создаём свежую структуру для каждого замера удаления
if structure == "LinkedList":
head = None
for name, phone in mode_data:
head = ll_insert(head, name, phone)
t = measure_delete(structure, head, names_to_delete)
elif structure == "HashTable":
buckets = ht_create()
for name, phone in mode_data:
ht_insert(buckets, name, phone)
t = measure_delete(structure, buckets, names_to_delete)
elif structure == "BST":
root = None
for name, phone in mode_data:
root = bst_insert(root, name, phone)
t = measure_delete(structure, root, names_to_delete)
delete_times.append(t)
avg_delete = sum(delete_times) / n_runs
results.append([structure, mode_name, "удаление"] +
[f"{t:.6f}" for t in delete_times] +
[f"{avg_delete:.6f}"])
print(f" Замеры: {[f'{t:.6f}' for t in delete_times]}")
print(f" Среднее: {avg_delete:.6f} сек")
return results
def save_results(results: List[List], filename: str = "results.csv"):
"""Сохранение результатов в CSV"""
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(results)
print(f"\nРезультаты сохранены в {filename}")