From 098e0f3a32a1d0cea93f6cdef89e31c5b312357f Mon Sep 17 00:00:00 2001 From: Sorokin Fedor Date: Wed, 20 May 2026 15:20:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=201:?= =?UTF-8?q?=20=D1=8D=D0=BA=D1=81=D0=BF=D0=B5=D1=80=D0=B8=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=82=D1=8C,=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- results.csv | 91 ++++++++++++++++++++++++++++++++++ sorokinfi/427.md | 124 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 results.csv diff --git a/results.csv b/results.csv new file mode 100644 index 0000000..cd5145e --- /dev/null +++ b/results.csv @@ -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 diff --git a/sorokinfi/427.md b/sorokinfi/427.md index 04adbd1..a84d3d9 100644 --- a/sorokinfi/427.md +++ b/sorokinfi/427.md @@ -154,4 +154,126 @@ def bst_list_all(root): records.append((node['name'], node['phone'])) _inorder(node['right']) _inorder(root) - return records \ No newline at end of file + 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() + + +