Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 98 additions & 48 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,100 @@
# Algorithms Course

Авторский курс по алгоритмам и структурам данных с разбором теории и решением задач.

## Ключевые особенности

- **15+** разобранных тем, к каждой теме легкий конспект
- **70+** практических задач с LeetCode, Stepik и собеседований в БигТех
- Решение **к каждой задаче** на лаконичном Python с комментариями
- **1000+** автоматизированных тестов для проверки решений

## Структура курса

| № | Тема | Секция | Папка |
|----|----------------------------------|------------------------------|-----------------|
| 1 | Введение в алгоритмы | Базовые алгоритмы | `intro` |
| 2 | Базовые структуры данных | Базовые алгоритмы | `base_ds` |
| 3 | Поиски | Базовые алгоритмы | `search` |
| 4 | Сортировки | Базовые алгоритмы | `sorting` |
| 5 | Два указателя | Методы решения | `two_pointers` |
| 6 | Сканирующая прямая | Методы решения | `scanline` |
| 7 | Разделяй и властвуй | Методы решения | `dnc` |
| 8 | Динамическое программирование | Методы решения | `dp` |
| 9 | Префиксные суммы | Продвинутые подходы | `prefix_sums` |
| 10 | Жадные алгоритмы | Продвинутые подходы | `greedy` |
| 11 | Теория чисел | Продвинутые подходы | `number_theory` |
| 12 | 2D Динамическое программирование | Продвинутые подходы | `dp2` |
| 13 | Деревья | Продвинутые структуры данных | `trees` |
| 14 | Кучи | Продвинутые структуры данных | `heaps` |
| 15 | Непересекающиеся множества | Продвинутые структуры данных | `dsu` |
| 16 | Хеш-таблицы | Продвинутые структуры данных | `hash_tables` |
| 17 | Графы | Продвинутые структуры данных | `graphs` |

Каждая тема содержит:

* **Теоретический конспект**, легко и доступно объясняющий тему (папка `/abstract/`, например `/abstract/intro.md`)
* **Подборка задач** разного уровня сложности на отработку полученных навыков (файл `README.md`)
* **Решения задач** из подборки на Python (файлы `*.py`, например `fib.py`)
* **Автотесты** для каждого решения, покрывающие минимальный набор ошибок (папка `/tests/`, например
`/tests/test_intro/test_fib.py`)

## Источники

