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²)

Мосты и точки сочленения

Рёбра, чьё удаление рвёт граф: low[w] > tin[v].

графпродвинутыйO(V + E)

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

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

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

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

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

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

Поиск цикла (DFS-краски)

Серое ребро в серую вершину = цикл: DFS трёхцветный.

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

Тарьян (SCC одним проходом)

Сильно связные компоненты за один DFS: низкие ссылки находят корни.

графпродвинутыйO(V + E)

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

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

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

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

Все кратчайшие пути сразу: пробуем каждую вершину как пересадку и обновляем таблицу.

массивсреднийO(V³)

Эйлеров путь

Все рёбра ровно один раз: 0 или 2 нечётных вершин.

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

AVL-дерево

BST, которое само себя балансирует: высота всегда O(log n).

графсреднийO(log n)

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) с обоих концов

Дерево Фенвика (BIT)

Суммы префиксов И точечные обновления — оба за O(log n).

массивсреднийO(log n)

Дерево отрезков

Суммы/минимумы на любом диапазоне из 2-3 готовых узлов.

графсреднийO(log n)

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

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) в среднем
AI/ML

DBSCAN

Кластеры по плотности: core-точки расширяются, шум честно помечается.

массивсреднийO(n log n)

MCTS (дерево+Монте-Карло)

Выбор/расширение/симуляция/бэкпроп: статистика вместо полного перебора.

графпродвинутыйO(sims · игра)

k ближайших соседей

Класс новой точки — голосование k ближайших: «скажи, кто твои соседи».

массивначальныйO(n) на запрос

k-means

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

массивсреднийO(итераций · n · k)

Альфа-бета отсечение

Тот же ответ, что минимакс — но ветки, не влияющие на решение, не раскрываются.

графсреднийO(b^(d/2)) в лучшем

Генетический алгоритм

Отбор → кроссовер → мутация: эволюция без градиентов.

массивсреднийO(gen · pop² · len)

Градиентный спуск

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

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

Дерево решений (ID3)

Вопросы по приросту информации: дерево само выбирает, что спросить.

массивначальныйO(n · признаки · глубина)

Линейная регрессия

Прямая через точки с минимальной суммой квадратов ошибок: y = kx + b.

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

Логистическая регрессия

Сигмоида превращает прямую в вероятность класса 0..1.

массивначальныйO(эпохи · n)

Минимакс

Гарантированный результат игры: максимизируем минимум, который оставит соперник.

графначальныйO(b^d)

Наивный Байес

Теорема Байеса с наивной независимостью: произведение вероятностей признаков.

массивначальныйO(признаки · классы)

Перцептрон

Один нейрон учится разделять классы: ошибка сдвигает веса.

массивначальныйO(эпохи · n)
Real-world Development

Debounce

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

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

LFU-кэш

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

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

LRU-кэш

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

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

Leaky Bucket

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

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

PageRank

Важность = голоса входящих ссылок с затуханием: ядро Google.

графсреднийO(iter · E)

Round Robin

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

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

Throttle

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

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

Token Bucket

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

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

Выборка из потока (reservoir)

Равновероятная выборка k элементов из потока неизвестной длины за один проход.

массивсреднийO(n)

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

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

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

Фильтр Блума

Битовая карта отвечает «точно нет» или «возможно да» — за биты вместо гигабайтов.

массивсреднийO(k) хешей

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

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

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

LZW-сжатие

Словарь фраз растёт на ходу; словарь не хранится — decoder строит его сам.

массивсреднийO(n)

Z-функция

z[i] — сколько символов суффикса i совпадает с префиксом. Один массив — поиск, повторы, сжатие.

массивсреднийO(n)

Анаграммы

Те же буквы — то же слово: частоты символов решают за один проход.

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

Ахо-Корасик

Много образцов одним проходом: автомат из Trie + fail-ссылок.

графпродвинутыйO(n + m + вхождения)

Бойер-Мур

Сравниваем справа налево, сдвигаем по таблице последнего символа — часто быстрее длины текста.

массивсреднийO(n + m) в среднем

Кнут-Моррис-Пратт (KMP)

Префикс-функция запоминает, где образец совпадает сам с собой, — текст сканируется без откатов.

массивсреднийO(n + m)

Кодирование Хаффмана

Частые символы — короткие коды: оптимальное префиксное сжатие.

массивсреднийO(n log n)

Кодирование длин серий (RLE)

Повторы сжимаются в «буква + счёт»: AAAABBB → A4B3.

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

Манахер: палиндромы за O(n)

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

массивпродвинутыйO(n)

Наибольшая общая подпоследовательность

Самая длинная цепочка символов, встречающаяся в обоих словах в том же порядке.

массивсреднийO(m·n)

Наивный поиск подстроки

Прикладываем образец к каждой позиции и сравниваем буквы — честный O(n·m).

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

Рабин-Карп

Скользящий хеш: окно бежит по тексту, числа сравниваются за O(1).

массивсреднийO(n + m) в среднем

Расстояние Левенштейна

Минимальное число вставок/удалений/замен, чтобы превратить одно слово в другое.

массивсреднийO(m·n)
Recursion & Backtracking
Dynamic Programming

TSP: битовое DP (Held-Karp)

Коммивояжёр за 2ⁿ·n²: подмножества городов в битах маски.

массивпродвинутыйO(2ⁿ · n²)

Алгоритм Кадане

Максимальная сумма подотрезка за один проход: текущая сумма либо растёт, либо сбрасывается.

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

Дом-грабитель

Грабить дома нельзя два подряд: взять или пропустить — два бегущих максимума.

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

Лестница (шаг 1 или 2)

Сколькими способами подняться по лестнице — это Фибоначчи в костюме задачи.

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

Минимальный путь по сетке

Из угла в угол по сетке, только вправо и вниз — минимальная сумма маршрута.

массивначальныйO(rows·cols)

Наибольшая возрастающая подпоследовательность

Самая длинная цепочка роста — элементы можно пропускать.

столбикисреднийO(n²)

Порядок умножения матриц

Где ставить скобки: порядок умножений меняет стоимость в разы.

массивсреднийO(n³)

Рюкзак 0/1

Что взять в рюкзак при лимите веса: каждая вещь либо в рюкзаке, либо нет.

массивсреднийO(n · capacity)

Сдача минимальным числом монет

Набрать сумму минимальным числом монет — жадность часто врёт, динамика честна.

массивсреднийO(amount · монеты)
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)
Math
Greedy