DEV//UNIT
01 / Раздел

АЛГОРИТМЫ

Не «прочитай определение», а «увидь, что он делает». Каждый алгоритм — интерактивная визуализация, пошаговый разбор и исходный код с подсветкой активной строки.

Graphs

A* (А-стар)

Дейкстра с эвристикой: f = g + h тянет к цели, не теряя корректности.

массивначальныйO(раскрытых клеток)

Алгоритм Дейкстры

Кратчайшие пути во взвешенном графе: фиксируем ближайший узел и «расслабляем» его рёбра.

графсреднийO((V + E) log V)

Алгоритм Краскала

MST: рёбра по возрастанию веса, создающие цикл — отбрасываем.

графначальныйO(E log E)

Алгоритм Прима

MST растёт из вершины: всегда самое дешёвое ребро из дерева наружу.

графначальныйO(E log V)

Беллман-Форд

Кратчайшие пути с отрицательными рёбрами: V−1 проход ослабления.

графначальныйO(V · E)

Двудольность графа

Можно ли разбить вершины на две доли без рёбер внутри доли — BFS-раскраской.

графначальныйO(V + E)

Заливка (Flood Fill)

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

массивначальныйO(клеток области)

Компоненты связности

Сколько в графе «островков» — обход с раскраской каждой компоненты.

графначальныйO(V + E)

Поиск в глубину (DFS)

Идём вглубь до дна каждой ветки, а стек помнит, куда вернуться.

графначальныйO(V + E)

Поиск в ширину (BFS)

Обходим граф волной: сначала всех соседей, потом соседей соседей — слой за слоем.

графначальныйO(V + E)

Топологическая сортировка

Порядок вершин, уважающий все направленные рёбра (алгоритм Кана).

графначальныйO(V + E)

Флойд-Уоршелл

Все кратчайшие пути сразу: матрица, пересчитываемая через k-ю вершину.

массивначальныйO(V³)
Real-world Development

Debounce

Функция вызовется только после паузы: серия событий схлопывается в один вызов в конце.

таймлайнначальныйO(1) на событие

LFU-кэш

Вытесняет ключи с наименьшим числом обращений.

массивначальныйO(1) amortized

LRU-кэш

Вытесняет то, к чему дольше всего не обращались.

массивначальныйO(1) get/put

Leaky Bucket

Запросы копятся в очереди, обрабатываются строго равномерно.

таймлайнначальныйO(1) на запрос

Round Robin

По кругу и всем поровну: расхождение максимум один слот.

массивначальныйO(1) next

Throttle

Вызов срабатывает сразу, но не чаще раза в интервал — лишние события дропаются.

таймлайнначальныйO(1) на событие

Token Bucket

Токены капают равномерно; запрос тратит токен; пусто — отказ.

таймлайнначальныйO(1) на запрос

Консистентное хеширование

Кольцо хешей: ключ у ближайшего сервера; новый узел забирает только свой сектор.

графначальныйO(log N) поиск сервера

Экспоненциальный backoff

Ретраи с растущей задержкой и джиттером: 2^n с рандомом.

таймлайнначальныйO(попыток)
Data Structures

Trie (префиксное дерево)

Слова как пути от корня: общие префиксы хранятся один раз.

графначальныйO(длины слова)

Union-Find (DSU)

Множества с быстрым «в одном ли?» и слиянием за ~O(1).

графначальный~O(1) amortized

Двоичное дерево поиска

Слева меньше, справа больше: поиск как в отсортированном массиве, вставка — как в списке.

графначальныйO(h); O(log n) если сбалансировано

Двусвязный список

У каждого узла prev и next: удаление O(1), обход в обе стороны.

графначальныйO(1) вставка/удаление

Дек (deque)

Двусторонняя очередь: добавление и снятие с обоих концов за O(1).

массивначальныйO(1) с обоих концов

Куча (приоритетная очередь)

Min-heap: минимум в корне, вставка и извлечение за O(log n).

графначальныйO(log n) insert/extract

Очередь

FIFO: кто пришёл раньше — тот обслуживается раньше. enqueue в конец, dequeue из начала.

массивначальныйO(1) enqueue/dequeue

Связный список

Узлы и указатели next: вставка и удаление O(1), но поиск — всегда последовательный O(n).

графначальныйO(1) вставка, O(n) поиск

Стек

LIFO: последний вошёл — первым вышел. push и pop за O(1) с одной стороны.

массивначальныйO(1) push/pop

Хеш-таблица

Хеш мгновенно говорит, в какой корзине ключ: вставка и поиск O(1) в среднем.

массивначальныйO(1) в среднем
Dynamic Programming
Search & Arrays
Sorting

Быстрая сортировка

Разбиение вокруг опорного: меньшие влево, большие вправо — и рекурсия в обе половины.

столбикиначальныйO(n log n) в среднем

Пирамидальная сортировка

Max-heap: корень — всегда максимум. Извлекаем корень в хвост, просеиваем — O(n log n) на месте.

графначальныйO(n log n)

Поразрядная сортировка

Сортировка по разрядам — единицам, десяткам, сотням — устойчивыми проходами подсчёта.

столбикиначальныйO(d·(n + b))

Сортировка вставками

Берём элемент и вставляем на место в отсортированной части — как карты в руке.

массивначальныйO(n²)

Сортировка выбором

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

столбикиначальныйO(n²)

Сортировка подсчётом

Ни одного сравнения: считаем вхождения значений и раскладываем по счётчикам за O(n + k).

массивначальныйO(n + k)

Сортировка пузырьком

Соседние пары меняются местами, пока максимум не «всплывёт» в конец — и так для каждой позиции.

столбикиначальныйO(n²)

Сортировка слиянием

Сливаем отсортированные прогоны удваивающейся ширины — всегда O(n log n), без худших случаев.

столбикиначальныйO(n log n)

Тасование Фишера–Йетса

Каждая перестановка равновероятна за один проход — и один seed всегда даёт одно перемешивание.

столбикиначальныйO(n)