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