diff --git a/svetlakovkyu/docs/data/01/codes/__init__.py b/svetlakovkyu/docs/data/01/codes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/svetlakovkyu/docs/data/01/codes/experiment.py b/svetlakovkyu/docs/data/01/codes/experiment.py new file mode 100644 index 0000000..edd4002 --- /dev/null +++ b/svetlakovkyu/docs/data/01/codes/experiment.py @@ -0,0 +1,101 @@ +import random +import time +import csv +import sys + +sys.setrecursionlimit(20000) + +from codes.LL import ll_insert, ll_find, ll_delete +from codes.HT import ht_insert, ht_delete, ht_find +from codes.BST import bst_delete, bst_find, bst_insert + +# Экспериментальная часть +def generate_records(N): + records =[] + for i in range(N): + name = f"User_{i:05d}" + phone =str(random.randint(100000,999999)) + records.append((name,phone)) + return records + + +def run_test(structure_name, mode, input_data, search_names, delete_names): + print(f"Тест {structure_name} в режиме {mode}") + ins_times = [] + find_times = [] + del_times = [] + for _ in range(5): + if structure_name == "LL": + container = None + elif structure_name == "BST": + container = None + elif structure_name == "HT": + container = [None]*150 + #А + start = time.perf_counter() + for name, phone in input_data: + if structure_name == "LL": + container = ll_insert(container, name, phone) + elif structure_name == "BST": + container = bst_insert(container, name, phone) + elif structure_name == "HT": + ht_insert(container, name, phone) + ins_times.append(time.perf_counter() - start) + #Б + start = time.perf_counter() + for name in search_names: + if structure_name == "LL": ll_find(container, name) + elif structure_name == "BST": bst_find(container, name) + else: ht_find(container, name) + find_times.append(time.perf_counter() - start) + #В + start = time.perf_counter() + for name in delete_names: + if structure_name == "LL": container = ll_delete(container, name) + elif structure_name == "BST": container = bst_delete(container, name) + else: ht_delete(container, name) + del_times.append(time.perf_counter() - start) + + results = [] + + for i in range(5): + results.append([structure_name, mode, f"Вставка (попытка {i+1})", ins_times[i]]) + results.append([structure_name, mode, "Вставка СРЕДНЕЕ", sum(ins_times) / 5]) + + for i in range(5): + results.append([structure_name, mode, f"Поиск (попытка {i+1})", find_times[i]]) + results.append([structure_name, mode, "Поиск СРЕДНЕЕ", sum(find_times) / 5]) + + for i in range(5): + results.append([structure_name, mode, f"Удаление (попытка {i+1})", del_times[i]]) + results.append([structure_name, mode, "Удаление СРЕДНЕЕ", sum(del_times) / 5]) + + return results + +def main_experiment(): + N = 10000 + + data = generate_records(N) + random.shuffle(data) + data_sort = sorted(data, key = lambda x: x[0]) + + search_names = [r[0] for r in random.sample(data, 100)] + [f"None_{i}" for i in range(10)] + delete_names = [r[0] for r in random.sample(data, 50)] + + results = [["Structure", "Mode", "Operation", "Time"]] + + for mode_name, mode_data in [("shufled", data), ("sorted", data_sort)]: + results += run_test("LL", mode_name, mode_data, search_names, delete_names) + results += run_test("BST", mode_name, mode_data, search_names, delete_names) + results += run_test("HT", mode_name, mode_data, search_names, delete_names) + + + + with open("results.csv", "w", newline = "") as f: + writer = csv.writer(f) + writer.writerows(results) + print("Результаты сохранены в файл") + + +if __name__ == "__main__": + main_experiment() \ No newline at end of file diff --git a/svetlakovkyu/docs/data/01/codes/plot.py b/svetlakovkyu/docs/data/01/codes/plot.py new file mode 100644 index 0000000..adf93c3 --- /dev/null +++ b/svetlakovkyu/docs/data/01/codes/plot.py @@ -0,0 +1,59 @@ +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd + +# Графики + +def plot_all(df: pd.DataFrame): + structures = ["BST", "HT", "LL"] + operations = ["Вставка", "Поиск", "Удаление"] + op_keys = ["Вставка СРЕДНЕЕ", "Поиск СРЕДНЕЕ", "Удаление СРЕДНЕЕ"] + filenames = ["./insert_plot.png", "./search_plot.png", "./delete_plot.png"] + + avg = df[df["Operation"].isin(op_keys)] + + data = { + (row.Structure, row.Mode, row.Operation): row.Time + for row in avg.itertuples(index=False) + } + + x = np.arange(len(structures)) + width = 0.35 + + for op_label, op_key, filename in zip(operations, op_keys, filenames): + fig, ax = plt.subplots(figsize=(8, 5)) + + times_shuffled = [data.get((s, "shufled", op_key), float('nan')) for s in structures] + times_sorted = [data.get((s, "sorted", op_key), 0) for s in structures] + + bars1 = ax.bar(x - width/2, times_shuffled, width, label="Случайный", color="steelblue") + bars2 = ax.bar(x + width/2, times_sorted, width, label="Отсортированный", color="red") + + for bar in bars1: + height = bar.get_height() + ax.text(bar.get_x() + bar.get_width() / 2, height, + f"{height:.6f}", ha="center", va="bottom", fontsize=8) + + for bar in bars2: + height = bar.get_height() + ax.text(bar.get_x() + bar.get_width() / 2, height, + f"{height:.6f}", ha="center", va="bottom", fontsize=8) + + ax.set_yscale("log") + ax.set_title(op_label) + ax.set_ylabel("Время (сек)") + ax.set_xticks(x) + ax.set_xticklabels(structures) + ax.legend() + ax.grid(axis="y", linestyle="--", alpha=0.7) + + plt.tight_layout() + plt.savefig(filename) + print(f"График сохранён: {filename}") + +def main_plot(): + results = pd.read_csv("./results.csv") + plot_all(results) + +if __name__ == "__main__": + main_plot() \ No newline at end of file diff --git a/svetlakovkyu/docs/data/01/delete_plot.png b/svetlakovkyu/docs/data/01/delete_plot.png new file mode 100644 index 0000000..678a8fc Binary files /dev/null and b/svetlakovkyu/docs/data/01/delete_plot.png differ diff --git a/svetlakovkyu/docs/data/01/insert_plot.png b/svetlakovkyu/docs/data/01/insert_plot.png new file mode 100644 index 0000000..44305c6 Binary files /dev/null and b/svetlakovkyu/docs/data/01/insert_plot.png differ diff --git a/svetlakovkyu/docs/data/01/main.py b/svetlakovkyu/docs/data/01/main.py new file mode 100644 index 0000000..9a9f368 --- /dev/null +++ b/svetlakovkyu/docs/data/01/main.py @@ -0,0 +1,6 @@ +from codes.plot import main_plot +from codes.experiment import main_experiment + +if __name__ == "__main__": + main_experiment() + main_plot() diff --git a/svetlakovkyu/docs/data/01/results.csv b/svetlakovkyu/docs/data/01/results.csv new file mode 100644 index 0000000..5451205 --- /dev/null +++ b/svetlakovkyu/docs/data/01/results.csv @@ -0,0 +1,109 @@ +Structure,Mode,Operation,Time +LL,shufled,Вставка (попытка 1),2.4339829910004482 +LL,shufled,Вставка (попытка 2),2.4039403810002113 +LL,shufled,Вставка (попытка 3),2.458547864999673 +LL,shufled,Вставка (попытка 4),2.413923469999645 +LL,shufled,Вставка (попытка 5),2.4440171969999938 +LL,shufled,Вставка СРЕДНЕЕ,2.430882380799994 +LL,shufled,Поиск (попытка 1),0.031343970999841986 +LL,shufled,Поиск (попытка 2),0.03304426499926194 +LL,shufled,Поиск (попытка 3),0.03239262500028417 +LL,shufled,Поиск (попытка 4),0.03132577799988212 +LL,shufled,Поиск (попытка 5),0.03151892799996858 +LL,shufled,Поиск СРЕДНЕЕ,0.03192511339984776 +LL,shufled,Удаление (попытка 1),0.01929760500024713 +LL,shufled,Удаление (попытка 2),0.019222485999307537 +LL,shufled,Удаление (попытка 3),0.019446178000180225 +LL,shufled,Удаление (попытка 4),0.019156967000526492 +LL,shufled,Удаление (попытка 5),0.019182482000360324 +LL,shufled,Удаление СРЕДНЕЕ,0.01926114360012434 +BST,shufled,Вставка (попытка 1),0.02289151100012532 +BST,shufled,Вставка (попытка 2),0.0229584500002602 +BST,shufled,Вставка (попытка 3),0.02520326100056991 +BST,shufled,Вставка (попытка 4),0.03390770399983012 +BST,shufled,Вставка (попытка 5),0.022019966999323515 +BST,shufled,Вставка СРЕДНЕЕ,0.025396178600021812 +BST,shufled,Поиск (попытка 1),0.000189066000530147 +BST,shufled,Поиск (попытка 2),0.00023037999926600605 +BST,shufled,Поиск (попытка 3),0.00018933499995910097 +BST,shufled,Поиск (попытка 4),0.0001907400001073256 +BST,shufled,Поиск (попытка 5),0.00024124399988068035 +BST,shufled,Поиск СРЕДНЕЕ,0.000208152999948652 +BST,shufled,Удаление (попытка 1),0.00011542900028871372 +BST,shufled,Удаление (попытка 2),0.0001963419999810867 +BST,shufled,Удаление (попытка 3),0.00011738299963326426 +BST,shufled,Удаление (попытка 4),0.00011437200009822845 +BST,shufled,Удаление (попытка 5),0.00015602500025124755 +BST,shufled,Удаление СРЕДНЕЕ,0.00013991020005050815 +HT,shufled,Вставка (попытка 1),0.0291972099994382 +HT,shufled,Вставка (попытка 2),0.02882972299994435 +HT,shufled,Вставка (попытка 3),0.028241992999937793 +HT,shufled,Вставка (попытка 4),0.02896075100034068 +HT,shufled,Вставка (попытка 5),0.029606111000248347 +HT,shufled,Вставка СРЕДНЕЕ,0.028967157599981874 +HT,shufled,Поиск (попытка 1),0.0014172729997881106 +HT,shufled,Поиск (попытка 2),0.0003571010001905961 +HT,shufled,Поиск (попытка 3),0.0004458979992705281 +HT,shufled,Поиск (попытка 4),0.0005671679991792189 +HT,shufled,Поиск (попытка 5),0.0004517190000115079 +HT,shufled,Поиск СРЕДНЕЕ,0.0006478317996879923 +HT,shufled,Удаление (попытка 1),0.000430808000601246 +HT,shufled,Удаление (попытка 2),0.000223173999984283 +HT,shufled,Удаление (попытка 3),0.0001869629995780997 +HT,shufled,Удаление (попытка 4),0.00021918600032222457 +HT,shufled,Удаление (попытка 5),0.00026948999948217534 +HT,shufled,Удаление СРЕДНЕЕ,0.0002659241999936057 +LL,sorted,Вставка (попытка 1),2.546284423999168 +LL,sorted,Вставка (попытка 2),2.527255480000349 +LL,sorted,Вставка (попытка 3),2.4814426879993334 +LL,sorted,Вставка (попытка 4),2.501784361999853 +LL,sorted,Вставка (попытка 5),2.480424575000143 +LL,sorted,Вставка СРЕДНЕЕ,2.507438305799769 +LL,sorted,Поиск (попытка 1),0.030172253000273486 +LL,sorted,Поиск (попытка 2),0.030333151999911934 +LL,sorted,Поиск (попытка 3),0.030028871000467916 +LL,sorted,Поиск (попытка 4),0.032277871000587766 +LL,sorted,Поиск (попытка 5),0.030364938999809965 +LL,sorted,Поиск СРЕДНЕЕ,0.030635417200210215 +LL,sorted,Удаление (попытка 1),0.02085002199964947 +LL,sorted,Удаление (попытка 2),0.021086609999656503 +LL,sorted,Удаление (попытка 3),0.02087502099948324 +LL,sorted,Удаление (попытка 4),0.021417887000097835 +LL,sorted,Удаление (попытка 5),0.020822566000788356 +LL,sorted,Удаление СРЕДНЕЕ,0.02101042119993508 +BST,sorted,Вставка (попытка 1),11.841748112999994 +BST,sorted,Вставка (попытка 2),11.75695861999975 +BST,sorted,Вставка (попытка 3),11.649890955999581 +BST,sorted,Вставка (попытка 4),11.535229737999543 +BST,sorted,Вставка (попытка 5),11.569677194999713 +BST,sorted,Вставка СРЕДНЕЕ,11.670700924399716 +BST,sorted,Поиск (попытка 1),0.08916782800042711 +BST,sorted,Поиск (попытка 2),0.09862517000055959 +BST,sorted,Поиск (попытка 3),0.08865728399996442 +BST,sorted,Поиск (попытка 4),0.08748506499978248 +BST,sorted,Поиск (попытка 5),0.08942283200030943 +BST,sorted,Поиск СРЕДНЕЕ,0.09067163580020861 +BST,sorted,Удаление (попытка 1),0.046499003000462835 +BST,sorted,Удаление (попытка 2),0.04566383200017299 +BST,sorted,Удаление (попытка 3),0.04534191499988083 +BST,sorted,Удаление (попытка 4),0.04480698100087466 +BST,sorted,Удаление (попытка 5),0.045543646000623994 +BST,sorted,Удаление СРЕДНЕЕ,0.04557107540040306 +HT,sorted,Вставка (попытка 1),0.03348540300066816 +HT,sorted,Вставка (попытка 2),0.03959386299993639 +HT,sorted,Вставка (попытка 3),0.026414189000206534 +HT,sorted,Вставка (попытка 4),0.028397822999977507 +HT,sorted,Вставка (попытка 5),0.0283703630002492 +HT,sorted,Вставка СРЕДНЕЕ,0.031252328200207555 +HT,sorted,Поиск (попытка 1),0.00092922399926465 +HT,sorted,Поиск (попытка 2),0.0005907800004933961 +HT,sorted,Поиск (попытка 3),0.00031636099993193056 +HT,sorted,Поиск (попытка 4),0.00034901999970315956 +HT,sorted,Поиск (попытка 5),0.0003578830001060851 +HT,sorted,Поиск СРЕДНЕЕ,0.0005086535998998443 +HT,sorted,Удаление (попытка 1),0.0003968310002164799 +HT,sorted,Удаление (попытка 2),0.0009146930005954346 +HT,sorted,Удаление (попытка 3),0.000194480000573094 +HT,sorted,Удаление (попытка 4),0.00020164000034128549 +HT,sorted,Удаление (попытка 5),0.00023484999928768957 +HT,sorted,Удаление СРЕДНЕЕ,0.0003884988002027967 diff --git a/svetlakovkyu/docs/data/01/search_plot.png b/svetlakovkyu/docs/data/01/search_plot.png new file mode 100644 index 0000000..9210f4a Binary files /dev/null and b/svetlakovkyu/docs/data/01/search_plot.png differ