forked from UNN/2026-rff_mp
141 lines
4.7 KiB
Python
141 lines
4.7 KiB
Python
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() |