138 lines
3.1 KiB
Python
138 lines
3.1 KiB
Python
import sys
|
|
sys.setrecursionlimit(20000)
|
|
import time
|
|
import random
|
|
import csv
|
|
|
|
from code.LinkedList import *
|
|
from code.HashTable import *
|
|
from code.BinaryTree import *
|
|
|
|
|
|
|
|
def generate_data(n=10000):
|
|
return [(f"User_{i:05d}", f"+7-900-{i:05d}") for i in range(n)]
|
|
|
|
|
|
def prepare_data(n=10000):
|
|
data = generate_data(n)
|
|
|
|
shuffled = data[:]
|
|
random.shuffle(shuffled)
|
|
|
|
sorted_data = sorted(data, key=lambda x: x[0])
|
|
|
|
return shuffled, sorted_data
|
|
|
|
|
|
|
|
def measure_find(find_func, obj, data):
|
|
exist = random.sample([x[0] for x in data], 100)
|
|
fake = [f"None_{i}" for i in range(10)]
|
|
names = exist + fake
|
|
|
|
start = time.perf_counter()
|
|
|
|
for name in names:
|
|
find_func(obj, name)
|
|
|
|
return time.perf_counter() - start
|
|
|
|
|
|
|
|
def measure_delete(delete_func, obj, data):
|
|
names = random.sample([x[0] for x in data], 50)
|
|
|
|
start = time.perf_counter()
|
|
|
|
for name in names:
|
|
obj = delete_func(obj, name)
|
|
|
|
return time.perf_counter() - start
|
|
|
|
|
|
|
|
def test_linked_list(data):
|
|
head = None
|
|
|
|
start = time.perf_counter()
|
|
for name, phone in data:
|
|
head = ll_insert(head, name, phone)
|
|
insert_time = time.perf_counter() - start
|
|
|
|
find_time = measure_find(ll_find, head, data)
|
|
delete_time = measure_delete(ll_delete, head, data)
|
|
|
|
return insert_time, find_time, delete_time
|
|
|
|
|
|
|
|
def test_hash_table(data):
|
|
buckets = create_buckets(1000)
|
|
|
|
start = time.perf_counter()
|
|
for name, phone in data:
|
|
ht_insert(buckets, name, phone)
|
|
insert_time = time.perf_counter() - start
|
|
|
|
find_time = measure_find(ht_find, buckets, data)
|
|
delete_time = measure_delete(ht_delete, buckets, data)
|
|
|
|
return insert_time, find_time, delete_time
|
|
|
|
|
|
def test_bst(data):
|
|
root = None
|
|
|
|
start = time.perf_counter()
|
|
for name, phone in data:
|
|
root = bst_insert(root, name, phone)
|
|
insert_time = time.perf_counter() - start
|
|
|
|
find_time = measure_find(bst_find, root, data)
|
|
delete_time = measure_delete(bst_delete, root, data)
|
|
|
|
return insert_time, find_time, delete_time
|
|
|
|
|
|
def run():
|
|
|
|
results = []
|
|
results.append(["Structure", "Order", "Insert", "Find", "Delete"])
|
|
|
|
for i in range(5):
|
|
|
|
shuffled, sorted_data = prepare_data()
|
|
|
|
# -------- LinkedList --------
|
|
i1, f1, d1 = test_linked_list(shuffled)
|
|
results.append(["LinkedList", "shuffled", i1, f1, d1])
|
|
|
|
i1, f1, d1 = test_linked_list(sorted_data)
|
|
results.append(["LinkedList", "sorted", i1, f1, d1])
|
|
|
|
# -------- HashTable --------
|
|
i2, f2, d2 = test_hash_table(shuffled)
|
|
results.append(["HashTable", "shuffled", i2, f2, d2])
|
|
|
|
i2, f2, d2 = test_hash_table(sorted_data)
|
|
results.append(["HashTable", "sorted", i2, f2, d2])
|
|
|
|
# -------- BST --------
|
|
i3, f3, d3 = test_bst(shuffled)
|
|
results.append(["BST", "shuffled", i3, f3, d3])
|
|
|
|
i3, f3, d3 = test_bst(sorted_data)
|
|
results.append(["BST", "sorted", i3, f3, d3])
|
|
|
|
|
|
|
|
with open("results.csv", "w", newline="") as f:
|
|
writer = csv.writer(f)
|
|
writer.writerows(results)
|
|
|
|
print("Готово! results.csv создан")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
run() |