Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
python-version: 3.12
- name: Install dependencies
run: |
pip install ruff==0.3.4 mypy==1.20.2
pip install -r requirements.txt
- name: Lint
run: |
make lint
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,4 @@ cython_debug/
.idea/
assets/extra/
tasks.xlsx
localtests
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ format:
.PHONY: lint
lint:
@echo "Running ruff and mypy..."
@ruff check . --fix --unsafe-fixes
@mypy src --strict
@ruff check . --fix
@mypy .

.PHONY: fix
fix:
Expand Down
39 changes: 20 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,26 @@
Темы расположены в порядке увеличения сложности, начиная с базовых алгоритмов и заканчивая продвинутыми структурами
данных и алгоритмами.

| № | Кодовое имя | Тема | Секция | Описание |
|----|-----------------|----------------------------------|------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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). |
| № | Кодовое имя | Тема | Секция | Описание |
|----|-----------------|-----------------------------------|------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 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). |
| 18 | `balanced_ds` | Сбалансированные структуры данных | Продвинутые структуры данных | Реализация АВЛ-дерева. Базовые операции. Балансировка, разбиение и склейка. Динамическое дерево отрезков. Структура Rope. |

---

Expand Down
28 changes: 26 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[tool.ruff]
line-length = 120
indent-width = 4
target-version = "py310"
target-version = "py312"
output-format = "concise"

[tool.ruff.lint]
Expand Down Expand Up @@ -30,6 +30,30 @@ ignore = [
"B008", # do not perform function calls in argument defaults
"C901", # too complex
"W191", # indentation contains tabs
"RUF001", # variable name contains ambiguous letter
"RUF002", # docstring contains ambiguous letter
"RUF003" # comment contains amgiuos letter
"RUF003", # comment contains amgiuos letter
"T201" # print found
]

[tool.mypy]
strict = true
pretty = true
python_version = "3.12"

ignore_missing_imports = true
install_types = true
non_interactive = true
plugins = []

# from https://blog.wolt.com/engineering/2021/09/30/professional-grade-mypy-configuration/
disallow_untyped_defs = true
no_implicit_optional = true
check_untyped_defs = true
warn_return_any = true
show_error_codes = true
warn_unused_ignores = true

disallow_incomplete_defs = true
disallow_untyped_decorators = true
disallow_any_unimported = false
Empty file added src/balanced_ds/__init__.py
Empty file.
Empty file added src/balanced_ds/avl/__init__.py
Empty file.
9 changes: 9 additions & 0 deletions src/balanced_ds/avl/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from typing import Any

from src.balanced_ds.base.exceptions import TreeError
from src.balanced_ds.base.node import Node


class ImbalancedError(TreeError):
def __init__(self, node: Node[Any, Any], balance: int) -> None:
super().__init__(f"Balance condition violated at node: {node} with balance: {balance}")
12 changes: 12 additions & 0 deletions src/balanced_ds/avl/node.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from __future__ import annotations

from dataclasses import dataclass

from src.balanced_ds.base.node import K, V
from src.balanced_ds.bst.node import BSTNode


@dataclass
class AVLNode(BSTNode[K, V]):
def __hash__(self) -> int:
return hash((self.key, id(self)))
Loading
Loading