[1,2]newlaba2 #304
|
|
@ -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}")
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user