From 6ea13ecb26b5c3c833fded2815e592359516fc7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Mon, 18 May 2026 15:11:59 +0300 Subject: [PATCH] [1] add timing tests and results --- raskatovia/docs/data/task1/results.csv | 109 +++++++++++++++++++ raskatovia/docs/data/task1/zamery.py | 141 +++++++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 raskatovia/docs/data/task1/results.csv create mode 100644 raskatovia/docs/data/task1/zamery.py diff --git a/raskatovia/docs/data/task1/results.csv b/raskatovia/docs/data/task1/results.csv new file mode 100644 index 0000000..eba5318 --- /dev/null +++ b/raskatovia/docs/data/task1/results.csv @@ -0,0 +1,109 @@ +Структура,Режим,Операция,Замер,Время (сек) +Связный список,Случайный,Вставка,1,18.650031568482518 +Связный список,Случайный,Вставка,2,18.696410017088056 +Связный список,Случайный,Вставка,3,17.576973121613264 +Связный список,Случайный,Вставка,4,16.589464861899614 +Связный список,Случайный,Вставка,5,16.205514946952462 +Связный список,Случайный,Вставка,Среднее,17.543678903207184 +Связный список,Случайный,Поиск,1,0.15266339667141438 +Связный список,Случайный,Поиск,2,0.16375628858804703 +Связный список,Случайный,Поиск,3,0.12933312729001045 +Связный список,Случайный,Поиск,4,0.13891681656241417 +Связный список,Случайный,Поиск,5,0.14089339599013329 +Связный список,Случайный,Поиск,Среднее,0.14511260502040385 +Связный список,Случайный,Удаление,1,0.07620067708194256 +Связный список,Случайный,Удаление,2,0.09449147805571556 +Связный список,Случайный,Удаление,3,0.08359903283417225 +Связный список,Случайный,Удаление,4,0.09074903465807438 +Связный список,Случайный,Удаление,5,0.08376427739858627 +Связный список,Случайный,Удаление,Среднее,0.0857609000056982 +Связный список,Отсортированный,Вставка,1,15.179195748642087 +Связный список,Отсортированный,Вставка,2,15.626798518002033 +Связный список,Отсортированный,Вставка,3,15.150643169879913 +Связный список,Отсортированный,Вставка,4,14.520009176805615 +Связный список,Отсортированный,Вставка,5,14.595012564212084 +Связный список,Отсортированный,Вставка,Среднее,15.014331835508347 +Связный список,Отсортированный,Поиск,1,0.11738761514425278 +Связный список,Отсортированный,Поиск,2,0.1201033927500248 +Связный список,Отсортированный,Поиск,3,0.1553904190659523 +Связный список,Отсортированный,Поиск,4,0.12524455040693283 +Связный список,Отсортированный,Поиск,5,0.11648610420525074 +Связный список,Отсортированный,Поиск,Среднее,0.1269224163144827 +Связный список,Отсортированный,Удаление,1,0.08444823324680328 +Связный список,Отсортированный,Удаление,2,0.0750405415892601 +Связный список,Отсортированный,Удаление,3,0.0696138758212328 +Связный список,Отсортированный,Удаление,4,0.07685920968651772 +Связный список,Отсортированный,Удаление,5,0.06544658727943897 +Связный список,Отсортированный,Удаление,Среднее,0.07428168952465057 +Хеш-таблица,Случайный,Вставка,1,0.8925542905926704 +Хеш-таблица,Случайный,Вставка,2,0.9055562932044268 +Хеш-таблица,Случайный,Вставка,3,0.9032609593123198 +Хеш-таблица,Случайный,Вставка,4,0.8939349129796028 +Хеш-таблица,Случайный,Вставка,5,0.8801330886781216 +Хеш-таблица,Случайный,Вставка,Среднее,0.8950879089534283 +Хеш-таблица,Случайный,Поиск,1,0.007984047755599022 +Хеш-таблица,Случайный,Поиск,2,0.007909735664725304 +Хеш-таблица,Случайный,Поиск,3,0.007135823369026184 +Хеш-таблица,Случайный,Поиск,4,0.007862800732254982 +Хеш-таблица,Случайный,Поиск,5,0.00866653397679329 +Хеш-таблица,Случайный,Поиск,Среднее,0.007911788299679756 +Хеш-таблица,Случайный,Удаление,1,0.005503913387656212 +Хеш-таблица,Случайный,Удаление,2,0.005658401176333427 +Хеш-таблица,Случайный,Удаление,3,0.00445329025387764 +Хеш-таблица,Случайный,Удаление,4,0.005032133311033249 +Хеш-таблица,Случайный,Удаление,5,0.00463026762008667 +Хеш-таблица,Случайный,Удаление,Среднее,0.00505560114979744 +Хеш-таблица,Отсортированный,Вставка,1,0.8290290385484695 +Хеш-таблица,Отсортированный,Вставка,2,0.8197460155934095 +Хеш-таблица,Отсортированный,Вставка,3,0.8217651266604662 +Хеш-таблица,Отсортированный,Вставка,4,0.8248847275972366 +Хеш-таблица,Отсортированный,Вставка,5,0.8270500153303146 +Хеш-таблица,Отсортированный,Вставка,Среднее,0.8244949847459793 +Хеш-таблица,Отсортированный,Поиск,1,0.008095510303974152 +Хеш-таблица,Отсортированный,Поиск,2,0.007643779739737511 +Хеш-таблица,Отсортированный,Поиск,3,0.007320135831832886 +Хеш-таблица,Отсортированный,Поиск,4,0.007490267977118492 +Хеш-таблица,Отсортированный,Поиск,5,0.0073973797261714935 +Хеш-таблица,Отсортированный,Поиск,Среднее,0.007589414715766907 +Хеш-таблица,Отсортированный,Удаление,1,0.0041198693215847015 +Хеш-таблица,Отсортированный,Удаление,2,0.005096178501844406 +Хеш-таблица,Отсортированный,Удаление,3,0.0038871560245752335 +Хеш-таблица,Отсортированный,Удаление,4,0.004979334771633148 +Хеш-таблица,Отсортированный,Удаление,5,0.005531288683414459 +Хеш-таблица,Отсортированный,Удаление,Среднее,0.0047227654606103895 +BST,Случайный,Вставка,1,0.061682142317295074 +BST,Случайный,Вставка,2,0.06325294077396393 +BST,Случайный,Вставка,3,0.06278556399047375 +BST,Случайный,Вставка,4,0.06266334094107151 +BST,Случайный,Вставка,5,0.0640009418129921 +BST,Случайный,Вставка,Среднее,0.06287698596715927 +BST,Случайный,Поиск,1,0.0005436446517705917 +BST,Случайный,Поиск,2,0.0005729794502258301 +BST,Случайный,Поиск,3,0.0005832426249980927 +BST,Случайный,Поиск,4,0.0005539115518331528 +BST,Случайный,Поиск,5,0.0005719996988773346 +BST,Случайный,Поиск,Среднее,0.0005651555955410003 +BST,Случайный,Удаление,1,0.00034173205494880676 +BST,Случайный,Удаление,2,0.00031582266092300415 +BST,Случайный,Удаление,3,0.000333910807967186 +BST,Случайный,Удаление,4,0.00034319981932640076 +BST,Случайный,Удаление,5,0.000340266153216362 +BST,Случайный,Удаление,Среднее,0.0003349862992763519 +BST,Отсортированный,Вставка,1,23.19616787880659 +BST,Отсортированный,Вставка,2,22.920896999537945 +BST,Отсортированный,Вставка,3,22.561782151460648 +BST,Отсортированный,Вставка,4,22.217343267053366 +BST,Отсортированный,Вставка,5,24.517986714839935 +BST,Отсортированный,Вставка,Среднее,23.082835402339697 +BST,Отсортированный,Поиск,1,0.1749225128442049 +BST,Отсортированный,Поиск,2,0.15511077642440796 +BST,Отсортированный,Поиск,3,0.15050886385142803 +BST,Отсортированный,Поиск,4,0.17243162170052528 +BST,Отсортированный,Поиск,5,0.19662086851894855 +BST,Отсортированный,Поиск,Среднее,0.16991892866790295 +BST,Отсортированный,Удаление,1,0.09117730148136616 +BST,Отсортированный,Удаление,2,0.09206805564463139 +BST,Отсортированный,Удаление,3,0.09830334596335888 +BST,Отсортированный,Удаление,4,0.08749254420399666 +BST,Отсортированный,Удаление,5,0.11593561433255672 +BST,Отсортированный,Удаление,Среднее,0.09699537232518196 diff --git a/raskatovia/docs/data/task1/zamery.py b/raskatovia/docs/data/task1/zamery.py new file mode 100644 index 0000000..47afb61 --- /dev/null +++ b/raskatovia/docs/data/task1/zamery.py @@ -0,0 +1,141 @@ +import csv +import random +import time +from spravochnik import * + +COUNT = 10000 +REPEATS = 5 + +def make_records(): + records = [] + for i in range(COUNT): + name = f"User_{i:05d}" + phone = str(89000000000 + i) + records.append((name, phone)) + shuffled = records[:] + random.shuffle(shuffled) + ordered = sorted(records, key=lambda item: item[0]) + return shuffled, ordered + +def make_search_names(records): + existing = [item[0] for item in random.sample(records, 100)] + missing = [f"None_{i}" for i in range(10)] + return existing + missing + +def make_delete_names(records): + return [item[0] for item in random.sample(records, 50)] + +def average(values): + return sum(values) / len(values) + +def test_list(records): + insert_times = [] + find_times = [] + delete_times = [] + for _ in range(REPEATS): + head = None + start = time.perf_counter() + for name, phone in records: + head = ll_insert(head, name, phone) + insert_times.append(time.perf_counter() - start) + + search_names = make_search_names(records) + start = time.perf_counter() + for name in search_names: + ll_find(head, name) + find_times.append(time.perf_counter() - start) + + delete_names = make_delete_names(records) + start = time.perf_counter() + for name in delete_names: + head = ll_delete(head, name) + delete_times.append(time.perf_counter() - start) + + return insert_times, find_times, delete_times + +def test_hash(records): + insert_times = [] + find_times = [] + delete_times = [] + for _ in range(REPEATS): + table = ht_create() + start = time.perf_counter() + for name, phone in records: + ht_insert(table, name, phone) + insert_times.append(time.perf_counter() - start) + + search_names = make_search_names(records) + start = time.perf_counter() + for name in search_names: + ht_find(table, name) + find_times.append(time.perf_counter() - start) + + delete_names = make_delete_names(records) + start = time.perf_counter() + for name in delete_names: + ht_delete(table, name) + delete_times.append(time.perf_counter() - start) + + return insert_times, find_times, delete_times + +def test_bst(records): + insert_times = [] + find_times = [] + delete_times = [] + for _ in range(REPEATS): + root = None + start = time.perf_counter() + for name, phone in records: + root = bst_insert(root, name, phone) + insert_times.append(time.perf_counter() - start) + + search_names = make_search_names(records) + start = time.perf_counter() + for name in search_names: + bst_find(root, name) + find_times.append(time.perf_counter() - start) + + delete_names = make_delete_names(records) + start = time.perf_counter() + for name in delete_names: + root = bst_delete(root, name) + delete_times.append(time.perf_counter() - start) + + return insert_times, find_times, delete_times + +def add_rows(rows, structure, mode, result): + names = ["Вставка", "Поиск", "Удаление"] + for operation, times in zip(names, result): + for number, value in enumerate(times, 1): + rows.append([structure, mode, operation, number, value]) + rows.append([structure, mode, operation, "Среднее", average(times)]) + +def main(): + shuffled, ordered = make_records() + rows = [["Структура", "Режим", "Операция", "Замер", "Время (сек)"]] + + print("Связный список, случайный порядок") + add_rows(rows, "Связный список", "Случайный", test_list(shuffled)) + + print("Связный список, отсортированный порядок") + add_rows(rows, "Связный список", "Отсортированный", test_list(ordered)) + + print("Хеш-таблица, случайный порядок") + add_rows(rows, "Хеш-таблица", "Случайный", test_hash(shuffled)) + + print("Хеш-таблица, отсортированный порядок") + add_rows(rows, "Хеш-таблица", "Отсортированный", test_hash(ordered)) + + print("BST, случайный порядок") + add_rows(rows, "BST", "Случайный", test_bst(shuffled)) + + print("BST, отсортированный порядок") + add_rows(rows, "BST", "Отсортированный", test_bst(ordered)) + + with open("raskatovia/docs/data/task1/results.csv", "w", newline="", encoding="utf-8") as file: + writer = csv.writer(file) + writer.writerows(rows) + + print("Результаты сохранены в results.csv") + +main() \ No newline at end of file