[2] lab2 #331
73
BorisovMI/lab_1/docs/report.md
Normal file
73
BorisovMI/lab_1/docs/report.md
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# Отчёт: Задание 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).
|
||||
Loading…
Reference in New Issue
Block a user