задание 1: экспериментальная часть, тесты

This commit is contained in:
Sorokin Fedor 2026-05-20 15:20:37 +03:00
parent dd054c4034
commit 098e0f3a32
2 changed files with 214 additions and 1 deletions

91
results.csv Normal file
View File

@ -0,0 +1,91 @@
структура,режим,операция,повторение,время (сек)
LinkedList,случайный,вставка,1,0.128959799999393
LinkedList,случайный,поиск,1,0.006587400000171328
LinkedList,случайный,удаление,1,0.0037955999996484024
LinkedList,случайный,вставка,2,0.1274652000001879
LinkedList,случайный,поиск,2,0.006692099999781931
LinkedList,случайный,удаление,2,0.0038293999996312778
LinkedList,случайный,вставка,3,0.13063139999940176
LinkedList,случайный,поиск,3,0.006624399999964226
LinkedList,случайный,удаление,3,0.004125400000702939
LinkedList,случайный,вставка,4,0.13235040000017761
LinkedList,случайный,поиск,4,0.007224200000564451
LinkedList,случайный,удаление,4,0.0038412000003518187
LinkedList,случайный,вставка,5,0.1376228999997693
LinkedList,случайный,поиск,5,0.007752999999866006
LinkedList,случайный,удаление,5,0.004621699999916018
LinkedList,отсортированный,вставка,1,0.14293330000054993
LinkedList,отсортированный,поиск,1,0.006024299999808136
LinkedList,отсортированный,удаление,1,0.004954899999574991
LinkedList,отсортированный,вставка,2,0.1474125999993703
LinkedList,отсортированный,поиск,2,0.00762140000006184
LinkedList,отсортированный,удаление,2,0.0051066999994873186
LinkedList,отсортированный,вставка,3,0.13767009999992297
LinkedList,отсортированный,поиск,3,0.0064199999997072155
LinkedList,отсортированный,удаление,3,0.005227899999226793
LinkedList,отсортированный,вставка,4,0.13925280000057683
LinkedList,отсортированный,поиск,4,0.006386400000337744
LinkedList,отсортированный,удаление,4,0.0049518000005264184
LinkedList,отсортированный,вставка,5,0.13541350000014063
LinkedList,отсортированный,поиск,5,0.006607199999962177
LinkedList,отсортированный,удаление,5,0.005551099999138387
HashTable,случайный,вставка,1,0.00123639999947045
HashTable,случайный,поиск,1,3.639999977167463e-05
HashTable,случайный,удаление,1,1.9799999790848233e-05
HashTable,случайный,вставка,2,0.000970699999925273
HashTable,случайный,поиск,2,3.259999994043028e-05
HashTable,случайный,удаление,2,1.7100000150094274e-05
HashTable,случайный,вставка,3,0.0009898999996948987
HashTable,случайный,поиск,3,3.20999997711624e-05
HashTable,случайный,удаление,3,1.7100000150094274e-05
HashTable,случайный,вставка,4,0.001140299999860872
HashTable,случайный,поиск,4,0.00010819999988598283
HashTable,случайный,удаление,4,4.2800000301213004e-05
HashTable,случайный,вставка,5,0.001704299999801151
HashTable,случайный,поиск,5,3.510000078676967e-05
HashTable,случайный,удаление,5,1.83000001925393e-05
HashTable,отсортированный,вставка,1,0.0009811999998419196
HashTable,отсортированный,поиск,1,3.110000034212135e-05
HashTable,отсортированный,удаление,1,1.9400000383029692e-05
HashTable,отсортированный,вставка,2,0.0009785000002011657
HashTable,отсортированный,поиск,2,3.1599999601894524e-05
HashTable,отсортированный,удаление,2,1.9800000700342935e-05
HashTable,отсортированный,вставка,3,0.0009659999996074475
HashTable,отсортированный,поиск,3,3.0500000320898835e-05
HashTable,отсортированный,удаление,3,1.9299999621580355e-05
HashTable,отсортированный,вставка,4,0.0009494000005361158
HashTable,отсортированный,поиск,4,2.989999939018162e-05
HashTable,отсортированный,удаление,4,1.8900000213761814e-05
HashTable,отсортированный,вставка,5,0.0012150000002293382
HashTable,отсортированный,поиск,5,3.480000032141106e-05
HashTable,отсортированный,удаление,5,2.0899999981338624e-05
BST,случайный,вставка,1,0.004831499999454536
BST,случайный,поиск,1,0.00013619999936054228
BST,случайный,удаление,1,9.070000032807002e-05
BST,случайный,вставка,2,0.005335699999704957
BST,случайный,поиск,2,0.00012989999959245324
BST,случайный,удаление,2,8.600000001024455e-05
BST,случайный,вставка,3,0.005207599999266677
BST,случайный,поиск,3,0.00013050000052317046
BST,случайный,удаление,3,8.580000030633528e-05
BST,случайный,вставка,4,0.005297200000313751
BST,случайный,поиск,4,0.00013440000020636944
BST,случайный,удаление,4,8.789999992586672e-05
BST,случайный,вставка,5,0.005037799999627168
BST,случайный,поиск,5,0.000649399999929301
BST,случайный,удаление,5,0.0001084000004993868
BST,отсортированный,вставка,1,0.8110883999997895
BST,отсортированный,поиск,1,0.019361399999979767
BST,отсортированный,удаление,1,0.014678200000162178
BST,отсортированный,вставка,2,0.7911546999994243
BST,отсортированный,поиск,2,0.019212399999560148
BST,отсортированный,удаление,2,0.013222700000369514
BST,отсортированный,вставка,3,0.7786938999997801
BST,отсортированный,поиск,3,0.01864480000040203
BST,отсортированный,удаление,3,0.013478699999723176
BST,отсортированный,вставка,4,0.7826362000005247
BST,отсортированный,поиск,4,0.01973920000000362
BST,отсортированный,удаление,4,0.013336900000467722
BST,отсортированный,вставка,5,0.7718632000005528
BST,отсортированный,поиск,5,0.02021930000046268
BST,отсортированный,удаление,5,0.013186899999709567
1 структура режим операция повторение время (сек)
2 LinkedList случайный вставка 1 0.128959799999393
3 LinkedList случайный поиск 1 0.006587400000171328
4 LinkedList случайный удаление 1 0.0037955999996484024
5 LinkedList случайный вставка 2 0.1274652000001879
6 LinkedList случайный поиск 2 0.006692099999781931
7 LinkedList случайный удаление 2 0.0038293999996312778
8 LinkedList случайный вставка 3 0.13063139999940176
9 LinkedList случайный поиск 3 0.006624399999964226
10 LinkedList случайный удаление 3 0.004125400000702939
11 LinkedList случайный вставка 4 0.13235040000017761
12 LinkedList случайный поиск 4 0.007224200000564451
13 LinkedList случайный удаление 4 0.0038412000003518187
14 LinkedList случайный вставка 5 0.1376228999997693
15 LinkedList случайный поиск 5 0.007752999999866006
16 LinkedList случайный удаление 5 0.004621699999916018
17 LinkedList отсортированный вставка 1 0.14293330000054993
18 LinkedList отсортированный поиск 1 0.006024299999808136
19 LinkedList отсортированный удаление 1 0.004954899999574991
20 LinkedList отсортированный вставка 2 0.1474125999993703
21 LinkedList отсортированный поиск 2 0.00762140000006184
22 LinkedList отсортированный удаление 2 0.0051066999994873186
23 LinkedList отсортированный вставка 3 0.13767009999992297
24 LinkedList отсортированный поиск 3 0.0064199999997072155
25 LinkedList отсортированный удаление 3 0.005227899999226793
26 LinkedList отсортированный вставка 4 0.13925280000057683
27 LinkedList отсортированный поиск 4 0.006386400000337744
28 LinkedList отсортированный удаление 4 0.0049518000005264184
29 LinkedList отсортированный вставка 5 0.13541350000014063
30 LinkedList отсортированный поиск 5 0.006607199999962177
31 LinkedList отсортированный удаление 5 0.005551099999138387
32 HashTable случайный вставка 1 0.00123639999947045
33 HashTable случайный поиск 1 3.639999977167463e-05
34 HashTable случайный удаление 1 1.9799999790848233e-05
35 HashTable случайный вставка 2 0.000970699999925273
36 HashTable случайный поиск 2 3.259999994043028e-05
37 HashTable случайный удаление 2 1.7100000150094274e-05
38 HashTable случайный вставка 3 0.0009898999996948987
39 HashTable случайный поиск 3 3.20999997711624e-05
40 HashTable случайный удаление 3 1.7100000150094274e-05
41 HashTable случайный вставка 4 0.001140299999860872
42 HashTable случайный поиск 4 0.00010819999988598283
43 HashTable случайный удаление 4 4.2800000301213004e-05
44 HashTable случайный вставка 5 0.001704299999801151
45 HashTable случайный поиск 5 3.510000078676967e-05
46 HashTable случайный удаление 5 1.83000001925393e-05
47 HashTable отсортированный вставка 1 0.0009811999998419196
48 HashTable отсортированный поиск 1 3.110000034212135e-05
49 HashTable отсортированный удаление 1 1.9400000383029692e-05
50 HashTable отсортированный вставка 2 0.0009785000002011657
51 HashTable отсортированный поиск 2 3.1599999601894524e-05
52 HashTable отсортированный удаление 2 1.9800000700342935e-05
53 HashTable отсортированный вставка 3 0.0009659999996074475
54 HashTable отсортированный поиск 3 3.0500000320898835e-05
55 HashTable отсортированный удаление 3 1.9299999621580355e-05
56 HashTable отсортированный вставка 4 0.0009494000005361158
57 HashTable отсортированный поиск 4 2.989999939018162e-05
58 HashTable отсортированный удаление 4 1.8900000213761814e-05
59 HashTable отсортированный вставка 5 0.0012150000002293382
60 HashTable отсортированный поиск 5 3.480000032141106e-05
61 HashTable отсортированный удаление 5 2.0899999981338624e-05
62 BST случайный вставка 1 0.004831499999454536
63 BST случайный поиск 1 0.00013619999936054228
64 BST случайный удаление 1 9.070000032807002e-05
65 BST случайный вставка 2 0.005335699999704957
66 BST случайный поиск 2 0.00012989999959245324
67 BST случайный удаление 2 8.600000001024455e-05
68 BST случайный вставка 3 0.005207599999266677
69 BST случайный поиск 3 0.00013050000052317046
70 BST случайный удаление 3 8.580000030633528e-05
71 BST случайный вставка 4 0.005297200000313751
72 BST случайный поиск 4 0.00013440000020636944
73 BST случайный удаление 4 8.789999992586672e-05
74 BST случайный вставка 5 0.005037799999627168
75 BST случайный поиск 5 0.000649399999929301
76 BST случайный удаление 5 0.0001084000004993868
77 BST отсортированный вставка 1 0.8110883999997895
78 BST отсортированный поиск 1 0.019361399999979767
79 BST отсортированный удаление 1 0.014678200000162178
80 BST отсортированный вставка 2 0.7911546999994243
81 BST отсортированный поиск 2 0.019212399999560148
82 BST отсортированный удаление 2 0.013222700000369514
83 BST отсортированный вставка 3 0.7786938999997801
84 BST отсортированный поиск 3 0.01864480000040203
85 BST отсортированный удаление 3 0.013478699999723176
86 BST отсортированный вставка 4 0.7826362000005247
87 BST отсортированный поиск 4 0.01973920000000362
88 BST отсортированный удаление 4 0.013336900000467722
89 BST отсортированный вставка 5 0.7718632000005528
90 BST отсортированный поиск 5 0.02021930000046268
91 BST отсортированный удаление 5 0.013186899999709567

