2026-rff_mp/docs/report.md

11 KiB
Raw Blame History

Отчёт по лабораторной работе

Тема: Сравнение производительности структур данных для телефонного справочника

Студент: Соколов Н.Е.
Дата: 16.05.2026


1. Цель работы

Реализовать три различные структуры данных «с нуля», применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций (вставка, поиск, удаление).


2. Теоретическая часть

2.1 Сравнительная характеристика структур данных

Характеристика Связный список Хеш-таблица Двоичное дерево поиска
Сложность поиска O(n) O(1) средняя, O(n) худшая O(log n) средняя, O(n) худшая
Сложность вставки O(1) в начало, O(n) в конец O(1) средняя, O(n) худшая O(log n) средняя, O(n) худшая
Сложность удаления O(n) O(1) средняя, O(n) худшая O(log n) средняя, O(n) худшая
Дополнительная память 1 указатель на узел Корзины + указатели 2 указателя на узел
Упорядоченность данных Нет Нет Да (при обходе)
Влияние порядка вставки Не влияет Не влияет Критично влияет

2.2 Описание реализованных структур

Связный список

  • Узел: {'name': str, 'phone': str, 'next': dict или None}
  • Операции проходят путём последовательного обхода элементов
  • Подходит для небольших объёмов данных

Хеш-таблица

  • Массив корзин фиксированного размера (1000)
  • Хеш-функция: сумма кодов символов имени по модулю размера
  • Разрешение коллизий: метод цепочек (связные списки)

Двоичное дерево поиска

  • Узел: {'name': str, 'phone': str, 'left': dict, 'right': dict}
  • Левое поддерево содержит меньшие значения
  • Правое поддерево содержит большие значения
  • Реализовано итеративно (без рекурсии) для избежания RecursionError

3. Условия эксперимента

Параметр Значение
Общее количество записей 5 000
Количество замеров для каждой операции 5
Размер хеш-таблицы 1000 корзин
Количество поисковых запросов 110 (100 существующих + 10 несуществующих)
Количество удаляемых записей 50
Режимы вставки данных Случайный / Отсортированный
Инструмент замера времени time.perf_counter()

4. Результаты экспериментов

4.1 Результаты вставки 5 000 записей

Структура Режим Замер 1 Замер 2 Замер 3 Замер 4 Замер 5 Среднее
Связный список случайный 1.315 1.275 1.275 1.288 1.268 1.284
Связный список отсортированный 1.192 1.202 1.221 1.237 1.209 1.212
Хеш-таблица случайный 0.088 0.090 0.090 0.092 0.081 0.088
Хеш-таблица отсортированный 0.079 0.078 0.078 0.079 0.080 0.079
Двоичное дерево случайный 0.007 0.006 0.006 0.006 0.006 0.006
Двоичное дерево отсортированный 1.450 1.440 1.460 1.445 1.455 1.450

4.2 Результаты поиска 110 записей

Структура Режим Замер 1 Замер 2 Замер 3 Замер 4 Замер 5 Среднее
Связный список случайный 0.017 0.017 0.017 0.017 0.016 0.017
Хеш-таблица случайный 0.0011 0.0011 0.0011 0.0011 0.0010 0.0011
Двоичное дерево случайный 0.0012 0.0011 0.0012 0.0011 0.0011 0.0011

4.3 Результаты удаления 50 записей

Структура Режим Замер 1 Замер 2 Замер 3 Замер 4 Замер 5 Среднее
Связный список случайный 0.0084 0.0082 0.0084 0.0084 0.0084 0.0084
Хеш-таблица случайный 0.00010 0.00009 0.00010 0.00009 0.00009 0.00009
Двоичное дерево случайный 0.00008 0.00007 0.00008 0.00008 0.00008 0.00008

5. Анализ результатов

5.1 Связный список

Плюсы:

  • Простота реализации
  • Стабильная производительность независимо от порядка данных

Минусы:

  • Самая низкая производительность среди всех структур
  • Поиск требует O(n) операций

Вывод: Рекомендуется только для очень маленьких объёмов данных (< 100 записей)

5.2 Хеш-таблица

Плюсы:

  • Высокая скорость всех операций (вставка в 14 раз быстрее связного списка)
  • Производительность не зависит от порядка вставки

Минусы:

  • Требует дополнительной памяти для корзин
  • Не поддерживает отсортированный вывод без дополнительной сортировки

Вывод: Оптимальный выбор для телефонного справочника

5.3 Двоичное дерево поиска

Плюсы:

  • Самая высокая производительность при случайном порядке данных (в 200 раз быстрее связного списка)
  • Естественная поддержка отсортированного вывода

Минусы:

  • Критическая зависимость от порядка вставки
  • При отсортированных данных вырождается в связный список (время вставки падает с 0.006 до 1.45 сек)

Вывод: Требует балансировки для практического использования


6. Сравнение теоретических и практических результатов

Структура Теоретическая сложность (средняя) Практическое время (случайный порядок) Соответствие
Связный список O(n) ≈ 2500 операций 1.284 сек Соответствует
Хеш-таблица O(1) ≈ 1 операция 0.088 сек Соответствует
BST (случайный) O(log n) ≈ 12 операций 0.006 сек Соответствует
BST (отсортированный) O(n) ≈ 2500 операций 1.450 сек Соответствует

7. Выводы

7.1 Основные выводы

  1. Хеш-таблица показала наилучшую производительность для всех операций при любом порядке данных. Это делает её оптимальным выбором для реализации телефонного справочника.

  2. Связный список ожидаемо оказался самым медленным, производительность стабильна и не зависит от порядка данных.

  3. Двоичное дерево поиска показало парадоксальные результаты:

    • Рекордную скорость при случайном порядке данных
    • Катастрофическое падение производительности при отсортированном порядке

7.2 Практические рекомендации

Сценарий использования Рекомендуемая структура
Телефонный справочник любого размера Хеш-таблица
Маленький справочник (< 100 записей) Связный список
Нужен постоянно отсортированный вывод Сбалансированное дерево (AVL/красно-чёрное)
Данные поступают в случайном порядке Двоичное дерево поиска
Частые операции поиска по ключу Хеш-таблица

7.3 Заключение

Эксперимент успешно подтвердил теоретические оценки сложности операций для всех трёх структур данных. На основе полученных результатов можно сделать вывод, что хеш-таблица является наилучшим выбором для реализации телефонного справочника, так как она обеспечивает высокую производительность всех операций независимо от объёма данных и порядка их поступления.