diff --git a/nikolaevda/docs/data/experiment_results.csv b/nikolaevda/docs/data/experiment_results.csv new file mode 100644 index 0000000..70872e1 --- /dev/null +++ b/nikolaevda/docs/data/experiment_results.csv @@ -0,0 +1,19 @@ +Структура;Режим;Операция;Замер1(с);Замер2(с);Замер3(с);Замер4(с);Замер5(с);Среднее(с) +linked_list;случайный;вставка;4.743085900001461;4.702243700005056;4.426778699998977;4.3052682999987155;4.301903599996876;4.495856040000217 +linked_list;случайный;поиск;0.040070499999274034;0.03833870000380557;0.038309099996695295;0.038068900001235306;0.037999300002411474;0.03855730000068434 +linked_list;случайный;удаление;0.03337140000076033;0.03520829999615671;0.03318629999557743;0.03670069999498082;0.03511889999936102;0.03471711999736726 +hash_table;случайный;вставка;0.054787300003226846;0.038778399997681845;0.038185400000656955;0.03906660000211559;0.040834699997503776;0.042330480000237 +hash_table;случайный;поиск;0.00048270000115735456;0.0003393000006326474;0.00034130000130971894;0.0003389000048628077;0.0003389000048628077;0.00036822000256506724 +hash_table;случайный;удаление;0.00018000000272877514;0.0001720000000204891;0.0001720000000204891;0.0001764999979059212;0.0001747999995131977;0.00017506000003777444 +bst;случайный;вставка;0.04329969999525929;0.04011429999809479;0.0377946999942651;0.03973660000337986;0.03843010000127833;0.03987507999845548 +bst;случайный;поиск;0.0005353999949875288;0.0004243000003043562;0.00040499999886378646;0.00041709999641170725;0.00041870000131893903;0.00044009999837726357 +bst;случайный;удаление;0.08770270000240998;0.08755029999883845;0.09487290000106441;0.08564219999971101;0.08784590000141179;0.08872280000068714 +linked_list;отсортированный;вставка;5.82706280000275;5.942067100004351;6.058909300001687;5.410613899999589;5.423316100001102;5.732393840001896 +linked_list;отсортированный;поиск;0.05126659999950789;0.04912999999942258;0.04894649999914691;0.048823999997694045;0.0484264999977313;0.04931871999870054 +linked_list;отсортированный;удаление;0.03424879999511177;0.03367250000155764;0.03369569999631494;0.03390580000268528;0.034035600001516286;0.033911679999437186 +hash_table;отсортированный;вставка;0.03484389999357518;0.03386820000014268;0.033041399998182897;0.03465739999955986;0.035284899997350294;0.03433915999776218 +hash_table;отсортированный;поиск;0.0005273999995552003;0.00044519999937620014;0.00037960000190651044;0.000374099996406585;0.0003724999987753108;0.00041975999920396134 +hash_table;отсортированный;удаление;0.00017210000078193843;0.00017210000078193843;0.00017300000035902485;0.00017389999993611127;0.0001722999950288795;0.00017267999937757849 +bst;отсортированный;вставка;17.43330440000136;17.245424400003685;17.230704699999478;17.4216249999954;17.25258659999963;17.31672901999991 +bst;отсортированный;поиск;0.15691709999373415;0.15601930000411812;0.15765989999636076;0.15630209999653744;0.1590829000051599;0.15719625999918208 +bst;отсортированный;удаление;0.08944690000498667;0.086433999997098;0.08745249999628868;0.08608390000154031;0.09040470000036294;0.08796440000005532 diff --git a/nikolaevda/docs/data/graphs.png b/nikolaevda/docs/data/graphs.png new file mode 100644 index 0000000..34a065f Binary files /dev/null and b/nikolaevda/docs/data/graphs.png differ diff --git a/nikolaevda/docs/report_laba1.ipynb b/nikolaevda/docs/report_laba1.ipynb new file mode 100644 index 0000000..17be36c --- /dev/null +++ b/nikolaevda/docs/report_laba1.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "7cbca316", + "metadata": {}, + "outputs": [], + "source": [ + "{\n", + " \"cells\": [\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"start\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"# Отчёт по лабораторной работе\\n\",\n", + " \"## Тема: Сравнение производительности структур данных для телефонного справочника\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"goal\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 1. Цель работы\\n\",\n", + " \"\\n\",\n", + " \"Реализовать три различные структуры данных «с нуля», применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций (вставка, поиск, удаление).\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"conditions\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 2. Условия эксперимента\\n\",\n", + " \"\\n\",\n", + " \"| Параметр | Значение |\\n\",\n", + " \"|----------|----------|\\n\",\n", + " \"| Общее число записей | 10 000 |\\n\",\n", + " \"| Каждый замер повторялся | 5 раз |\\n\",\n", + " \"| Количество существующих записей для поиска | 100 |\\n\",\n", + " \"| Количество несуществующих записей для поиска | 10 |\\n\",\n", + " \"| Количество элементов для удаления | 50 |\\n\",\n", + " \"| Размер хеш-таблицы | 2003 (простое число) |\\n\",\n", + " \"| Режимы тестирования | Случайный / Отсортированный |\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"graphs\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 3. Практические графики\\n\",\n", + " \"\\n\",\n", + " \"### Информация о тестировании\\n\",\n", + " \"- Общее число записей: 10 000\\n\",\n", + " \"- Каждый замер повторялся: 5 раз\\n\",\n", + " \"- Количество существующих записей для случайного поиска: 100\\n\",\n", + " \"- Количество несуществующих записей для поиска: 10\\n\",\n", + " \"- Количество элементов для удаления: 50\\n\",\n", + " \"\\n\",\n", + " \"![График вставки](graphs.png)\\n\",\n", + " \"\\n\",\n", + " \"**Рис. 1 – Тестирование вставки (логарифмическая шкала)**\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"analysis_bst\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 4. Анализ результатов\\n\",\n", + " \"\\n\",\n", + " \"### Как порядок входных данных влияет на скорость вставки в BST (деградация до O(n) на отсортированных данных)?\\n\",\n", + " \"\\n\",\n", + " \"По определению, при вставке отсортированных данных, структура бинарного дерева поиска вырождается в связный список.\\n\",\n", + " \"\\n\",\n", + " \"**Результаты тестирования:**\\n\",\n", + " \"- На случайных данных: время вставки ~0.037 секунд\\n\",\n", + " \"- На отсортированных данных: время вставки ~18.34 секунд (деградация в ~470 раз!)\\n\",\n", + " \"\\n\",\n", + " \"Заметим, что при случайных данных скорость вставки в бинарное дерево почти лишь немного уступает по скорости хеш-таблице. При отсортированных данных дерево фактически превращается в связный список, и из-за рекурсивной реализации вставки бинарное дерево становится даже медленнее связного списка.\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"analysis_hash\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"### Почему хеш-таблица почти не чувствительна к порядку?\\n\",\n", + " \"\\n\",\n", + " \"Хеш-таблица не чувствительна к порядку данных, так как:\\n\",\n", + " \"1. Использует для распределения элементов хеш-значения данных (сложность операции одинакова для любых однотипных данных)\\n\",\n", + " \"2. Хеш-функция равномерно распределяет ключи по корзинам независимо от их порядка\\n\",\n", + " \"3. Вставка в конкретную корзину не зависит от соседних элементов\\n\",\n", + " \"\\n\",\n", + " \"**Экспериментальное подтверждение:**\\n\",\n", + " \"- Случайный порядок: вставка = 0.0369 сек, поиск = 0.000355 сек\\n\",\n", + " \"- Отсортированный порядок: вставка = 0.0356 сек, поиск = 0.000380 сек\\n\",\n", + " \"\\n\",\n", + " \"Разница незначительна и находится в пределах погрешности измерений.\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"analysis_list\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"### Почему связный список всегда медленен при поиске?\\n\",\n", + " \"\\n\",\n", + " \"Операция поиска в связном списке имеет линейную сложность **O(n)** независимо от порядка данных, так как:\\n\",\n", + " \"- Нет индексов для прямого доступа\\n\",\n", + " \"- Нет сортировки, позволяющей применять бинарный поиск\\n\",\n", + " \"- Приходится последовательно перебирать все элементы до найденного\\n\",\n", + " \"\\n\",\n", + " \"| Структура | Сложность поиска | Время поиска (случайный) |\\n\",\n", + " \"|-----------|-----------------|--------------------------|\\n\",\n", + " \"| Связный список | O(n) | 0.0427 сек |\\n\",\n", + " \"| Хеш-таблица | O(1) средняя | 0.000355 сек |\\n\",\n", + " \"| BST (случайный) | O(log n) | 0.000527 сек |\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"analysis_delete\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"### Как удаление работает в каждой структуре?\\n\",\n", + " \"\\n\",\n", + " \"#### Связный список\\n\",\n", + " \"Находим элемент перед удаляемым элементом и заменяем его поле `next` на `next.next`:\\n\",\n", + " \"```python\\n\",\n", + " \"current = head\\n\",\n", + " \"while current['next'] is not None:\\n\",\n", + " \" if current['next']['name'] == name:\\n\",\n", + " \" current['next'] = current['next']['next']\\n\",\n", + " \" return head\\n\",\n", + " \" current = current['next']\\n\",\n", + " \"```\\n\",\n", + " \"\\n\",\n", + " \"#### Двоичное дерево поиска\\n\",\n", + " \"После того, как мы нашли узел, который необходимо удалить, возможны три случая:\\n\",\n", + " \"\\n\",\n", + " \"**Случай 1:** У удаляемого узла нет детей → просто удаляем узел.\\n\",\n", + " \"\\n\",\n", + " \"**Случай 2:** У удаляемого узла есть только один ребёнок → ребёнок занимает место удалённого узла.\\n\",\n", + " \"\\n\",\n", + " \"**Случай 3:** У удаляемого узла есть оба ребёнка → находим минимальный элемент в правом поддереве (самый левый узел) и заменяем им удаляемый узел.\\n\",\n", + " \"\\n\",\n", + " \"#### Хеш-таблица\\n\",\n", + " \"1. Вычисляем хеш-индекс: `index = hash_func(name, len(buckets))`\\n\",\n", + " \"2. Находим нужную корзину: `buckets[index]`\\n\",\n", + " \"3. Удаляем элемент из связного списка в этой корзине\\n\",\n", + " \"\\n\",\n", + " \"**Сравнение времени удаления:**\\n\",\n", + " \"\\n\",\n", + " \"| Структура | Время удаления (случайный) | Сложность |\\n\",\n", + " \"|-----------|---------------------------|-----------|\\n\",\n", + " \"| Связный список | 0.0341 сек | O(n) |\\n\",\n", + " \"| Хеш-таблица | 0.00018 сек | O(1) средняя |\\n\",\n", + " \"| BST | 0.0793 сек | O(log n) средняя |\\n\",\n", + " \"\\n\",\n", + " \"---\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"id\": \"conclusion\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## 5. Вывод\\n\",\n", + " \"\\n\",\n", + " \"Мы реализовали и протестировали три различные структуры хранения данных: связный список, хеш-таблицу и двоичное дерево поиска. Сравнили скорость операций вставки, удаления и поиска для каждой структуры.\\n\",\n", + " \"\\n\",\n", + " \"### Итоговая таблица производительности (случайный порядок):\\n\",\n", + " \"\\n\",\n", + " \"| Структура | Вставка (сек) | Поиск (сек) | Удаление (сек) |\\n\",\n", + " \"|-----------|---------------|-------------|----------------|\\n\",\n", + " \"| Связный список | 4.6031 | 0.0427 | 0.0341 |\\n\",\n", + " \"| Хеш-таблица | **0.0369** | **0.00036** | **0.00018** |\\n\",\n", + " \"| BST | 0.0369 | 0.00053 | 0.0793 |\\n\",\n", + " \"\\n\",\n", + " \"### Рекомендации по выбору структуры данных:\\n\",\n", + " \"\\n\",\n", + " \"1. **Хеш-таблица** – лучший выбор для телефонного справочника:\\n\",\n", + " \" - Не важен порядок хранения и извлечения данных\\n\",\n", + " \" - Требуется максимальная скорость поиска и вставки\\n\",\n", + " \" - Результат: **победитель по всем параметрам**\\n\",\n", + " \"\\n\",\n", + " \"2. **Двоичное дерево поиска** – выбираем, если:\\n\",\n", + " \" - Нужно хранить данные с возможностью быстрого отсортированного обхода\\n\",\n", + " \" - Данные поступают в случайном порядке (иначе будет деградация)\\n\",\n", + " \" - Можно использовать сбалансированную версию (AVL, красно-чёрное)\\n\",\n", + " \"\\n\",\n", + " \"3. **Связный список** – выбираем, если:\\n\",\n", + " \" - Нужно хранить данные в порядке поступления (очередь, стек)\\n\",\n", + " \" - Объём данных очень маленький (< 100 записей)\\n\",\n", + " \" - Простота реализации важнее производительности\\n\",\n", + " \"\\n\",\n", + " \"---\\n\",\n", + " \"\\n\",\n", + " \"**Заключение:** Для реализации телефонного справочника оптимальнее всего использовать **хеш-таблицу**, так как она обеспечивает наилучшую производительность для всех операций и не чувствительна к порядку входных данных.\"\n", + " ]\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"kernelspec\": {\n", + " \"display_name\": \"Python 3\",\n", + " \"language\": \"python\",\n", + " \"name\": \"python3\"\n", + " },\n", + " \"language_info\": {\n", + " \"name\": \"python\",\n", + " \"version\": \"3.14.0\"\n", + " }\n", + " },\n", + " \"nbformat\": 4,\n", + " \"nbformat_minor\": 5\n", + "}" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/nikolaevda/experiment_results.csv b/nikolaevda/experiment_results.csv deleted file mode 100644 index ccc6616..0000000 --- a/nikolaevda/experiment_results.csv +++ /dev/null @@ -1,19 +0,0 @@ -Структура;Режим;Операция;Замер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 deleted file mode 100644 index f889c5a..0000000 Binary files a/nikolaevda/graphs.png and /dev/null differ