View File

@ -154,4 +154,126 @@ def bst_list_all(root):
records.append((node['name'], node['phone']))
_inorder(node['right'])
_inorder(root)
return records
return records
# ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ
def run_experiments():
N = 3000
HASH_SIZE = 1007
print(f"генерация тестовых данных для N = {N}...")
records_sorted = [(f"User_{i:05d}", f"+7999123{i:04d}") for i in range(N)]
records_shuffled = records_sorted.copy()
random.seed(42)
random.shuffle(records_shuffled)
# подготовка выборок
existing_sample = [r[0] for r in random.sample(records_sorted, min(100, N))]
non_existing_sample = [f"None_{i}" for i in range(10)]
search_names = existing_sample + non_existing_sample
delete_names = [r[0] for r in random.sample(records_sorted, min(50, N))]
csv_rows = [["структура", "режим", "операция", "повторение", "время (сек)"]]
modes = [("случайный", records_shuffled), ("отсортированный", records_sorted)]
print("запуск экспериментов (5 повторений для каждого режима)")
# ТЕСТ: СВЯЗНЫЙ СПИСОК
for mode_name, data in modes:
for rep in range(1, 6):
head = None
t_start = time.perf_counter()
for name, phone in data:
head = ll_insert(head, name, phone)
t_end = time.perf_counter()
csv_rows.append(["LinkedList", mode_name, "вставка", rep, t_end - t_start])
t_start = time.perf_counter()
for name in search_names:
ll_find(head, name)
t_end = time.perf_counter()
csv_rows.append(["LinkedList", mode_name, "поиск", rep, t_end - t_start])
t_start = time.perf_counter()
for name in delete_names:
head = ll_delete(head, name)
t_end = time.perf_counter()
csv_rows.append(["LinkedList", mode_name, "удаление", rep, t_end - t_start])
# ТЕСТ: ХЕШ-ТАБЛИЦА
for mode_name, data in modes:
for rep in range(1, 6):
buckets = [None] * HASH_SIZE
t_start = time.perf_counter()
for name, phone in data:
ht_insert(buckets, name, phone)
t_end = time.perf_counter()
csv_rows.append(["HashTable", mode_name, "вставка", rep, t_end - t_start])
t_start = time.perf_counter()
for name in search_names:
ht_find(buckets, name)
t_end = time.perf_counter()
csv_rows.append(["HashTable", mode_name, "поиск", rep, t_end - t_start])
t_start = time.perf_counter()
for name in delete_names:
ht_delete(buckets, name)
t_end = time.perf_counter()
csv_rows.append(["HashTable", mode_name, "удаление", rep, t_end - t_start])
# ТЕСТ: ДЕРЕВО ПОИСКА (BST)
for mode_name, data in modes:
for rep in range(1, 6):
root = None
t_start = time.perf_counter()
for name, phone in data:
root = bst_insert(root, name, phone)
t_end = time.perf_counter()
csv_rows.append(["BST", mode_name, "вставка", rep, t_end - t_start])
t_start = time.perf_counter()
for name in search_names:
bst_find(root, name)
t_end = time.perf_counter()
csv_rows.append(["BST", mode_name, "поиск", rep, t_end - t_start])
t_start = time.perf_counter()
for name in delete_names:
root = bst_delete(root, name)
t_end = time.perf_counter()
csv_rows.append(["BST", mode_name, "удаление", rep, t_end - t_start])
# сохранение в csv
with open("results.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerows(csv_rows)
print("\nвсе замеры сохранены в файл 'results.csv'.")
show_summary(csv_rows)
# функция для подсчета и вывода среднего времени
def show_summary(rows):
summary = defaultdict(list)
for row in rows[1:]:
struct, mode, op, rep, elapsed = row
summary[(struct, mode, op)].append(elapsed)
print("\nСВОДНЫЕ РЕЗУЛЬТАТЫ (СРЕДНЕЕ ВРЕМЯ ИЗ 5 ЗАПУСКОВ)")
print(f"{'структура':<12} | {'режим данных':<15} | {'операция':<10} | {'время (сек)':<12}")
print("-" * 59)
for (struct, mode, op), times in sorted(summary.items()):
avg_time = sum(times) / len(times)
print(f"{struct:<12} | {mode:<15} | {op:<10} | {avg_time:.6f}")
if __name__ == "__main__":
run_experiments()