Добавление отёта

This commit is contained in:
Veronika Minina 2026-05-16 19:43:31 +03:00
parent 674eac23df
commit 185b34ea8a

228
MininaVD/docs/Laba1.ipynb Normal file
View File

@ -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,480,49 с — стабильна независимо от порядка\n",
"- **Связный список:** ~9,3 с — стабильно плох в обоих режимах\n",
"\n",
"### Поиск (110 запросов)\n",
"\n",
"\n",
"**Анализ графика поиска:**\n",
"- **BST (случайный):** ~0,00037 с — самый быстрый (O(log n))\n",
"- **Хеш-таблица:** ~0,0040,006 с — чуть медленнее, но стабильна\n",
"- **BST (отсортированный):** ~0,13 с — деградация из-за вырождения дерева\n",
"- **Связный список:** ~0,0950,112 с — самый медленный (O(n))\n",
"\n",
"### Удаление (50 записей)\n",
"\n",
"\n",
"**Анализ графика удаления:**\n",
"- **Хеш-таблица:** ~0,003 с — самый быстрый и стабильный\n",
"- **Связный список:** ~0,090,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,090,11 с | O(n) |\n",
"| Удаление | 0,090,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,090,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
}