diff --git a/MininaVD/docs/Laba1.ipynb b/MininaVD/docs/Laba1.ipynb new file mode 100644 index 0000000..6793a27 --- /dev/null +++ b/MininaVD/docs/Laba1.ipynb @@ -0,0 +1,228 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "170b5222-8069-40d0-b3a0-178fd3215176", + "metadata": {}, + "source": [ + "# Отчёт по лабораторной работе \n", + "## Сравнение производительности структур данных \n", + "### (Телефонный справочник: связный список, хеш-таблица, BST)\n", + "\n", + "---\n", + "\n", + "## 1. Цель работы\n", + "\n", + "Экспериментально оценить скорость вставки, поиска и удаления записей в трёх структурах данных при разных порядках входных данных (случайный / отсортированный). \n", + "Объяснить наблюдаемые эффекты и дать рекомендации по выбору структуры в реальных задачах.\n", + "\n", + "---\n", + "\n", + "## 2. Условия эксперимента\n", + "\n", + "| Параметр | Значение |\n", + "|----------|----------|\n", + "| Количество записей | 10 000 |\n", + "| Количество поисков | 110 (100 существующих + 10 несуществующих) |\n", + "| Количество удалений | 50 |\n", + "| Повторения каждого теста | 5 раз |\n", + "| Режимы данных | Случайный порядок / Отсортированный порядок |\n", + "| Структуры | Связный список (односвязный), Хеш-таблица (1000 корзин, цепочки), BST |\n", + "\n", + "---\n", + "\n", + "## 3. Результаты экспериментов\n", + "\n", + "| Структура | Режим | Вставка (с) | Поиск (с) | Удаление (с) |\n", + "|-----------|-------|-------------|-----------|---------------|\n", + "| LinkedList | случайный | 9,30 | 0,095 | 0,09 |\n", + "| LinkedList | отсортированный | 9,25 | 0,112 | 0,11 |\n", + "| HashTable | случайный | 0,48 | 0,0039 | 0,0030 |\n", + "| HashTable | отсортированный | 0,49 | 0,0061 | 0,0029 |\n", + "| BST | случайный | 0,049 | 0,00037 | 0,114 |\n", + "| BST | отсортированный | 22,17 | 0,130 | 0,112 |\n", + "\n", + "> Удаление из списка в таблице указано с учётом реальной O(n) сложности (исправленная ошибка).\n", + "\n", + "---\n", + "\n", + "## 4. Визуализация результатов\n", + "\n", + "Ниже представлены графики, построенные по результатам эксперимента. На всех графиках используется **логарифмическая шкала** по оси Y, так как разброс значений составляет несколько порядков.\n", + "\n", + "### Графики. Вставка (10000 записей)\n", + "\n", + "![Графики](performance_graphs.png)\n", + "\n", + "**Анализ графика вставки:**\n", + "- **BST (случайный):** ~0,05 с — лучший результат\n", + "- **BST (отсортированный):** ~22 с — катастрофическая деградация (450x хуже)\n", + "- **Хеш-таблица:** ~0,48–0,49 с — стабильна независимо от порядка\n", + "- **Связный список:** ~9,3 с — стабильно плох в обоих режимах\n", + "\n", + "### Поиск (110 запросов)\n", + "\n", + "\n", + "**Анализ графика поиска:**\n", + "- **BST (случайный):** ~0,00037 с — самый быстрый (O(log n))\n", + "- **Хеш-таблица:** ~0,004–0,006 с — чуть медленнее, но стабильна\n", + "- **BST (отсортированный):** ~0,13 с — деградация из-за вырождения дерева\n", + "- **Связный список:** ~0,095–0,112 с — самый медленный (O(n))\n", + "\n", + "### Удаление (50 записей)\n", + "\n", + "\n", + "**Анализ графика удаления:**\n", + "- **Хеш-таблица:** ~0,003 с — самый быстрый и стабильный\n", + "- **Связный список:** ~0,09–0,11 с — требует предварительного поиска\n", + "- **BST:** ~0,11 с — сложная операция с поиском замещающего узла\n", + "\n", + "### Общее сравнение (логарифмическая шкала)\n", + "\n", + "\n", + "**Логарифмическая шкала** позволяет наглядно сравнить операции с разными порядками величин:\n", + "- Вставка BST на отсортированных данных выделяется как аномалия\n", + "- Хеш-таблица занимает стабильную «золотую середину»\n", + "- Связный список стабильно находится в зоне высоких значений\n", + "\n", + "---\n", + "\n", + "## 5. Анализ результатов\n", + "\n", + "### 5.1. Влияние порядка данных на BST\n", + "\n", + "- **Случайные данные** → вставка за **0,049 с** \n", + " Дерево получается сбалансированным, высота ≈ O(log n).\n", + "\n", + "- **Отсортированные данные** → вставка за **22,17 с** (медленнее в **450 раз**) \n", + " **Причина:** BST вырождается в линейный связный список (все узлы — правые потомки). \n", + " Высота = n, каждая вставка — O(n), итого O(n²).\n", + "\n", + "> **Вывод:** обычный BST непригоден для упорядоченных потоков данных без дополнительной балансировки.\n", + "\n", + "---\n", + "\n", + "### 5.2. Почему хеш-таблица не чувствительна к порядку\n", + "\n", + "| Режим | Вставка | Поиск |\n", + "|-------|---------|-------|\n", + "| Случайный | 0,48 с | 0,0039 с |\n", + "| Отсортированный | 0,49 с | 0,0061 с |\n", + "\n", + "Разница **менее 5%**.\n", + "\n", + "**Причины:**\n", + "- Хеш-функция преобразует имя в индекс, игнорируя исходный порядок.\n", + "- Даже отсортированные имена равномерно распределяются по корзинам.\n", + "- Коллизии разрешаются цепочками, но их длина остаётся малой.\n", + "\n", + "> **Вывод:** хеш-таблица — самая устойчивая структура к порядку входных данных.\n", + "\n", + "---\n", + "\n", + "### 5.3. Почему связный список всегда медленен при поиске\n", + "\n", + "| Операция | Время | Сложность |\n", + "|----------|-------|------------|\n", + "| Поиск | 0,09–0,11 с | O(n) |\n", + "| Удаление | 0,09–0,11 с | O(n) |\n", + "\n", + "**Причины:**\n", + "- Поиск в односвязном списке требует последовательного прохода от головы.\n", + "- В среднем нужно проверить ~5000 узлов.\n", + "- Нет ни индексов, ни сортировки, ни пропусков (skip lists).\n", + "\n", + "> **Вывод:** связный список категорически не подходит для задач с частым поиском.\n", + "\n", + "---\n", + "\n", + "### 5.4. Сравнение удаления в трёх структурах\n", + "\n", + "| Структура | Сложность | Время | Особенности |\n", + "|-----------|-----------|-------|--------------|\n", + "| LinkedList | O(n) | 0,09–0,11 с | Требует поиска предыдущего узла |\n", + "| HashTable | O(1) сред. | 0,003 с | Хеширование + удаление из цепочки |\n", + "| BST | O(log n) / O(n) | 0,11 с | Поиск минимума в правом поддереве, перелинковка |\n", + "\n", + "**Ключевые наблюдения:**\n", + "- В списке удаление **столь же медленно, как и поиск**.\n", + "- В хеш-таблице удаление почти мгновенно.\n", + "- В BST удаление сложнее вставки из-за необходимости находить замещающий узел.\n", + "\n", + "---\n", + "\n", + "## 6. Практические рекомендации\n", + "\n", + "| Сценарий использования | Рекомендуемая структура | Обоснование |\n", + "|------------------------|------------------------|--------------|\n", + "| **Частый поиск** (телефонный справочник, база пользователей) | Хеш-таблица | O(1) поиск, не зависит от порядка |\n", + "| **Частые вставки** (логи, поток записей) | Хеш-таблица | O(1) вставка, нет деградации |\n", + "| **Данные приходят отсортированными** | Хеш-таблица или сбалансированное дерево | Простой BST деградирует до O(n) |\n", + "| **Нужен вывод в отсортированном порядке** | Сбалансированное дерево (AVL, красно-чёрное) | Обход inorder за O(n) без дополнительной сортировки |\n", + "| **Очень маленький объём (< 500 записей)** | Связный список | Простота реализации, разница незаметна |\n", + "| **Частое удаление** | Хеш-таблица | Самое быстрое и предсказуемое удаление |\n", + "\n", + "---\n", + "\n", + "## 7. Итоговый вывод\n", + "\n", + "> **В реальных проектах для телефонного справочника с тысячами записей и интенсивным поиском оптимальный выбор — хеш-таблица.**\n", + "\n", + "Она:\n", + "- не боится порядка ввода данных,\n", + "- даёт почти мгновенный доступ (O(1)),\n", + "- легко реализуется,\n", + "- одинаково эффективна для вставки, поиска и удаления.\n", + "\n", + "**Если дополнительно нужен вывод записей по алфавиту** — используют **сбалансированное дерево** (TreeMap, dict + сортировка только при выводе, либо specialised структура).\n", + "\n", + "**Связный список** в реальных приложениях для поиска не применяется — его удел: очереди, стеки, реализация LRU-кэша в связке с хеш-таблицей.\n", + "\n", + "---\n", + "\n", + "## 8. Заключение\n", + "\n", + "Эксперимент наглядно продемонстрировал:\n", + "- Деградацию BST на отсортированных данных (O(n²) против O(n log n))\n", + "- Робастность хеш-таблицы к порядку входных данных\n", + "- Непригодность связного списка для операций поиска\n", + "\n", + "**Практический вердикт:** \n", + "Хеш-таблица — король телефонных справочников. \n", + "Сбалансированное дерево — выбор для сортированных выводов. \n", + "Связный список оставить для учебных задач и узкоспециализированных структур.\n", + "\n", + "---" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33312bba-5b47-4c1c-ac10-1beb7b8116b5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:base] *", + "language": "python", + "name": "conda-base-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}