# Отчёт: Задание 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 |

### Графики

![Сравнение по операциям](performance_graphs.png)

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

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

Вставка в список занимает ~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).
