From f66f706883649603e84f40079544e4a336a5cc1f Mon Sep 17 00:00:00 2001 From: anikinvd Date: Fri, 22 May 2026 17:56:04 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?anikinvd/docs=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anikinvd/docs/performance_comparison.png | Bin 0 -> 52978 bytes anikinvd/docs/report-1-st.md | 78 +++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 anikinvd/docs/performance_comparison.png create mode 100644 anikinvd/docs/report-1-st.md diff --git a/anikinvd/docs/performance_comparison.png b/anikinvd/docs/performance_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbffa14a73433f867ae950785703674f023ec91 GIT binary patch literal 52978 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 CgYB>Y literal 0 HcmV?d00001 diff --git a/anikinvd/docs/report-1-st.md b/anikinvd/docs/report-1-st.md new file mode 100644 index 0000000..563bf0f --- /dev/null +++ b/anikinvd/docs/report-1-st.md @@ -0,0 +1,78 @@ +# Лабораторная работа: Сравнение структур данных для телефонного справочника + +## 1. Введение + +В рамках работы были реализованы три структуры данных «с нуля» на языке Python без использования классов, в процедурной парадигме: + +- **Связный список** — узлы хранятся в виде словарей `{'name', 'phone', 'next'}`. +- **Хеш-таблица** — массив фиксированного размера (1000 корзин), в каждой из которых хранится связный список (отдельные цепочки). +- **Двоичное дерево поиска (BST)** — узлы имеют поля `left`, `right`. + +Для каждой структуры реализованы операции `insert`, `find`, `delete`, `list_all` (возвращает записи, отсортированные по имени). + +Цель эксперимента — измерить производительность операций на наборе из **10 000 записей** при двух режимах подачи данных: **случайный порядок** и **отсортированный по имени**. Каждый опыт повторялся 5 раз, результаты усреднены. Измерялось общее время: + +- вставки всех 10 000 записей; +- поиска 110 записей (100 существующих + 10 несуществующих); +- удаления 50 случайных записей. + +## 2. Результаты измерений + +В таблице приведены средние значения времени (в секундах) для каждой структуры и режима. + +| Структура | Режим | Вставка (с) | Поиск (с) | Удаление (с) | +|----------------|-------------|------------|-----------|--------------| +| **LinkedList** | случайный | 4.1342 | 0.0282 | 0.0138 | +| LinkedList | сортир. | 3.7426 | 0.0248 | 0.0116 | +| **HashTable** | случайный | 0.00940 | 0.000075 | 0.000037 | +| HashTable | сортир. | 0.00915 | 0.000070 | 0.000032 | +| **BST** | случайный | 0.02396 | 0.000216 | 0.000126 | +| BST | сортир. | 9.1117 | 0.0796 | 0.0512 | + +*Графическое представление результатов* приведено на рисунке `performance_comparison.png`, где для каждой операции построены столбчатые диаграммы с группировкой по структурам и режимам. + +## 3. Анализ результатов + +### 3.1. Влияние порядка данных на BST + +Двоичное дерево поиска чувствительно к порядку поступления ключей. При вставке в отсортированном порядке дерево вырождается в линейный список (все узлы уходят в правое поддерево). Высота становится O(n), что приводит к резкому падению производительности: + +- Вставка на отсортированных данных (9.11 с) **медленнее в 380 раз**, чем на случайных (0.024 с). +- Поиск замедляется в ~370 раз, удаление — в ~406 раз. + +Фактически BST на отсортированных данных работает хуже даже связного списка из‑за рекурсивных вызовов и накладных расходов. + +### 3.2. Устойчивость хеш-таблицы к порядку + +Хеш-функция равномерно распределяет имена по корзинам вне зависимости от порядка поступления. Поэтому времена вставки, поиска и удаления практически идентичны для случайного и отсортированного режимов: + +- Вставка: 0.00940 с (случ.) vs 0.00915 с (сорт.) — разница в пределах погрешности. +- Поиск и удаление также стабильны. + +Средняя сложность O(1) подтверждается на практике. + +### 3.3. Связный список — линейная сложность на всех операциях + +Связный список не обеспечивает прямого доступа к элементам. Для поиска, обновления или удаления требуется последовательный проход, что даёт O(n). + +- Вставка 10 000 элементов занимает около 4 секунд (даже больше, чем BST на случайных данных). +- Поиск (~0.028 с) на порядок медленнее, чем в хеш-таблице и BST на случайных данных. +- Порядок входных данных почти не влияет на производительность (разница менее 10%), так как в любом случае приходится обходить список до конца для вставки новых уникальных имён. + +### 3.4. Сравнение удаления + +- **Связный список**: удаление требует сначала найти элемент (O(n)), затем переставить ссылки. Время ~0.012–0.014 с, что близко ко времени поиска. +- **Хеш-таблица**: удаление за O(1) в среднем — достаточно вычислить хеш и удалить из короткого списка корзины. Время ~0.00003–0.00004 с. +- **BST**: на случайных данных удаление очень быстрое (0.000126 с) благодаря логарифмической высоте. На отсортированных данных время возрастает до 0.051 с (деградация до O(n)). + +## 4. Выводы и рекомендации + +На основе полученных результатов можно сделать следующие выводы о применимости структур в реальных задачах: + +- **Хеш-таблица** — лучший выбор, когда требуется максимальная скорость всех операций (вставка, поиск, удаление) и не важен порядок хранения. Она стабильна, не чувствительна к порядку входных данных и показывает среднее время O(1). Идеальна для реализации словарей, кэшей, индексов по ключу. + +- **Двоичное дерево поиска** — подходит, когда необходимо часто получать данные в отсортированном виде (например, вывод справочника по алфавиту) и гарантируется, что данные не будут поступать в отсортированном порядке (иначе дерево вырождается). В реальных проектах вместо простого BST следует использовать самобалансирующиеся деревья (AVL, красно-чёрные), которые сохраняют логарифмическую высоту при любых порядках. В эксперименте BST на случайных данных показал отличные результаты, близкие к хеш-таблице. + +- **Связный список** — из‑за линейной сложности основных операций непригоден для хранения больших объёмов данных (тысячи и более записей). Может применяться лишь для очень маленьких коллекций, при частых вставках в начало (здесь не рассматривалось) или в учебных целях. + +Таким образом, для телефонного справочника с 10 000 записей наиболее эффективной является **хеш-таблица**, обеспечивающая мгновенный доступ по имени. Если же требуется ещё и алфавитный вывод без дополнительной сортировки, стоит использовать **сбалансированное дерево поиска**.