add plots

This commit is contained in:
SobolevNS 2026-05-22 12:22:08 +03:00
parent 2ff608b88f
commit 5827416a2b
6 changed files with 230 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -0,0 +1,112 @@
Структура,Режим,Операция,N,Trial,Время (сек)
LinkedList,shuffled,insert,10000,1,3.995075
LinkedList,shuffled,insert,10000,2,4.133491
LinkedList,shuffled,insert,10000,3,4.067831
LinkedList,shuffled,insert,10000,4,4.075638
LinkedList,shuffled,insert,10000,5,4.059367
LinkedList,shuffled,find,10000,1,0.037171
LinkedList,shuffled,find,10000,2,0.035212
LinkedList,shuffled,find,10000,3,0.040434
LinkedList,shuffled,find,10000,4,0.030968
LinkedList,shuffled,find,10000,5,0.033432
LinkedList,shuffled,delete,10000,1,0.014029
LinkedList,shuffled,delete,10000,2,0.016408
LinkedList,shuffled,delete,10000,3,0.017498
LinkedList,shuffled,delete,10000,4,0.013770
LinkedList,shuffled,delete,10000,5,0.016273
LinkedList,sorted,insert,10000,1,3.083864
LinkedList,sorted,insert,10000,2,3.123097
LinkedList,sorted,insert,10000,3,3.084625
LinkedList,sorted,insert,10000,4,3.200015
LinkedList,sorted,insert,10000,5,3.124164
LinkedList,sorted,find,10000,1,0.029411
LinkedList,sorted,find,10000,2,0.029928
LinkedList,sorted,find,10000,3,0.027749
LinkedList,sorted,find,10000,4,0.032859
LinkedList,sorted,find,10000,5,0.032080
LinkedList,sorted,delete,10000,1,0.016454
LinkedList,sorted,delete,10000,2,0.013526
LinkedList,sorted,delete,10000,3,0.015424
LinkedList,sorted,delete,10000,4,0.014688
LinkedList,sorted,delete,10000,5,0.012838
HashTable,shuffled,insert,10000,1,0.007074
HashTable,shuffled,insert,10000,2,0.006665
HashTable,shuffled,insert,10000,3,0.007361
HashTable,shuffled,insert,10000,4,0.007405
HashTable,shuffled,insert,10000,5,0.007248
HashTable,shuffled,find,10000,1,0.000072
HashTable,shuffled,find,10000,2,0.000062
HashTable,shuffled,find,10000,3,0.000063
HashTable,shuffled,find,10000,4,0.000062
HashTable,shuffled,find,10000,5,0.000066
HashTable,shuffled,delete,10000,1,0.000037
HashTable,shuffled,delete,10000,2,0.000034
HashTable,shuffled,delete,10000,3,0.000032
HashTable,shuffled,delete,10000,4,0.000030
HashTable,shuffled,delete,10000,5,0.000032
HashTable,sorted,insert,10000,1,0.007131
HashTable,sorted,insert,10000,2,0.006610
HashTable,sorted,insert,10000,3,0.006701
HashTable,sorted,insert,10000,4,0.006979
HashTable,sorted,insert,10000,5,0.008910
HashTable,sorted,find,10000,1,0.000065
HashTable,sorted,find,10000,2,0.000056
HashTable,sorted,find,10000,3,0.000068
HashTable,sorted,find,10000,4,0.000066
HashTable,sorted,find,10000,5,0.000076
HashTable,sorted,delete,10000,1,0.000036
HashTable,sorted,delete,10000,2,0.000037
HashTable,sorted,delete,10000,3,0.000038
HashTable,sorted,delete,10000,4,0.000045
HashTable,sorted,delete,10000,5,0.000042
BST,shuffled,insert,10000,1,0.018043
BST,shuffled,insert,10000,2,0.019312
BST,shuffled,insert,10000,3,0.017282
BST,shuffled,insert,10000,4,0.021092
BST,shuffled,insert,10000,5,0.016847
BST,shuffled,find,10000,1,0.000157
BST,shuffled,find,10000,2,0.000210
BST,shuffled,find,10000,3,0.000168
BST,shuffled,find,10000,4,0.000138
BST,shuffled,find,10000,5,0.000193
BST,shuffled,delete,10000,1,0.000129
BST,shuffled,delete,10000,2,0.000147
BST,shuffled,delete,10000,3,0.000122
BST,shuffled,delete,10000,4,0.000161
BST,shuffled,delete,10000,5,0.000128
BST,sorted,insert,2000,1,0.123235
BST,sorted,insert,2000,2,0.118658
BST,sorted,insert,2000,3,0.119944
BST,sorted,insert,2000,4,0.121595
BST,sorted,insert,2000,5,0.116209
BST,sorted,find,2000,1,0.005019
BST,sorted,find,2000,2,0.005133
BST,sorted,find,2000,3,0.005032
BST,sorted,find,2000,4,0.004812
BST,sorted,find,2000,5,0.004964
BST,sorted,delete,2000,1,0.008319
BST,sorted,delete,2000,2,0.007798
BST,sorted,delete,2000,3,0.007584
BST,sorted,delete,2000,4,0.008061
BST,sorted,delete,2000,5,0.007642
--- СРЕДНИЕ ---
Структура,Режим,Операция,N,Среднее (сек),Все замеры (сек)
LinkedList,shuffled,insert,10000,4.066280,3.995075;4.133491;4.067831;4.075638;4.059367
LinkedList,shuffled,find,10000,0.035443,0.037171;0.035212;0.040434;0.030968;0.033432
LinkedList,shuffled,delete,10000,0.015596,0.014029;0.016408;0.017498;0.013770;0.016273
LinkedList,sorted,insert,10000,3.123153,3.083864;3.123097;3.084625;3.200015;3.124164
LinkedList,sorted,find,10000,0.030406,0.029411;0.029928;0.027749;0.032859;0.032080
LinkedList,sorted,delete,10000,0.014586,0.016454;0.013526;0.015424;0.014688;0.012838
HashTable,shuffled,insert,10000,0.007151,0.007074;0.006665;0.007361;0.007405;0.007248
HashTable,shuffled,find,10000,0.000065,0.000072;0.000062;0.000063;0.000062;0.000066
HashTable,shuffled,delete,10000,0.000033,0.000037;0.000034;0.000032;0.000030;0.000032
HashTable,sorted,insert,10000,0.007266,0.007131;0.006610;0.006701;0.006979;0.008910
HashTable,sorted,find,10000,0.000066,0.000065;0.000056;0.000068;0.000066;0.000076
HashTable,sorted,delete,10000,0.000040,0.000036;0.000037;0.000038;0.000045;0.000042
BST,shuffled,insert,10000,0.018515,0.018043;0.019312;0.017282;0.021092;0.016847
BST,shuffled,find,10000,0.000173,0.000157;0.000210;0.000168;0.000138;0.000193
BST,shuffled,delete,10000,0.000138,0.000129;0.000147;0.000122;0.000161;0.000128
BST,sorted,insert,2000,0.119928,0.123235;0.118658;0.119944;0.121595;0.116209
BST,sorted,find,2000,0.004992,0.005019;0.005133;0.005032;0.004812;0.004964
BST,sorted,delete,2000,0.007881,0.008319;0.007798;0.007584;0.008061;0.007642
Can't render this file because it has a wrong number of fields in line 93.

