2026-rff_mp/BolonkinNM/docs/report.md
2026-05-23 20:14:56 +03:00

102 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Отчёт по заданию 1 — структуры данных
## Цель работы
Реализовать три структуры данных с нуля в процедурном стиле:
- связный список;
- хеш-таблицу;
- двоичное дерево поиска.
Также были выполнены измерения времени для операций `insert`, `find`, `delete` и построены графики по результатам эксперимента.
## Реализованные структуры
### Связный список
Узел хранится как словарь:
```python
{"name": "Имя", "phone": "123", "next": None}
```
### Хеш-таблица
Хранится как список бакетов фиксированной длины, где каждый бакет — голова связного списка или `None`.
### Двоичное дерево поиска
Узел хранится как словарь:
```python
{"name": "Имя", "phone": "123", "left": None, "right": None}
```
Для BST использованы итеративные операции, чтобы корректно работать и на отсортированных данных.
## Методика эксперимента
- Количество записей: `N = 10000`
- Режимы данных:
- случайный порядок;
- отсортированный порядок.
- Каждое измерение повторялось **5 раз**.
- В CSV сохранены:
- все отдельные замеры;
- среднее время для каждой операции, структуры и режима.
Операции:
- вставка всех записей;
- поиск 100 существующих и 10 отсутствующих имён;
- удаление 50 случайных имён.
## Графики
![insert](data/insert.png)
![find](data/find.png)
![delete](data/delete.png)
## Средние результаты
| Режим | Операция | LinkedList | HashTable | BST | Лучший результат |
|---|---:|---:|---:|---:|---|
| случайный | insert | 3.949566 | 0.208964 | 0.018028 | BST |
| случайный | find | 0.033693 | 0.001534 | 0.000190 | BST |
| случайный | delete | 0.016076 | 0.000727 | 0.000102 | BST |
| отсортированный | insert | 2.998378 | 0.208710 | 4.163651 | HashTable |
| отсортированный | find | 0.023923 | 0.001819 | 0.037987 | HashTable |
| отсортированный | delete | 0.011258 | 0.000863 | 0.019363 | HashTable |
## Анализ результатов
### Влияние порядка входных данных на BST
На случайных данных BST работает значительно быстрее, чем на отсортированных. Это связано с тем, что при случайной вставке дерево остаётся ближе к сбалансированному состоянию.
На отсортированных данных дерево вырождается в цепочку, поэтому вставка становится медленной, а поиск и удаление тоже деградируют по времени.
### Почему хеш-таблица почти не чувствительна к порядку
Хеш-таблица распределяет элементы по бакетам через хеш-функцию, поэтому сам порядок входа почти не влияет на скорость. Влияние может появляться только из-за коллизий, но в целом поведение остаётся близким к постоянному времени.
### Почему связный список всегда медленен при поиске
Поиск в связном списке выполняется последовательным просмотром элементов. Поэтому при большом количестве записей приходится проходить много узлов, и операция остаётся линейной по времени.
### Как удаление работает в каждой структуре
- В связном списке нужно сначала найти нужный узел, затем переназначить ссылку.
- В хеш-таблице сначала выбирается бакет, затем удаление выполняется внутри короткой цепочки.
- В BST удаление зависит от числа потомков: если потомок один или ноль, операция простая; если два — нужно найти преемника.
## Вывод
Для частых вставок и особенно частого поиска в реальной задаче чаще всего лучше подходит **хеш-таблица**.
Если важно получать данные в отсортированном виде, удобнее использовать **BST**.
**Связный список** подходит для маленьких объёмов данных или очень простых сценариев, но при большом числе записей он проигрывает по скорости поиска.