* [LeetCode - The World's Leading Online Programming Learning Platform](https://leetcode.com/)
* [Алгоритмы: теория и практика. Методы - Stepik](https://stepik.org/course/217)
* [Алгоритмы: теория и практика. Структуры данных - Stepik](https://stepik.org/course/1547)
* [Тренировки по алгоритмам от Яндекса](https://yandex.ru/yaintern/algorithm-training_2)
* [AlekOS - YouTube](https://www.youtube.com/@AlekOS/videos)
# Data Structures and Algorithms Notebook

[![Lint](https://github.com/everysoftware/algorithms-course/actions/workflows/lint.yml/badge.svg)](https://github.com/everysoftware/dsa-notebook/actions/workflows/lint.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
![Python](https://img.shields.io/badge/Python-3.12+-blue.svg)

Реализация популярных структур данных и алгоритмов на Python с акцентом на практические задачи и собеседования.

---

## Описание

- Представлены **80+** задач на **15+** тем из разных областей алгоритмов
- **Широкий** охват тем: от базовых алгоритмов и структур данных до продвинутых методов и теории чисел
- Задачи из **реальных** собеседований, LeetCode, Stepik, тренировок от Яндекса и других источников
- Прокомментированные решения на **Python** (иногда даже несколько вариантов)
- Теоретические **Markdown конспекты**, объясняющие ключевые идеи и подходы к решению задач
- **1000+** автоматизированных тестов (pytest) для проверки корректности
- Качество кода гарантировано **Ruff** и **Mypy** (автоматическая проверка после коммита)

## Охваченные темы

Темы расположены в порядке увеличения сложности, начиная с базовых алгоритмов и заканчивая продвинутыми структурами
данных и алгоритмами.

| № | Кодовое имя | Тема | Секция | Описание |
|----|-----------------|----------------------------------|------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 | `intro` | Введение в алгоритмы | Введение в алгоритмы | Введение в алгоритмы, базовые задачи и методы решения. Числа Фибоначчи. Линейный поиск. Нахождение 1, 2, 3 максимумов в массиве. |
| 2 | `base_ds` | Базовые структуры данных | Введение в алгоритмы | Использование массивов, стеков, очередей и двухсторонних очередей (деков) для решения задач. Основные операции и алгоритмы на этих структурах. |
| 3 | `search` | Поиски | Введение в алгоритмы | Поиски на отсортированных данных: бинарный, удваивающися и экспоненциальный. Их применение и оптимизации. |
| 4 | `sorting` | Сортировки | Введение в алгоритмы | Классические алгоритмы сортировки: сортировка вставками, выбором, пузырьком, слиянием и быстрая сортировка. Сортировка подсчетом, поразрядная сортировка. |
| 5 | `two_pointers` | Два указателя | Методы решения | Методы решения задач на массивы и строки с помощью двух указателей. Поиск пар чисел и анализ подстрок |
| 6 | `scanline` | Сканирующая прямая | Методы решения | Решение задач на отрезках и интервалах с помощью сканирующей прямой. Нахождение пересечений, объединений и покрытий. |
| 7 | `dnc` | Разделяй и властвуй | Методы решения | Разбиение на независимые подзадачи. Быстрое возведение в степень, поиск медианы и k-й порядковой статистики. Алгоритм Карацубы |
| 8 | `dp` | Динамическое программирование | Методы решения | Разбиение на пересекающиеся подзадачи. Классические задачи: рюкзак, размен монет, наибольшая возрастающая подпоследовательность. Восстановленеи пути. |
| 9 | `prefix_sums` | Префиксные суммы | Продвинутые методы | Использование префиксных сумм для оптимизации запросов на отрезках. Решение задач на суммы, произведения и другие агрегаты. |
| 10 | `greedy` | Жадные алгоритмы | Продвинутые методы | Жадные алгоритмы для оптимальных решений. Задачи на выбор оптимальных элементов, планирование задач и нахождение минимальных покрытий. |
| 11 | `number_theory` | Теория чисел | Продвинутые методы | Теоретические задачи на делимость, простые числа, алгоритмы Евклида и расширенного Евклида, факторизацию и тесты на простоту. |
| 12 | `dp2` | 2D Динамическое программирование | Продвинутые методы | Применение ДП на двухмерных даннных. Классические задачи: расстояние редактирования, наибольшая общая подпоследовательность, денежный робот. |
| 13 | `trees` | Деревья | Продвинутые структуры данных | Двоичные деревья поиска. Алгоритмы обхода DFS и BFS. Поиск высоты дерева и проверка общих свойств BST. Итеративные и рекурсивные алгоритмы. |
| 14 | `heaps` | Кучи | Продвинутые структуры данных | Реализация кучи (очереди с приоритетом) на массиве. Алгоритмы вставки, удаления и извлечения максимума. Сортировка кучей. Алгоритм Хаффмана. |
| 15 | `dsu` | Непересекающиеся множества | Продвинутые структуры данных | Реализация структуры данных "Непересекающиеся множества" (DSU/Union-Find). Алгоритмы объединения и поиска. Применение в задачах на компоненты связности. |
| 16 | `hash_tables` | Хеш-таблицы | Продвинутые структуры данных | Реализация хеш-таблицы на массиве. Алгоритмы вставки, удаления и поиска. Разрешение коллизий с помощью цепочек и открытой адресации. |
| 17 | `graphs` | Графы | Продвинутые структуры данных | Реализация графов с помощью списков смежности. Алгоритмы обхода DFS и BFS. Нахождение кратчайших путей (Dijkstra, Bellman-Ford). |

---

## Файловая структура

* `src` - папка с условиями и решениями задач по темам
* `tests` - папка с автотестами для каждого решения
* `abstract` - папка с теоретическими конспектами по каждой теме
* `assets` - дополнительные материалы, такие как презентации, схемы и диаграммы

Например, для темы "Введение в алгоритмы" структура будет следующей:

```
src/
├── intro
│ ├── README.md # Подборка задач
│ ├── fib.py # Решение задачи на Fibonacci
│ └── ...
tests/
├── test_intro
│ ├── test_fib.py # Автотесты для решения на Fibonacci
│ └── ...
abstract/
├── intro.md # Теоретический конспект по теме "Введение в алгоритмы"
├── base_ds.md # Теоретический конспект по теме "Базовые структуры данных"
└── ...
```

---

## Локальное использование

1. Склонируйте репозиторий:
```bash
git clone https://github.com/everysoftware/algorithms-course
```
2. Создайте виртуальное окружение:
```bash
python -m venv venv
source venv/bin/activate # Linux/MacOS
venv\Scripts\activate # Windows
```
3. Установите зависимости:
```bash
pip install -r requirements.txt
```
4. Запустите нужные тесты, например, для задачи "Числа Фибоначчи":
```bash
pytest tests/test_intro/test_fib.py
```
5. Изучайте теорию в папке `abstract` и решайте задачи в папке `src`. Не забывайте запускать тесты для проверки своих
решений!

---

**Made with ❤️**
Loading