{
 "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
}