View File

@ -0,0 +1,118 @@
"""
plot_results.py - строит столбчатые диаграммы по итогам экспериментов.
"""
import csv
import os
import matplotlib.pyplot as plt
import numpy as np
CSV = os.path.join("docs", "data", "results.csv")
PLOTS_DIR = os.path.join("docs", "data", "plots")
os.makedirs(PLOTS_DIR, exist_ok=True)
def load_means():
"""Возвращает dict[(structure, mode, op)] = (mean, N)."""
means = {}
with open(CSV, encoding="utf-8") as f:
rows = list(csv.reader(f))
# ищем секцию "--- СРЕДНИЕ ---"
start = None
for i, row in enumerate(rows):
if row and row[0] == "--- СРЕДНИЕ ---":
start = i + 2 # пропустить заголовок секции
break
for row in rows[start:]:
if not row:
continue
structure, mode, op, n, mean, _trials = row
means[(structure, mode, op)] = (float(mean), int(n))
return means
def plot_grouped(means, op, fname, title):
"""Сгруппированные столбцы: для каждой структуры - два столбца (shuffled / sorted)."""
structures = ["LinkedList", "HashTable", "BST"]
modes = ["shuffled", "sorted"]
x = np.arange(len(structures))
width = 0.36
fig, ax = plt.subplots(figsize=(8, 5))
for i, mode in enumerate(modes):
vals_ms = []
labels = []
for s in structures:
mean, n = means[(s, mode, op)]
vals_ms.append(mean * 1000)
labels.append(f"N={n}")
bars = ax.bar(x + (i - 0.5) * width, vals_ms, width,
label=mode, alpha=0.85)
for bar, lab in zip(bars, labels):
h = bar.get_height()
ax.text(bar.get_x() + bar.get_width() / 2, h,
f"{h:.2f}\n{lab}", ha="center", va="bottom", fontsize=8)
ax.set_xticks(x)
ax.set_xticklabels(structures)
ax.set_ylabel("Время, мс (среднее по 5 запускам)")
ax.set_title(title)
ax.set_yscale("log")
ax.legend(title="порядок входных данных")
ax.grid(axis="y", linestyle="--", alpha=0.4)
plt.tight_layout()
out = os.path.join(PLOTS_DIR, fname)
plt.savefig(out, dpi=130)
plt.close()
print("saved:", out)
def plot_bst_degradation(means, fname):
"""Отдельный график: BST shuffled vs sorted - даже при меньшем N
отсортированные данные дают намного большее время."""
ops = ["insert", "find", "delete"]
shuffled = [means[("BST", "shuffled", op)][0] * 1000 for op in ops]
sorted_ = [means[("BST", "sorted", op)][0] * 1000 for op in ops]
n_shuf = means[("BST", "shuffled", "insert")][1]
n_sort = means[("BST", "sorted", "insert")][1]
x = np.arange(len(ops))
width = 0.36
fig, ax = plt.subplots(figsize=(7, 4.5))
ax.bar(x - width/2, shuffled, width, label=f"shuffled (N={n_shuf})")
ax.bar(x + width/2, sorted_, width, label=f"sorted (N={n_sort})")
for i, v in enumerate(shuffled):
ax.text(i - width/2, v, f"{v:.2f}", ha="center", va="bottom", fontsize=9)
for i, v in enumerate(sorted_):
ax.text(i + width/2, v, f"{v:.2f}", ha="center", va="bottom", fontsize=9)
ax.set_xticks(x); ax.set_xticklabels(ops)
ax.set_ylabel("Время, мс")
ax.set_title("BST: деградация на отсортированных данных\n"
"(N для sorted в 5 раз меньше, но время больше)")
ax.set_yscale("log")
ax.legend()
ax.grid(axis="y", linestyle="--", alpha=0.4)
plt.tight_layout()
out = os.path.join(PLOTS_DIR, fname)
plt.savefig(out, dpi=130)
plt.close()
print("saved:", out)
def main():
means = load_means()
plot_grouped(means, "insert",
"insert_compare.png",
"Вставка всех записей (лог. шкала)")
plot_grouped(means, "find",
"find_compare.png",
"Поиск 110 ключей (лог. шкала)")
plot_grouped(means, "delete",
"delete_compare.png",
"Удаление 50 записей (лог. шкала)")
plot_bst_degradation(means, "bst_degradation.png")
if __name__ == "__main__":
main()