# Отчёт по заданию 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**. **Связный список** подходит для маленьких объёмов данных или очень простых сценариев, но при большом числе записей он проигрывает по скорости поиска.