101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
import random
|
||
import time
|
||
import csv
|
||
import sys
|
||
|
||
sys.setrecursionlimit(20000)
|
||
|
||
from codes.LL import ll_insert, ll_find, ll_delete
|
||
from codes.HT import ht_insert, ht_delete, ht_find
|
||
from codes.BST import bst_delete, bst_find, bst_insert
|
||
|
||
# Экспериментальная часть
|
||
def generate_records(N):
|
||
records =[]
|
||
for i in range(N):
|
||
name = f"User_{i:05d}"
|
||
phone =str(random.randint(100000,999999))
|
||
records.append((name,phone))
|
||
return records
|
||
|
||
|
||
def run_test(structure_name, mode, input_data, search_names, delete_names):
|
||
print(f"Тест {structure_name} в режиме {mode}")
|
||
ins_times = []
|
||
find_times = []
|
||
del_times = []
|
||
for _ in range(5):
|
||
if structure_name == "LL":
|
||
container = None
|
||
elif structure_name == "BST":
|
||
container = None
|
||
elif structure_name == "HT":
|
||
container = [None]*150
|
||
#А
|
||
start = time.perf_counter()
|
||
for name, phone in input_data:
|
||
if structure_name == "LL":
|
||
container = ll_insert(container, name, phone)
|
||
elif structure_name == "BST":
|
||
container = bst_insert(container, name, phone)
|
||
elif structure_name == "HT":
|
||
ht_insert(container, name, phone)
|
||
ins_times.append(time.perf_counter() - start)
|
||
#Б
|
||
start = time.perf_counter()
|
||
for name in search_names:
|
||
if structure_name == "LL": ll_find(container, name)
|
||
elif structure_name == "BST": bst_find(container, name)
|
||
else: ht_find(container, name)
|
||
find_times.append(time.perf_counter() - start)
|
||
#В
|
||
start = time.perf_counter()
|
||
for name in delete_names:
|
||
if structure_name == "LL": container = ll_delete(container, name)
|
||
elif structure_name == "BST": container = bst_delete(container, name)
|
||
else: ht_delete(container, name)
|
||
del_times.append(time.perf_counter() - start)
|
||
|
||
results = []
|
||
|
||
for i in range(5):
|
||
results.append([structure_name, mode, f"Вставка (попытка {i+1})", ins_times[i]])
|
||
results.append([structure_name, mode, "Вставка СРЕДНЕЕ", sum(ins_times) / 5])
|
||
|
||
for i in range(5):
|
||
results.append([structure_name, mode, f"Поиск (попытка {i+1})", find_times[i]])
|
||
results.append([structure_name, mode, "Поиск СРЕДНЕЕ", sum(find_times) / 5])
|
||
|
||
for i in range(5):
|
||
results.append([structure_name, mode, f"Удаление (попытка {i+1})", del_times[i]])
|
||
results.append([structure_name, mode, "Удаление СРЕДНЕЕ", sum(del_times) / 5])
|
||
|
||
return results
|
||
|
||
def main_experiment():
|
||
N = 10000
|
||
|
||
data = generate_records(N)
|
||
random.shuffle(data)
|
||
data_sort = sorted(data, key = lambda x: x[0])
|
||
|
||
search_names = [r[0] for r in random.sample(data, 100)] + [f"None_{i}" for i in range(10)]
|
||
delete_names = [r[0] for r in random.sample(data, 50)]
|
||
|
||
results = [["Structure", "Mode", "Operation", "Time"]]
|
||
|
||
for mode_name, mode_data in [("shufled", data), ("sorted", data_sort)]:
|
||
results += run_test("LL", mode_name, mode_data, search_names, delete_names)
|
||
results += run_test("BST", mode_name, mode_data, search_names, delete_names)
|
||
results += run_test("HT", mode_name, mode_data, search_names, delete_names)
|
||
|
||
|
||
|
||
with open("results.csv", "w", newline = "") as f:
|
||
writer = csv.writer(f)
|
||
writer.writerows(results)
|
||
print("Результаты сохранены в файл")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main_experiment() |