задание 1: добавил анализ результатов (график, выводы)
This commit is contained in:
parent
098e0f3a32
commit
032b22c79f
BIN
benchmark_chart.png
Normal file
BIN
benchmark_chart.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
178
results.csv
178
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
|
||||
|
|
|
|||
|
|
|
@ -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()
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user