2026-03-20 17:59:23 +00:00
|
|
|
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))
|
|
|
|
|
|
2026-03-20 18:38:43 +00:00
|
|
|
records_shuffled = records_sorted[:]
|
2026-03-20 17:59:23 +00:00
|
|
|
random.shuffle(records_shuffled)
|
|
|
|
|
return records_sorted, records_shuffled
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 18:38:43 +00:00
|
|
|
def run_expirement(epoch=1, elements=1000):
|
2026-03-20 17:59:23 +00:00
|
|
|
|
|
|
|
|
""" распределяем данные по трем структурам данных
|
|
|
|
|
тестируем время операций (вставки, удаления, перебора) и записываем полученные результаты в файл """
|
|
|
|
|
header = ["Структура", "Режим", "Операция", "Время (сек)"]
|
2026-03-20 18:38:43 +00:00
|
|
|
|
2026-03-20 20:32:11 +00:00
|
|
|
for j in range(epoch):
|
|
|
|
|
print(f"эпоха - {j+1}")
|
2026-03-24 15:08:56 +00:00
|
|
|
|
|
|
|
|
results = [header]
|
2026-03-20 20:32:11 +00:00
|
|
|
# создаем данные
|
|
|
|
|
records_sorted, records_shuffled = create_data(elements)
|
|
|
|
|
|
|
|
|
|
datasets = [
|
|
|
|
|
("shuffled", records_shuffled),
|
|
|
|
|
("sorted", records_sorted)]
|
2026-03-24 15:08:56 +00:00
|
|
|
|
2026-03-20 20:32:11 +00:00
|
|
|
# сразу будем обрабатывать и случайны и отсортированный данные
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-24 15:08:56 +00:00
|
|
|
run_expirement(epoch=5, elements=5000)
|