2026-rff_mp/raskatovia/docs/data/task1/zamery.py
2026-05-18 15:11:59 +03:00

141 lines
4.7 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 csv
import random
import time
from spravochnik import *
COUNT = 10000
REPEATS = 5
def make_records():
records = []
for i in range(COUNT):
name = f"User_{i:05d}"
phone = str(89000000000 + i)
records.append((name, phone))
shuffled = records[:]
random.shuffle(shuffled)
ordered = sorted(records, key=lambda item: item[0])
return shuffled, ordered
def make_search_names(records):
existing = [item[0] for item in random.sample(records, 100)]
missing = [f"None_{i}" for i in range(10)]
return existing + missing
def make_delete_names(records):
return [item[0] for item in random.sample(records, 50)]
def average(values):
return sum(values) / len(values)
def test_list(records):
insert_times = []
find_times = []
delete_times = []
for _ in range(REPEATS):
head = None
start = time.perf_counter()
for name, phone in records:
head = ll_insert(head, name, phone)
insert_times.append(time.perf_counter() - start)
search_names = make_search_names(records)
start = time.perf_counter()
for name in search_names:
ll_find(head, name)
find_times.append(time.perf_counter() - start)
delete_names = make_delete_names(records)
start = time.perf_counter()
for name in delete_names:
head = ll_delete(head, name)
delete_times.append(time.perf_counter() - start)
return insert_times, find_times, delete_times
def test_hash(records):
insert_times = []
find_times = []
delete_times = []
for _ in range(REPEATS):
table = ht_create()
start = time.perf_counter()
for name, phone in records:
ht_insert(table, name, phone)
insert_times.append(time.perf_counter() - start)
search_names = make_search_names(records)
start = time.perf_counter()
for name in search_names:
ht_find(table, name)
find_times.append(time.perf_counter() - start)
delete_names = make_delete_names(records)
start = time.perf_counter()
for name in delete_names:
ht_delete(table, name)
delete_times.append(time.perf_counter() - start)
return insert_times, find_times, delete_times
def test_bst(records):
insert_times = []
find_times = []
delete_times = []
for _ in range(REPEATS):
root = None
start = time.perf_counter()
for name, phone in records:
root = bst_insert(root, name, phone)
insert_times.append(time.perf_counter() - start)
search_names = make_search_names(records)
start = time.perf_counter()
for name in search_names:
bst_find(root, name)
find_times.append(time.perf_counter() - start)
delete_names = make_delete_names(records)
start = time.perf_counter()
for name in delete_names:
root = bst_delete(root, name)
delete_times.append(time.perf_counter() - start)
return insert_times, find_times, delete_times
def add_rows(rows, structure, mode, result):
names = ["Вставка", "Поиск", "Удаление"]
for operation, times in zip(names, result):
for number, value in enumerate(times, 1):
rows.append([structure, mode, operation, number, value])
rows.append([structure, mode, operation, "Среднее", average(times)])
def main():
shuffled, ordered = make_records()
rows = [["Структура", "Режим", "Операция", "Замер", "Время (сек)"]]
print("Связный список, случайный порядок")
add_rows(rows, "Связный список", "Случайный", test_list(shuffled))
print("Связный список, отсортированный порядок")
add_rows(rows, "Связный список", "Отсортированный", test_list(ordered))
print("Хеш-таблица, случайный порядок")
add_rows(rows, "Хеш-таблица", "Случайный", test_hash(shuffled))
print("Хеш-таблица, отсортированный порядок")
add_rows(rows, "Хеш-таблица", "Отсортированный", test_hash(ordered))
print("BST, случайный порядок")
add_rows(rows, "BST", "Случайный", test_bst(shuffled))
print("BST, отсортированный порядок")
add_rows(rows, "BST", "Отсортированный", test_bst(ordered))
with open("raskatovia/docs/data/task1/results.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerows(rows)
print("Результаты сохранены в results.csv")
main()