diff --git a/benchmark_chart.png b/benchmark_chart.png new file mode 100644 index 0000000..84c386e Binary files /dev/null and b/benchmark_chart.png differ diff --git a/results.csv b/results.csv index cd5145e..4891afc 100644 --- a/results.csv +++ b/results.csv @@ -1,91 +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 +LinkedList,случайный,вставка,1,0.13309969999954774 +LinkedList,случайный,поиск,1,0.009379099999932805 +LinkedList,случайный,удаление,1,0.004902000000583939 +LinkedList,случайный,вставка,2,0.11298999999962689 +LinkedList,случайный,поиск,2,0.00728259999959846 +LinkedList,случайный,удаление,2,0.003859800000100222 +LinkedList,случайный,вставка,3,0.12435430000004999 +LinkedList,случайный,поиск,3,0.006995800000368035 +LinkedList,случайный,удаление,3,0.0038894999997864943 +LinkedList,случайный,вставка,4,0.11281289999988076 +LinkedList,случайный,поиск,4,0.0073154000001522945 +LinkedList,случайный,удаление,4,0.004016099999716971 +LinkedList,случайный,вставка,5,0.12206900000001042 +LinkedList,случайный,поиск,5,0.007770400000481459 +LinkedList,случайный,удаление,5,0.0039008999992802273 +LinkedList,отсортированный,вставка,1,0.12199670000063634 +LinkedList,отсортированный,поиск,1,0.006072700000004261 +LinkedList,отсортированный,удаление,1,0.004619700000148441 +LinkedList,отсортированный,вставка,2,0.11778119999962655 +LinkedList,отсортированный,поиск,2,0.005873400000382389 +LinkedList,отсортированный,удаление,2,0.004716499999631196 +LinkedList,отсортированный,вставка,3,0.11716749999959575 +LinkedList,отсортированный,поиск,3,0.006211500000063097 +LinkedList,отсортированный,удаление,3,0.004824199999347911 +LinkedList,отсортированный,вставка,4,0.1168800999994346 +LinkedList,отсортированный,поиск,4,0.00615879999986646 +LinkedList,отсортированный,удаление,4,0.004850500000429747 +LinkedList,отсортированный,вставка,5,0.12217359999976907 +LinkedList,отсортированный,поиск,5,0.0060359999997672276 +LinkedList,отсортированный,удаление,5,0.0046704000005775015 +HashTable,случайный,вставка,1,0.001177799999823037 +HashTable,случайный,поиск,1,3.729999934876105e-05 +HashTable,случайный,удаление,1,2.009999934671214e-05 +HashTable,случайный,вставка,2,0.001008700000056706 +HashTable,случайный,поиск,2,3.290000040578889e-05 +HashTable,случайный,удаление,2,1.6900000446185004e-05 +HashTable,случайный,вставка,3,0.0010118999998667277 +HashTable,случайный,поиск,3,3.500000002532033e-05 +HashTable,случайный,удаление,3,2.0599999515980016e-05 +HashTable,случайный,вставка,4,0.0010044999999081483 +HashTable,случайный,поиск,4,3.1800000215298496e-05 +HashTable,случайный,удаление,4,1.700000029813964e-05 +HashTable,случайный,вставка,5,0.001006999999844993 +HashTable,случайный,поиск,5,3.1599999601894524e-05 +HashTable,случайный,удаление,5,1.649999921937706e-05 +HashTable,отсортированный,вставка,1,0.0009728999993967591 +HashTable,отсортированный,поиск,1,3.0100000003585592e-05 +HashTable,отсортированный,удаление,1,1.9299999621580355e-05 +HashTable,отсортированный,вставка,2,0.0009723000002850313 +HashTable,отсортированный,поиск,2,2.9599999834317714e-05 +HashTable,отсортированный,удаление,2,1.919999976962572e-05 +HashTable,отсортированный,вставка,3,0.0009663999999247608 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 +HashTable,отсортированный,удаление,3,1.9699999938893598e-05 +HashTable,отсортированный,вставка,4,0.0011242000000493135 +HashTable,отсортированный,поиск,4,3.400000059627928e-05 +HashTable,отсортированный,удаление,4,2.080000012938399e-05 +HashTable,отсортированный,вставка,5,0.0009773000001587206 +HashTable,отсортированный,поиск,5,3.100000049016671e-05 +HashTable,отсортированный,удаление,5,1.9699999938893598e-05 +BST,случайный,вставка,1,0.004384899999422487 +BST,случайный,поиск,1,0.0001329000006080605 +BST,случайный,удаление,1,8.230000003095483e-05 +BST,случайный,вставка,2,0.004304400000364694 +BST,случайный,поиск,2,0.00014240000018617138 +BST,случайный,удаление,2,8.129999969241908e-05 +BST,случайный,вставка,3,0.004376699999738776 +BST,случайный,поиск,3,0.00014179999925545417 +BST,случайный,удаление,3,8.269999943877338e-05 +BST,случайный,вставка,4,0.004673599999478029 +BST,случайный,поиск,4,0.0001511999998911051 +BST,случайный,удаление,4,0.00012150000020483276 +BST,случайный,вставка,5,0.004335399999945366 +BST,случайный,поиск,5,0.00013080000007903436 +BST,случайный,удаление,5,7.93999997767969e-05 +BST,отсортированный,вставка,1,0.7882552000000942 +BST,отсортированный,поиск,1,0.01960369999960676 +BST,отсортированный,удаление,1,0.013939499999651161 +BST,отсортированный,вставка,2,0.7601769000002605 +BST,отсортированный,поиск,2,0.019820599999547994 +BST,отсортированный,удаление,2,0.01359989999946265 +BST,отсортированный,вставка,3,0.741146899999876 +BST,отсортированный,поиск,3,0.018209700000625162 +BST,отсортированный,удаление,3,0.012622499999451975 +BST,отсортированный,вставка,4,0.7348717000004399 +BST,отсортированный,поиск,4,0.01830170000084763 +BST,отсортированный,удаление,4,0.012606900000719179 +BST,отсортированный,вставка,5,0.7420961000007082 +BST,отсортированный,поиск,5,0.018224400000690366 +BST,отсортированный,удаление,5,0.012539400000605383 diff --git a/sorokinfi/427.md b/sorokinfi/427.md index a84d3d9..f2b1dc8 100644 --- a/sorokinfi/427.md +++ b/sorokinfi/427.md @@ -3,6 +3,8 @@ import random import sys import time from collections import defaultdict +import pandas as pd +import matplotlib.pyplot as plt # увеличиваем лимит рекурсии sys.setrecursionlimit(25000) @@ -157,7 +159,7 @@ def bst_list_all(root): return records -# ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ +# 4. ЭКСПЕРИМЕНТАЛЬНАЯ ЧАСТЬ def run_experiments(): N = 3000 @@ -272,8 +274,75 @@ def show_summary(rows): print(f"{struct:<12} | {mode:<15} | {op:<10} | {avg_time:.6f}") + +# 5. АНАЛИЗ РЕЗУЛЬТАТОВ + +def plot_results(csv_filename="results.csv"): + print("построение графика") + try: + df = pd.read_csv(csv_filename) + + df_insert = df[df["операция"] == "вставка"] + + pivot_df = df_insert.pivot_table( + index="структура", + columns="режим", + values="время (сек)", + aggfunc="mean" + ) + + pivot_df.plot(kind="bar", figsize=(10, 6), color=['#1f77b4', '#ff7f0e']) + + plt.title("сравнение времени вставки (N=3000)") + plt.ylabel("среднее время выполнения (сек)") + plt.xlabel("структура данных") + plt.xticks(rotation=0) + plt.grid(axis='y', linestyle='--', alpha=0.7) + plt.savefig("benchmark_chart.png") + print("график сохранен как benchmark_chart.png") + plt.show() + + except FileNotFoundError: + print(f"файл {csv_filename} не найден. сначала запустите тесты.") + + +def print_report(): + report = """ + + 5. АНАЛИЗ РЕЗУЛЬТАТОВ ЭКСПЕРИМЕНТОВ + +1. Влияние порядка входных данных на скорость вставки в BST: + - На случайных данных BST строится сбалансированным. Высота дерева составляет + примерно O(log N), поэтому вставка происходит почти мгновенно. + - На отсортированных данных происходит ДЕГРАДАЦИЯ дерева. Каждый элемент больше + предыдущего и вставляется строго вправо. Дерево вырождается в связный список. + Сложность возрастает до O(N), что отчетливо видно по гигантскому пику на графике. + +2. Чувствительность Хеш-таблицы к порядку: + - Хеш-таблица НЕ ЧУВСТВИТЕЛЬНА к порядку данных. Математическая хеш-функция + превращает любое имя в хаотичный индекс и равномерно распределяет записи + по бакетам. В обоих режимах операции выполняются за константное время O(1). + +3. Почему связный список всегда медленен при поиске: + - У связного списка нет индексов для прямого доступа. Поиск всегда линейный O(N) + — алгоритм вынужден последовательно перебирать элементы от головы к хвосту. + +4. Как удаление работает в каждой структуре: + - Связный список: O(N) затрачивается на линейный поиск узла, само удаление — O(1). + - Хеш-таблица: O(1) нахождение бакета по хешу, удаление из цепочки коллизий мгновенно. + - BST: В среднем O(log N), в худшем O(N). Требует поиска узла и перестройки связей + (замена удаляемого узла на его потомка или минимальный элемент правого поддерева). + +ВЫВОД: + - ДЛЯ ЧАСТЫХ ВСТАВОК И ПОИСКА: Идеально подходит Хеш-таблица благодаря скорости O(1). + - ДЛЯ ПОЛУЧЕНИЯ ДАННЫХ В ПОРЯДКЕ (АЛФАВИТНОМ): Стоит выбирать Двоичное дерево поиска + (BST), так как обход дерева (In-order traversal) сразу выдает отсортированные данные. + """ + print(report) + if __name__ == "__main__": run_experiments() - + plot_results() + print_report()