2026-rff_mp/BorisovMI/lab_1/docs/report.md

4.6 KiB
Raw Blame History

Отчёт: Задание 1 — Структуры данных

Цель работы

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

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

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

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

Хеш-таблица

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

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

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

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

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

Результаты

Таблица средних времён (секунды)

Структура Режим Вставка (с) Поиск 110 (с) Удаление 50 (с)
LinkedList случайный 12.32399 0.1279214 0.053208
LinkedList сортированный 11.701628 0.0989321 0.052782
HashTable случайный 0.7027289 0.0056565 0.0036097
HashTable сортированный 0.5376899 0.0047595 0.003316
BST случайный 0.08628449 0.000474 0.1715181
BST сортированный 33.374929 0.1351418 0.1574643

Графики

Сравнение по операциям

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

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

Вставка в список занимает ~2.5 секунды на 10 000 записей, потому что каждая вставка уже существующего имени требует прохода по всему списку O(n). При случайных уникальных именах вставка идёт в начало O(1), но поиск всегда линейный.

Хеш-таблица

Хеш-таблица показала примерно одинаковые результаты при случайном и отсортированном порядке:

Это объясняется природой хеширования: порядок вставки не влияет на распределение по бакетам. Ключ всегда попадает в предсказуемый бакет за O(1).

BST

деградирует на отсортированных данных

Причина:*при вставке отсортированных данных BST вырождается в односвязный список — каждый новый элемент больше предыдущего и уходит всегда в правое поддерево. Высота дерева становится O(n) вместо O(log n). Поиск и удаление тоже деградируют до O(n).

Вывод

HashTable — лучший выбор для телефонного справочника при частых вставках и поисках. BST лучше HashTable только если нужен отсортированный вывод без дополнительной сортировки — но при условии случайного порядка вставки или использования самобалансирующегося дерева (AVL, Red-Black).