2026-rff_mp/ProninVV/aufgabe-1-data-structures/test.py

139 lines
5.2 KiB
Python

from aufg1 import *
import time
import random
import sys
import csv
sys.setrecursionlimit(20000)
def phone_number_generate():
number = "8"
text = "0123456789"
for i in range(10):
char = random.choice(text)
number += char
return number
def create_data(n=100):
""" создаем сразу обычный массив и остортированный """
records_sorted = []
for i in range(n):
name = f"User_{i:05d}"
phone = phone_number_generate()
records_sorted.append((name, phone))
records_shuffled = records_sorted[:]
random.shuffle(records_shuffled)
return records_sorted, records_shuffled
def run_expirement(epoch=1, elements=1000):
""" распределяем данные по трем структурам данных
тестируем время операций (вставки, удаления, перебора) и записываем полученные результаты в файл """
header = ["Структура", "Режим", "Операция", "Время (сек)"]
results = [header]
for j in range(epoch):
print(f"эпоха - {j+1}")
# создаем данные
records_sorted, records_shuffled = create_data(elements)
datasets = [
("shuffled", records_shuffled),
("sorted", records_sorted)]
# сразу будем обрабатывать и случайны и отсортированный данные
for label, arr in datasets:
linklist = None
hashtab = hash_table(elements)
bintree = None
# заполнение связного списка
start = time.perf_counter()
for p in arr:
linklist = ll_insert(linklist, p[0], p[1])
end = time.perf_counter()
results.append(["linklist", label, "insert", end-start])
# поиск 110 имен в связном списке
# несуществующие данные
nonedata = [(f"None_{i}", phone_number_generate()) for i in range(10)]
# случайная комбинация
chaossample = random.sample(arr, 100) + nonedata
start = time.perf_counter()
for p in chaossample:
ll_find(linklist, p[0])
end = time.perf_counter()
results.append(["linklist", label, "find", end-start])
# удаление 50 имен в св писке
deldata = random.sample(arr, 50)
start = time.perf_counter()
for p in deldata:
ll_delete(linklist, p[0])
end = time.perf_counter()
results.append(["linklist", label, "delete", end-start])
# заполнение хэш-тфблицы
start = time.perf_counter()
for p in arr:
ht_insert(hashtab, p[0], p[1])
end = time.perf_counter()
results.append(["hashtable", label, "insert", end-start])
# поиск 110 имен в хэш таблице
# несуществующие данные
nonedata = [(f"None_{i}", phone_number_generate()) for i in range(10)]
# случайная комбинация
chaossample = random.sample(arr, 100) + nonedata
start = time.perf_counter()
for p in chaossample:
ht_find(hashtab, p[0])
end = time.perf_counter()
results.append(["hashtable", label, "find", end-start])
# удаление 50 имен в хэш таблице
deldata = random.sample(arr, 50)
start = time.perf_counter()
for p in deldata:
ht_delete(hashtab, p[0])
end = time.perf_counter()
results.append(["hashtable", label, "delete", end-start])
# заполнение дерева
start = time.perf_counter()
for p in arr:
bintree = bst_insert(bintree, p[0], p[1])
end = time.perf_counter()
results.append(["bintree", label, "insert", end-start])
# поиск 110 имен в дереве
# несуществующие данные
nonedata = [(f"None_{i}", phone_number_generate()) for i in range(10)]
# случайная комбинация
chaossample = random.sample(arr, 100) + nonedata
start = time.perf_counter()
for p in chaossample:
bst_find(bintree, p[0])
end = time.perf_counter()
results.append(["bintree", label, "find", end-start])
# удаление 50 имен в дереве
deldata = random.sample(arr, 50)
start = time.perf_counter()
for p in deldata:
bst_delete(bintree, p[0])
end = time.perf_counter()
results.append(["bintree", label, "delete", end-start])
filename = f"results/timedata_{elements}_epochs_{j+1}.csv"
with open(filename, mode='w', encoding='utf-8', newline='') as file:
writer = csv.writer(file)
writer.writerows(results)
run_expirement(epoch=5, elements=10000)