From dde8ede88d10e2916f9f1f78facb315b68b6976e Mon Sep 17 00:00:00 2001 From: smirnovad Date: Thu, 14 May 2026 22:40:34 +0300 Subject: [PATCH] [1] zadanie1 --- smirnovad/docs/README.md | 0 smirnovad/lab1/docs/data/lab1.py | 249 ++++++++++++++++++ smirnovad/lab1/docs/data/order_impact.png | Bin 0 -> 45891 bytes smirnovad/lab1/docs/data/results.csv | 37 +++ .../lab1/docs/data/struct_comparison.png | Bin 0 -> 45539 bytes smirnovad/lab1/docs/report.md | 27 ++ 6 files changed, 313 insertions(+) delete mode 100644 smirnovad/docs/README.md create mode 100644 smirnovad/lab1/docs/data/lab1.py create mode 100644 smirnovad/lab1/docs/data/order_impact.png create mode 100644 smirnovad/lab1/docs/data/results.csv create mode 100644 smirnovad/lab1/docs/data/struct_comparison.png create mode 100644 smirnovad/lab1/docs/report.md diff --git a/smirnovad/docs/README.md b/smirnovad/docs/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/smirnovad/lab1/docs/data/lab1.py b/smirnovad/lab1/docs/data/lab1.py new file mode 100644 index 0000000..0230135 --- /dev/null +++ b/smirnovad/lab1/docs/data/lab1.py @@ -0,0 +1,249 @@ +import time +import random +import csv +import os +import sys +import matplotlib.pyplot as plt + +sys.setrecursionlimit(20000) + +BASE_PATH = r"C:\Users\andre\2026-rff_mp\smirnovad\lab1" +DOCS_PATH = os.path.join(BASE_PATH, "docs") +DATA_PATH = os.path.join(DOCS_PATH, "data") + +for p in [DOCS_PATH, DATA_PATH]: + if not os.path.exists(p): + os.makedirs(p) + +def ll_insert(head, name, phone): + return {'name': name, 'phone': phone, 'next': head} + +def ll_find(head, name): + curr = head + while curr: + if curr['name'] == name: return curr['phone'] + curr = curr['next'] + return None + +def ll_delete(head, name): + if not head: return None + if head['name'] == name: return head['next'] + curr = head + while curr['next']: + if curr['next']['name'] == name: + curr['next'] = curr['next']['next'] + return head + curr = curr['next'] + return head + +def ll_list_all(head): + res = [] + curr = head + while curr: + res.append((curr['name'], curr['phone'])) + curr = curr['next'] + return sorted(res) + +def ht_insert(buckets, name, phone): + idx = hash(name) % len(buckets) + buckets[idx] = ll_insert(buckets[idx], name, phone) + +def ht_find(buckets, name): + idx = hash(name) % len(buckets) + return ll_find(buckets[idx], name) + +def ht_delete(buckets, name): + idx = hash(name) % len(buckets) + buckets[idx] = ll_delete(buckets[idx], name) + +def ht_list_all(buckets): + all_recs = [] + for b in buckets: + curr = b + while curr: + all_recs.append((curr['name'], curr['phone'])) + curr = curr['next'] + return sorted(all_recs) + +def bst_insert(root, name, phone): + if not root: + return {'name': name, 'phone': phone, 'left': None, 'right': None} + if name < root['name']: + root['left'] = bst_insert(root['left'], name, phone) + elif name > root['name']: + root['right'] = bst_insert(root['right'], name, phone) + else: + root['phone'] = phone + return root + +def bst_find(root, name): + if not root: return None + if root['name'] == name: return root['phone'] + if name < root['name']: return bst_find(root['left'], name) + return bst_find(root['right'], name) + +def bst_delete(root, name): + if not root: return None + if name < root['name']: + root['left'] = bst_delete(root['left'], name) + elif name > root['name']: + root['right'] = bst_delete(root['right'], name) + else: + if not root['left']: return root['right'] + if not root['right']: return root['left'] + temp = root['right'] + while temp['left']: temp = temp['left'] + root['name'], root['phone'] = temp['name'], temp['phone'] + root['right'] = bst_delete(root['right'], temp['name']) + return root + +def bst_list_all(root): + res = [] + def _inorder(node): + if node: + _inorder(node['left']) + res.append((node['name'], node['phone'])) + _inorder(node['right']) + _inorder(root) + return res + +all_results_csv = [] +summary_for_report = [] + +def run_experiment(struct_type, mode, data): + print(f"Processing: {struct_type} ({mode})") + ins_times, find_times, del_times = [], [], [] + + for i in range(5): + container = [None]*1000 if struct_type == "HashTable" else None + + start = time.perf_counter() + for n, p in data: + if struct_type == "LinkedList": container = ll_insert(container, n, p) + elif struct_type == "HashTable": ht_insert(container, n, p) + elif struct_type == "BST": container = bst_insert(container, n, p) + ins_times.append(time.perf_counter() - start) + + search_list = [d[0] for d in random.sample(data, 100)] + [f"None_{j}" for j in range(10)] + start = time.perf_counter() + for s_name in search_list: + if struct_type == "LinkedList": ll_find(container, s_name) + elif struct_type == "HashTable": ht_find(container, s_name) + elif struct_type == "BST": bst_find(container, s_name) + find_times.append(time.perf_counter() - start) + + del_list = [d[0] for d in random.sample(data, 50)] + start = time.perf_counter() + for d_name in del_list: + if struct_type == "LinkedList": container = ll_delete(container, d_name) + elif struct_type == "HashTable": ht_delete(container, d_name) + elif struct_type == "BST": container = bst_delete(container, d_name) + del_times.append(time.perf_counter() - start) + + all_results_csv.append([struct_type, mode, f"Run {i+1}", ins_times[-1], find_times[-1], del_times[-1]]) + + avg_ins = sum(ins_times) / 5 + avg_find = sum(find_times) / 5 + avg_del = sum(del_times) / 5 + + all_results_csv.append([struct_type, mode, "AVERAGE", avg_ins, avg_find, avg_del]) + summary_for_report.append({"name": struct_type, "mode": mode, "ins": avg_ins, "find": avg_find, "del": avg_del}) + +N = 10000 +records_raw = [(f"User_{i:05d}", f"8-900-{random.randint(100, 999)}") for i in range(N)] +records_shuffled = records_raw[:] +random.shuffle(records_shuffled) +records_sorted = sorted(records_raw) + +for m_name, d_set in [("случайный", records_shuffled), ("сортированный", records_sorted)]: + for s_type in ["LinkedList", "HashTable", "BST"]: + run_experiment(s_type, m_name, d_set) + +with open(os.path.join(DATA_PATH, "results.csv"), "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerow(["Структура", "Режим", "Итерация", "Вставка", "Поиск", "Удаление"]) + writer.writerows(all_results_csv) + +def create_plots(): + labels = ["insert", "find", "delete"] + structs = ["LinkedList", "HashTable", "BST"] + colors = ['#5dade2', '#e67e22', '#58d68d'] + + fig1, axs = plt.subplots(1, 3, figsize=(18, 6)) + fig1.suptitle("Влияние порядка данных на время операций", fontsize=16, fontweight='bold') + + for i, s_name in enumerate(structs): + rand_data = next(r for r in summary_for_report if r['name'] == s_name and r['mode'] == "случайный") + sort_data = next(r for r in summary_for_report if r['name'] == s_name and r['mode'] == "сортированный") + + x = [0, 1, 2] + width = 0.35 + axs[i].bar([p - width/2 for p in x], [rand_data['ins'], rand_data['find'], rand_data['del']], width, label='случайный', color=colors[0]) + axs[i].bar([p + width/2 for p in x], [sort_data['ins'], sort_data['find'], sort_data['del']], width, label='сортированный', color='#e74c3c', alpha=0.8) + + axs[i].set_title(s_name, fontweight='bold') + axs[i].set_xticks(x) + axs[i].set_xticklabels(labels) + axs[i].set_ylabel("Время (с)") + axs[i].legend() + axs[i].grid(axis='y', linestyle='--', alpha=0.3) + + plt.tight_layout(rect=[0, 0.03, 1, 0.95]) + plt.savefig(os.path.join(DATA_PATH, "order_impact.png")) + + fig2, axs2 = plt.subplots(1, 3, figsize=(18, 6)) + fig2.suptitle(f"Сравнение структур данных (N={N})", fontsize=16, fontweight='bold') + + op_keys = ['ins', 'find', 'del'] + op_names = ['insert', 'find', 'delete'] + + for i, op in enumerate(op_keys): + plot_labels = [] + plot_values = [] + plot_colors = [] + + for r in summary_for_report: + plot_labels.append(f"{r['name']}\n({r['mode'][:4]})") + plot_values.append(r[op]) + if r['name'] == "LinkedList": plot_colors.append(colors[0]) + elif r['name'] == "HashTable": plot_colors.append(colors[1]) + else: plot_colors.append(colors[2]) + + bars = axs2[i].bar(plot_labels, plot_values, color=plot_colors) + axs2[i].set_title(f"Операция: {op_names[i]}", fontweight='bold') + axs2[i].set_ylabel("Время (с)") + axs2[i].tick_params(axis='x', rotation=15) + + for bar in bars: + height = bar.get_height() + axs2[i].text(bar.get_x() + bar.get_width()/2., height, f'{height:.4f}', ha='center', va='bottom', fontsize=8) + + plt.tight_layout(rect=[0, 0.03, 1, 0.95]) + plt.savefig(os.path.join(DATA_PATH, "struct_comparison.png")) + +create_plots() + +with open(os.path.join(DOCS_PATH, "report.md"), "w", encoding="utf-8") as f: + f.write("# Технический отчет: Сравнительный анализ структур данных\n\n") + f.write("## 1. Вводные данные\n") + f.write(f"Целью теста является оценка производительности LinkedList, HashTable и BST на массиве из {N} элементов. ") + f.write("Анализировались сценарии со случайным распределением и предварительной сортировкой ключей.\n\n") + + f.write("## 2. Результаты измерений (AVG)\n") + f.write("| Алгоритм | Входные данные | Вставка (с) | Поиск (с) | Удаление (с) |\n") + f.write("| :--- | :--- | :--- | :--- | :--- |\n") + for r in summary_for_report: + f.write(f"| {r['name']} | {r['mode']} | {r['ins']:.6f} | {r['find']:.6f} | {r['del']:.6f} |\n") + + f.write("\n## 3. Визуальный анализ\n") + f.write("### Сравнение по типам операций\n![Сравнение](data/struct_comparison.png)\n\n") + f.write("### Влияние упорядоченности на производительность\n![Влияние порядка](data/order_impact.png)\n\n") + + f.write("## 4. Экспертные выводы\n") + f.write("- **Эффект вырождения BST:** На отсортированных последовательностях BST демонстрирует критический рост времени выполнения (деградация до $O(N)$). ") + f.write("Это связано с отсутствием балансировки, превращающим дерево в линейный список.\n") + f.write("- **Инвариантность HashTable:** Хеш-таблица показывает наиболее стабильные результаты. Скорость доступа не коррелирует с порядком входных данных.\n") + f.write("- **Линейная сложность LinkedList:** Связный список предсказуемо неэффективен при поиске, так как требует итерации по всей глубине структуры.\n") + f.write("- **Итоговая оценка:** Для систем с высокой интенсивностью поиска и вставки оптимальным выбором является HashTable.") + +print("Готово.") \ No newline at end of file diff --git a/smirnovad/lab1/docs/data/order_impact.png b/smirnovad/lab1/docs/data/order_impact.png new file mode 100644 index 0000000000000000000000000000000000000000..d7355ac30fb38d48c5ed0e4f14a5cc0cd06f3e3a GIT binary patch literal 45891 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 literal 0 HcmV?d00001 diff --git a/smirnovad/lab1/docs/data/results.csv b/smirnovad/lab1/docs/data/results.csv new file mode 100644 index 0000000..f962189 --- /dev/null +++ b/smirnovad/lab1/docs/data/results.csv @@ -0,0 +1,37 @@ +Структура,Режим,Итерация,Вставка,Поиск,Удаление +LinkedList,случайный,Run 1,0.0019714999943971634,0.029020800022408366,0.017652600072324276 +LinkedList,случайный,Run 2,0.0012699998915195465,0.03224149998277426,0.019751599989831448 +LinkedList,случайный,Run 3,0.0015686999540776014,0.032726099947467446,0.023450100095942616 +LinkedList,случайный,Run 4,0.0012663998641073704,0.031491999980062246,0.02140070009045303 +LinkedList,случайный,Run 5,0.001316299894824624,0.03115670010447502,0.01875569997355342 +LinkedList,случайный,AVERAGE,0.0014785799197852612,0.03132742000743747,0.020202140044420957 +HashTable,случайный,Run 1,0.0036369001027196646,7.810001261532307e-05,4.20999713242054e-05 +HashTable,случайный,Run 2,0.0027166998479515314,6.680004298686981e-05,3.690016455948353e-05 +HashTable,случайный,Run 3,0.002825999865308404,6.940006278455257e-05,4.0599843487143517e-05 +HashTable,случайный,Run 4,0.0038201999850571156,9.25001222640276e-05,4.6800123527646065e-05 +HashTable,случайный,Run 5,0.0028741999994963408,7.349997758865356e-05,4.6900007873773575e-05 +HashTable,случайный,AVERAGE,0.0031747999601066113,7.606004364788533e-05,4.2660022154450415e-05 +BST,случайный,Run 1,0.02340110018849373,0.000219699926674366,0.00012899981811642647 +BST,случайный,Run 2,0.02266499982215464,0.000223799841478467,0.00011649983935058117 +BST,случайный,Run 3,0.02390270004980266,0.0002661000471562147,0.00011879997327923775 +BST,случайный,Run 4,0.02376510016620159,0.00023330003023147583,0.00013200007379055023 +BST,случайный,Run 5,0.039811399998143315,0.00020990008488297462,0.00011849985457956791 +BST,случайный,AVERAGE,0.02670906004495919,0.00023055998608469963,0.00012295991182327272 +LinkedList,сортированный,Run 1,0.001537499949336052,0.033511900110170245,0.019870299845933914 +LinkedList,сортированный,Run 2,0.001307999948039651,0.0319586000405252,0.014161000028252602 +LinkedList,сортированный,Run 3,0.0014808999840170145,0.0326090999878943,0.018076500156894326 +LinkedList,сортированный,Run 4,0.0013822999317198992,0.033412199933081865,0.022219100035727024 +LinkedList,сортированный,Run 5,0.0012627998366951942,0.030183800030499697,0.016802300000563264 +LinkedList,сортированный,AVERAGE,0.001394299929961562,0.03233512002043426,0.018225840013474225 +HashTable,сортированный,Run 1,0.0034910000395029783,8.500018157064915e-05,4.449998959898949e-05 +HashTable,сортированный,Run 2,0.002676100004464388,6.62999227643013e-05,3.50000336766243e-05 +HashTable,сортированный,Run 3,0.0026501999236643314,6.309989839792252e-05,3.5800039768218994e-05 +HashTable,сортированный,Run 4,0.003009800100699067,6.360001862049103e-05,3.800005652010441e-05 +HashTable,сортированный,Run 5,0.002735199872404337,8.360017091035843e-05,3.979983739554882e-05 +HashTable,сортированный,AVERAGE,0.0029124599881470204,7.232003845274449e-05,3.86199913918972e-05 +BST,сортированный,Run 1,10.096050000051036,0.08805329981260002,0.06355300010181963 +BST,сортированный,Run 2,10.27557749999687,0.0852949998807162,0.04538960009813309 +BST,сортированный,Run 3,9.790069000096992,0.0812387999612838,0.0491947999689728 +BST,сортированный,Run 4,9.99310930003412,0.08915449981577694,0.04604210006073117 +BST,сортированный,Run 5,9.97979940008372,0.07943259994499385,0.049180999863892794 +BST,сортированный,AVERAGE,10.026921040052548,0.08463483988307416,0.0506721000187099 diff --git a/smirnovad/lab1/docs/data/struct_comparison.png b/smirnovad/lab1/docs/data/struct_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..bbacb56a911e502b419501ee3d4eb02d1e4c112b GIT binary patch literal 45539 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 literal 0 HcmV?d00001 diff --git a/smirnovad/lab1/docs/report.md b/smirnovad/lab1/docs/report.md new file mode 100644 index 0000000..0672fcf --- /dev/null +++ b/smirnovad/lab1/docs/report.md @@ -0,0 +1,27 @@ +# Технический отчет: Сравнительный анализ структур данных + +## 1. Вводные данные +Целью теста является оценка производительности LinkedList, HashTable и BST на массиве из 10000 элементов. Анализировались сценарии со случайным распределением и предварительной сортировкой ключей. + +## 2. Результаты измерений (AVG) +| Алгоритм | Входные данные | Вставка (с) | Поиск (с) | Удаление (с) | +| :--- | :--- | :--- | :--- | :--- | +| LinkedList | случайный | 0.001479 | 0.031327 | 0.020202 | +| HashTable | случайный | 0.003175 | 0.000076 | 0.000043 | +| BST | случайный | 0.026709 | 0.000231 | 0.000123 | +| LinkedList | сортированный | 0.001394 | 0.032335 | 0.018226 | +| HashTable | сортированный | 0.002912 | 0.000072 | 0.000039 | +| BST | сортированный | 10.026921 | 0.084635 | 0.050672 | + +## 3. Визуальный анализ +### Сравнение по типам операций +![Сравнение](data/struct_comparison.png) + +### Влияние упорядоченности на производительность +![Влияние порядка](data/order_impact.png) + +## 4. Экспертные выводы +- **Эффект вырождения BST:** На отсортированных последовательностях BST демонстрирует критический рост времени выполнения (деградация до $O(N)$). Это связано с отсутствием балансировки, превращающим дерево в линейный список. +- **Инвариантность HashTable:** Хеш-таблица показывает наиболее стабильные результаты. Скорость доступа не коррелирует с порядком входных данных. +- **Линейная сложность LinkedList:** Связный список предсказуемо неэффективен при поиске, так как требует итерации по всей глубине структуры. +- **Итоговая оценка:** Для систем с высокой интенсивностью поиска и вставки оптимальным выбором является HashTable. \ No newline at end of file