229 lines
13 KiB
Plaintext
229 lines
13 KiB
Plaintext
{
|
||
"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",
|
||
"\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
|
||
}
|