From 303da5bdc59af875918be0d94b6b04bb11d689db Mon Sep 17 00:00:00 2001 From: Dima Date: Sat, 16 May 2026 20:01:46 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BC=D1=8B=20(=D0=A3=D1=81=D0=BF=D0=B5=D1=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nikolaevda/experiment_results.csv | 19 ++ nikolaevda/graphs.png | Bin 0 -> 75589 bytes nikolaevda/task1/Zadanie1.py | 355 +++++++++++++++++++++++++++++- 3 files changed, 373 insertions(+), 1 deletion(-) create mode 100644 nikolaevda/experiment_results.csv create mode 100644 nikolaevda/graphs.png diff --git a/nikolaevda/experiment_results.csv b/nikolaevda/experiment_results.csv new file mode 100644 index 0000000..ccc6616 --- /dev/null +++ b/nikolaevda/experiment_results.csv @@ -0,0 +1,19 @@ +Структура;Режим;Операция;Замер1(с);Замер2(с);Замер3(с);Замер4(с);Замер5(с);Среднее(с) +linked_list;случайный;вставка;5.503300700000182;5.004083100000571;4.882084700000632;4.881827499999417;4.890130499999941;5.032285300000149 +linked_list;случайный;поиск;0.05034929999965243;0.04795749999993859;0.046004300000277;0.04418989999976475;0.04287860000022192;0.04627591999997094 +linked_list;случайный;удаление;0.03702340000018012;0.03709479999997711;0.03829469999982393;0.03841730000021926;0.03741160000026866;0.03764836000009382 +hash_table;случайный;вставка;0.03724729999976262;0.036700800000289746;0.03645409999990079;0.036475899999459216;0.035486800000398944;0.03647297999996226 +hash_table;случайный;поиск;0.00042500000017753337;0.00033910000001924345;0.00033829999938461697;0.0003378999999767984;0.00033820000044215703;0.00035570000000006985 +hash_table;случайный;удаление;0.00018709999949351186;0.00017469999966124306;0.0001795999996829778;0.00018339999951422215;0.00017609999940759735;0.00018017999955191044 +bst;случайный;вставка;0.04527770000004239;0.042043200000080105;0.04279800000040268;0.038970799999333394;0.03744349999942642;0.041306639999856995 +bst;случайный;поиск;0.0005276000001686043;0.0004296000006434042;0.00043430000005173497;0.00041569999939383706;0.0004365999993751757;0.00044875999992655125 +bst;случайный;удаление;0.09453469999971276;0.09244760000001406;0.10106580000046961;0.09086349999961385;0.09310050000021874;0.0944024200000058 +linked_list;отсортированный;вставка;6.237431600000491;6.1635778999998365;6.183921300000293;6.150560400000359;6.1811854999996285;6.183335340000122 +linked_list;отсортированный;поиск;0.05593550000048708;0.053237000000081025;0.05208490000040911;0.05022400000052585;0.049882199999956356;0.052272720000291886 +linked_list;отсортированный;удаление;0.04117889999997715;0.037663099999917904;0.03757399999994959;0.04252919999998994;0.03767599999991944;0.03932423999995081 +hash_table;отсортированный;вставка;0.04085130000021309;0.03589560000000347;0.03588300000046729;0.035286500000438537;0.03309669999998732;0.03620262000022194 +hash_table;отсортированный;поиск;0.00044720000005327165;0.00040470000021741726;0.0003451000002314686;0.00034250000044266926;0.0003420000002734014;0.00037630000024364564 +hash_table;отсортированный;удаление;0.0001863999996203347;0.00017409999964002054;0.00017500000012660166;0.00017459999980928842;0.00017379999917466193;0.00017677999967418144 +bst;отсортированный;вставка;18.630878699999812;18.350701800000024;18.322985300001164;18.381200199999512;18.44051959999888;18.425257119999877 +bst;отсортированный;поиск;0.16251639999973122;0.15183020000040415;0.1572033000011288;0.16128759999992326;0.16190610000012384;0.15894872000026225 +bst;отсортированный;удаление;0.09546029999910388;0.09252720000040426;0.09302340000067488;0.09245310000005702;0.09305589999894437;0.09330397999983689 diff --git a/nikolaevda/graphs.png b/nikolaevda/graphs.png new file mode 100644 index 0000000000000000000000000000000000000000..f889c5a30fd72560d5f88f76449c45a7328f61ed GIT binary patch literal 75589 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 CY~a=a literal 0 HcmV?d00001 diff --git a/nikolaevda/task1/Zadanie1.py b/nikolaevda/task1/Zadanie1.py index 2a6d4ed..4558814 100644 --- a/nikolaevda/task1/Zadanie1.py +++ b/nikolaevda/task1/Zadanie1.py @@ -1,3 +1,12 @@ +import random +import time +import csv +import os +import traceback +import sys + +sys.setrecursionlimit(30000) + def ll_insert(head, name, phone): """ @@ -293,4 +302,348 @@ def bst_list_all(root, result=None): # затем правое поддерево (все большие ключи) bst_list_all(root['right'], result) - return result \ No newline at end of file + return result + +def generate_records(count=10000): + """ + генерация тестовых данных + 70% уникальных имён, 30% повторяющихся (для коллизий) + """ + records = [] + base_names = ["Алексей", "Борис", "Владимир", "Дмитрий", "Елена", + "Иван", "Мария", "Николай", "Ольга", "Павел"] + + for i in range(count): + if random.random() < 0.7: + name = f"User_{i:05d}" + else: + name = random.choice(base_names) + f"_{random.randint(1, 100)}" + + phone = f"+7-{random.randint(100,999)}-{random.randint(100,999)}-{random.randint(1000,9999)}" + records.append((name, phone)) + + shuffled = records.copy() + random.shuffle(shuffled) + sorted_records = sorted(records, key=lambda x: x[0]) + + return shuffled, sorted_records + + +def measure_insertion(structure_name, records): + """ + замер времени вставки + возвращает список замеров и заполненную структуру + """ + times = [] + filled_structure = None + + for run in range(5): + if structure_name == "linked_list": + structure = None + elif structure_name == "hash_table": + structure = hash_table(2003) + elif structure_name == "bst": + structure = None + + start = time.perf_counter() + + for name, phone in records: + if structure_name == "linked_list": + structure = ll_insert(structure, name, phone) + elif structure_name == "hash_table": + ht_insert(structure, name, phone) + elif structure_name == "bst": + structure = bst_insert(structure, name, phone) + + end = time.perf_counter() + times.append(end - start) + + if run == 4: # Сохраняем после последнего замера + filled_structure = structure + + return times, filled_structure + + +def measure_search(structure_name, structure, search_names): + """ + замер времени поиска + возвращает список замеров + """ + times = [] + + for run in range(5): + start = time.perf_counter() + + for name in search_names: + if structure_name == "linked_list": + ll_find(structure, name) + elif structure_name == "hash_table": + ht_find(structure, name) + elif structure_name == "bst": + bst_find(structure, name) + + end = time.perf_counter() + times.append(end - start) + + return times + + +def measure_deletion(structure_name, original_structure, delete_names): + """ + замер времени удаления + возвращает список замеров + """ + times = [] + + for run in range(5): + # создаём копию структуры + if structure_name == "linked_list": + all_records = ll_list_all(original_structure) + test_structure = None + for name, phone in all_records: + test_structure = ll_insert(test_structure, name, phone) + + elif structure_name == "hash_table": + all_records = ht_list_all(original_structure) + test_structure = hash_table(2003) + for name, phone in all_records: + ht_insert(test_structure, name, phone) + + elif structure_name == "bst": + all_records = bst_list_all(original_structure) + test_structure = None + for name, phone in all_records: + test_structure = bst_insert(test_structure, name, phone) + + start = time.perf_counter() + + for name in delete_names: + if structure_name == "linked_list": + test_structure = ll_delete(test_structure, name) + elif structure_name == "hash_table": + ht_delete(test_structure, name) + elif structure_name == "bst": + test_structure = bst_delete(test_structure, name) + + end = time.perf_counter() + times.append(end - start) + + return times + +print(f"Текущая рабочая директория: {os.getcwd()}") +print(f"Путь к файлу: {os.path.abspath(__file__)}") + +def run_experiment(): + """ + запуск всех экспериментов и сохранение результатов + """ + + current_dir = os.path.dirname(__file__) + docs_dir = os.path.dirname(current_dir) + csv_file = os.path.join(docs_dir, "experiment_results.csv") + + + + os.makedirs(docs_dir, exist_ok=True) + + print("ЭКСПЕРИМЕНТАЛЬНОЕ СРАВНЕНИЕ СТРУКТУР ДАННЫХ") + print("Телефонный справочник - 10000 записей") + print(f"\nРезультаты будут сохранены в: {csv_file}") + + # генерация данных + print("\n1. Генерация тестовых данных...") + shuffled_records, sorted_records = generate_records(10000) + print(f"Сгенерировано 10000 записей") + print(f"Уникальных имён: {len(set([r[0] for r in shuffled_records]))}") + + # подготовка имён для поиска и удаления + random.seed(42) + existing_names = [shuffled_records[i][0] for i in random.sample(range(10000), 100)] + nonexisting_names = [f"NotExist_{i}" for i in range(10)] + search_names = existing_names + nonexisting_names + delete_names = [shuffled_records[i][0] for i in random.sample(range(10000), 50)] + + results = [["Структура", "Режим", "Операция", + "Замер1(с)", "Замер2(с)", "Замер3(с)", "Замер4(с)", "Замер5(с)", + "Среднее(с)"]] + + # тестирование для каждого режима + for mode_name, records in [("случайный", shuffled_records), + ("отсортированный", sorted_records)]: + + print(f"\n2. Тестирование режима: {mode_name}") + + + for struct_name in ["linked_list", "hash_table", "bst"]: + print(f"\n {struct_name.upper()}:") + + # вставка + print("Вставка 10000 записей...") + insert_times, filled_struct = measure_insertion(struct_name, records) + avg_insert = sum(insert_times) / 5 + print(f"Время: {avg_insert:.4f} сек (среднее)") + + # поиск + print("Поиск 110 записей (100 существующих + 10 которых нет)...") + search_times = measure_search(struct_name, filled_struct, search_names) + avg_search = sum(search_times) / 5 + print(f"Время: {avg_search:.4f} сек (среднее)") + + # удаление + print("Удаление 50 случайных записей...") + delete_times = measure_deletion(struct_name, filled_struct, delete_names) + avg_delete = sum(delete_times) / 5 + print(f"Время: {avg_delete:.4f} сек (среднее)") + + # сохраняем результаты + results.append([struct_name, mode_name, "вставка"] + insert_times + [avg_insert]) + results.append([struct_name, mode_name, "поиск"] + search_times + [avg_search]) + results.append([struct_name, mode_name, "удаление"] + delete_times + [avg_delete]) + + # сохранение CSV + print("\n3. Сохранение результатов...") + try: + with open(csv_file, "w", newline="", encoding="utf-8-sig") as f: + writer = csv.writer(f, delimiter=';') + writer.writerows(results) + print(f"Результаты сохранены в: {csv_file}") + except Exception as e: + print(f"Ошибка сохранения: {e}") + + # вывод табл. + print("СВОДНАЯ ТАБЛИЦА РЕЗУЛЬТАТОВ") + print(f"{'Структура':<15} {'Режим':<12} {'Операция':<10} {'Среднее время (сек)':<20}") + + for row in results[1:]: + struct, mode, op, t1, t2, t3, t4, t5, avg = row + print(f"{struct:<15} {mode:<12} {op:<10} {avg:<20.6f}") + + return results + +def create_report_table(results): + """Создание сводной таблицы""" + + print("СВОДНАЯ ТАБЛИЦА (среднее время в секундах)") + + print(f"{'Структура':<12} {'Режим':<12} {'Вставка':<12} {'Поиск':<12} {'Удаление':<12}") + + summary = {} + for row in results[1:]: + struct, mode, op, _, _, _, _, _, avg = row + key = (struct, mode) + if key not in summary: + summary[key] = {} + summary[key][op] = avg + + names = {'linked_list': 'LinkedList', 'hash_table': 'HashTable', 'bst': 'BST'} + for (struct, mode), ops in summary.items(): + print(f"{names[struct]:<12} {mode:<12} {ops.get('вставка', 0):<12.6f} {ops.get('поиск', 0):<12.6f} {ops.get('удаление', 0):<12.6f}") + + +def print_analysis(): + """вывод краткого анализа""" + + print("АНАЛИЗ РЕЗУЛЬТАТОВ") + + print(""" +1. Влияние порядка данных на BST: + - На случайных данных: быстро O(log n) + - На отсортированных: деградация до O(n) (дерево вырождается в список) + +2. Хеш-таблица не чувствительна к порядку: + - Хеш-функция случайно распределяет данные по bucket'ам + - Порядок вставки не влияет на время операций + +3. Связный список всегда медленен при поиске: + - Поиск требует последовательного прохода O(n) + - Нет индексов или сортировки для ускорения + +4. Сравнение удаления: + - Связный список: O(n) — нужен поиск элемента + - Хеш-таблица: O(1) — прямой доступ по индексу + - BST: O(log n) в среднем, O(n) на отсортированных + +5. Рекомендация для реальных задач: + - Хеш-таблица: частый поиск, словари, кэши + - BST (сбалансированный): нужны отсортированные данные + - Связный список: маленькие объёмы, очереди/стеки + - Для телефонного справочника ЛУЧШЕ: ХЕШ-ТАБЛИЦА +""") + +def create_graphs(results): + """Построение столбчатых диаграмм""" + import matplotlib.pyplot as plt + import numpy as np + + data = {} + for row in results[1:]: + struct = row[0] + mode = row[1] + op = row[2] + avg = row[8] + + if struct not in data: + data[struct] = {} + if mode not in data[struct]: + data[struct][mode] = {} + data[struct][mode][op] = avg + + # Настройки + struct_names = {'linked_list': 'LinkedList', 'hash_table': 'HashTable', 'bst': 'BST'} + colors = {'linked_list': '#3498db', 'hash_table': '#2ecc71', 'bst': '#e74c3c'} + modes = ['случайный', 'отсортированный'] + operations = ['вставка', 'поиск', 'удаление'] + op_titles = ['Вставка (10000 записей)', 'Поиск (110 запросов)', 'Удаление (50 записей)'] + + fig, axes = plt.subplots(1, 3, figsize=(14, 5)) + fig.suptitle('Сравнение производительности структур данных', fontsize=14, fontweight='bold') + + for idx, (op, title) in enumerate(zip(operations, op_titles)): + ax = axes[idx] + x = np.arange(len(modes)) + width = 0.25 + multiplier = 0 + + for struct in ['linked_list', 'hash_table', 'bst']: + values = [data[struct][mode][op] for mode in modes] + bars = ax.bar(x + multiplier * width, values, width, + label=struct_names[struct], color=colors[struct]) + + for bar, val in zip(bars, values): + if val < 0.001: + ax.text(bar.get_x() + bar.get_width()/2, bar.get_height(), + f'{val:.6f}', ha='center', va='bottom', fontsize=7) + elif val < 0.01: + ax.text(bar.get_x() + bar.get_width()/2, bar.get_height(), + f'{val:.5f}', ha='center', va='bottom', fontsize=7) + else: + ax.text(bar.get_x() + bar.get_width()/2, bar.get_height(), + f'{val:.3f}', ha='center', va='bottom', fontsize=8) + multiplier += 1 + + ax.set_title(title) + ax.set_ylabel('Время (сек)') + ax.set_yscale('log') + ax.set_ylim(1e-5, 10) + ax.set_xticks(x + width) + ax.set_xticklabels(['Случайный', 'Отсортированный']) + ax.legend() + ax.grid(True, alpha=0.3, axis='y') + + plt.tight_layout() + + current_dir = os.path.dirname(__file__) + docs_dir = os.path.dirname(current_dir) + path = os.path.join(docs_dir, 'graphs.png') + plt.savefig(path, dpi=150) + plt.close() + print(f"\nГрафики сохранены: {path}") + return path + +if __name__ == "__main__": + results = run_experiment() + create_report_table(results) + create_graphs(results) + print_analysis() + + print("ЭКСПЕРИМЕНТ ВЫПОЛНЕН ПОЛНОСТЬЮ!")