2026-rff_mp/raskatovia/docs/data/task1/zamery.py

141 lines
4.7 KiB
Python
Raw Normal View History

2026-05-18 12:11:59 +00:00
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()