diff --git a/SobolevNS/docs/data/task1_data_structures/docs/data/plots/bst_degradation.png b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/bst_degradation.png new file mode 100644 index 0000000..0b6a049 Binary files /dev/null and b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/bst_degradation.png differ diff --git a/SobolevNS/docs/data/task1_data_structures/docs/data/plots/delete_compare.png b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/delete_compare.png new file mode 100644 index 0000000..1683cc2 Binary files /dev/null and b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/delete_compare.png differ diff --git a/SobolevNS/docs/data/task1_data_structures/docs/data/plots/find_compare.png b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/find_compare.png new file mode 100644 index 0000000..a50f2df Binary files /dev/null and b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/find_compare.png differ diff --git a/SobolevNS/docs/data/task1_data_structures/docs/data/plots/insert_compare.png b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/insert_compare.png new file mode 100644 index 0000000..c3bcd79 Binary files /dev/null and b/SobolevNS/docs/data/task1_data_structures/docs/data/plots/insert_compare.png differ diff --git a/SobolevNS/docs/data/task1_data_structures/docs/data/results.csv b/SobolevNS/docs/data/task1_data_structures/docs/data/results.csv new file mode 100644 index 0000000..d378993 --- /dev/null +++ b/SobolevNS/docs/data/task1_data_structures/docs/data/results.csv @@ -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 diff --git a/SobolevNS/docs/data/task1_data_structures/plot_results.py b/SobolevNS/docs/data/task1_data_structures/plot_results.py new file mode 100644 index 0000000..0b1e640 --- /dev/null +++ b/SobolevNS/docs/data/task1_data_structures/plot_results.py @@ -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()