# Отчёт по заданию 1  
## Структуры данных: LinkedList, HashTable, BST
### Ветка: `Task1(vinichukan)`  

---

# 1. Цель работы

Реализовать три структуры данных «с нуля» в процедурной парадигме:

- связный список  
- хеш‑таблица  
- двоичное дерево поиска (BST)

и экспериментально сравнить их производительность на операциях:

- insert  
- find  
- delete  
- list_all  

---

# 2. Реализованные структуры данных

Код расположен в папке `src/`:

- `linked_list.py`
- `hash_table.py`
- `bst.py`
- `benchmark.py`

Все структуры реализованы вручную, без использования классов.

---

# 3. Методика эксперимента

### 3.1. Генерация данных

Создано N = 10 000 записей вида:

Подготовлены два набора:

- **records_shuffled** — случайный порядок  
- **records_sorted** — отсортированные по имени  

### 3.2. Замеры времени

Использовался `time.perf_counter()`.

Для каждой структуры и каждого режима измерялись:

- время вставки всех элементов  
- время поиска 110 элементов  
- время удаления 50 элементов  

Каждый эксперимент повторён 5 раз, результаты усреднены.

---

# 4. Результаты экспериментов

| Structure   | Mode      | Operation | Time (sec) |
|-------------|-----------|-----------|------------|
| LinkedList  | shuffled  | insert    | 3.3624     |
| HashTable   | shuffled  | insert    | 0.2036     |
| BST         | shuffled  | insert    | 0.0205     |
| LinkedList  | sorted    | insert    | 2.8639     |
| HashTable   | sorted    | insert    | 0.1816     |
| BST         | sorted    | insert    | 5.2378     |

---

# 5. График сравнения

```python
import matplotlib.pyplot as plt

structures = ["LinkedList", "HashTable", "BST"]
shuffled = [3.3624, 0.2036, 0.0205]
sorted_data = [2.8639, 0.1816, 5.2378]

plt.figure(figsize=(10,6))
plt.bar([s + " (shuffled)" for s in structures], shuffled, label="shuffled")
plt.bar([s + " (sorted)" for s in structures], sorted_data, label="sorted")

plt.ylabel("Time (seconds)")
plt.title("Insert Performance Comparison")
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout()
plt.show()


