2026-rff_mp/MininaVD/docs/Laba1.ipynb
2026-05-16 19:43:31 +03:00

229 lines
13 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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