Не «прочитай определение», а «увидь, что он делает». Каждый алгоритм — интерактивная визуализация, пошаговый разбор и исходный код с подсветкой активной строки.
Дейкстра с эвристикой: f = g + h тянет к цели, не теряя корректности.
Кратчайшие пути во взвешенном графе: фиксируем ближайший узел и «расслабляем» его рёбра.
MST: рёбра по возрастанию веса, создающие цикл — отбрасываем.
MST растёт из вершины: всегда самое дешёвое ребро из дерева наружу.
Кратчайшие пути с отрицательными рёбрами: V−1 проход ослабления.
Можно ли разбить вершины на две доли без рёбер внутри доли — BFS-раскраской.
Закрасить связную область: волна от точки, стены не перепрыгнуть.
Сколько в графе «островков» — обход с раскраской каждой компоненты.
Два прохода DFS — и множества «взаимно достижимых» вершин найдены.
Сколько прокачается через сеть с узкими местами: BFS-пути насыщают рёбра.
Рёбра, чьё удаление рвёт граф: low[w] > tin[v].
Идём вглубь до дна каждой ветки, а стек помнит, куда вернуться.
Обходим граф волной: сначала всех соседей, потом соседей соседей — слой за слоем.
Серое ребро в серую вершину = цикл: DFS трёхцветный.
Сильно связные компоненты за один DFS: низкие ссылки находят корни.
Порядок вершин, уважающий все направленные рёбра (алгоритм Кана).
Все кратчайшие пути сразу: пробуем каждую вершину как пересадку и обновляем таблицу.
Все рёбра ровно один раз: 0 или 2 нечётных вершин.
BST, которое само себя балансирует: высота всегда O(log n).
Слова как пути от корня: общие префиксы хранятся один раз.
Множества с быстрым «в одном ли?» и слиянием за ~O(1).
Слева меньше, справа больше: поиск как в отсортированном массиве, вставка — как в списке.
У каждого узла prev и next: удаление O(1), обход в обе стороны.
Двусторонняя очередь: добавление и снятие с обоих концов за O(1).
Суммы префиксов И точечные обновления — оба за O(log n).
Суммы/минимумы на любом диапазоне из 2-3 готовых узлов.
Min-heap: минимум в корне, вставка и извлечение за O(log n).
FIFO: кто пришёл раньше — тот обслуживается раньше. enqueue в конец, dequeue из начала.
Узлы и указатели next: вставка и удаление O(1), но поиск — всегда последовательный O(n).
LIFO: последний вошёл — первым вышел. push и pop за O(1) с одной стороны.
Хеш мгновенно говорит, в какой корзине ключ: вставка и поиск O(1) в среднем.
Кластеры по плотности: core-точки расширяются, шум честно помечается.
Выбор/расширение/симуляция/бэкпроп: статистика вместо полного перебора.
Класс новой точки — голосование k ближайших: «скажи, кто твои соседи».
Кластеризация без учителя: центроиды притягивают точки, точки перетягивают центроиды.
Тот же ответ, что минимакс — но ветки, не влияющие на решение, не раскрываются.
Отбор → кроссовер → мутация: эволюция без градиентов.
Спуск по склону функции ошибки: шаг против наклона, пропорционально ему.
Вопросы по приросту информации: дерево само выбирает, что спросить.
Прямая через точки с минимальной суммой квадратов ошибок: y = kx + b.
Сигмоида превращает прямую в вероятность класса 0..1.
Гарантированный результат игры: максимизируем минимум, который оставит соперник.
Теорема Байеса с наивной независимостью: произведение вероятностей признаков.
Один нейрон учится разделять классы: ошибка сдвигает веса.
Функция вызовется только после паузы: серия событий схлопывается в один вызов в конце.
Вытесняет ключи с наименьшим числом обращений.
Вытесняет то, к чему дольше всего не обращались.
Запросы копятся в очереди, обрабатываются строго равномерно.
Важность = голоса входящих ссылок с затуханием: ядро Google.
По кругу и всем поровну: расхождение максимум один слот.
Вызов срабатывает сразу, но не чаще раза в интервал — лишние события дропаются.
Токены капают равномерно; запрос тратит токен; пусто — отказ.
Равновероятная выборка k элементов из потока неизвестной длины за один проход.
Кольцо хешей: ключ у ближайшего сервера; новый узел забирает только свой сектор.
Битовая карта отвечает «точно нет» или «возможно да» — за биты вместо гигабайтов.
Ретраи с растущей задержкой и джиттером: 2^n с рандомом.
Словарь фраз растёт на ходу; словарь не хранится — decoder строит его сам.
z[i] — сколько символов суффикса i совпадает с префиксом. Один массив — поиск, повторы, сжатие.
Те же буквы — то же слово: частоты символов решают за один проход.
Много образцов одним проходом: автомат из Trie + fail-ссылок.
Сравниваем справа налево, сдвигаем по таблице последнего символа — часто быстрее длины текста.
Префикс-функция запоминает, где образец совпадает сам с собой, — текст сканируется без откатов.
Частые символы — короткие коды: оптимальное префиксное сжатие.
Повторы сжимаются в «буква + счёт»: AAAABBB → A4B3.
Все палиндромные радиусы за один проход — зеркала внутри уже найденного.
Самая длинная цепочка символов, встречающаяся в обоих словах в том же порядке.
Прикладываем образец к каждой позиции и сравниваем буквы — честный O(n·m).
Скользящий хеш: окно бежит по тексту, числа сравниваются за O(1).
Минимальное число вставок/удалений/замен, чтобы превратить одно слово в другое.
Расставить ферзей так, чтобы никто никого не бил: перебор с откатами.
Дерево выбора: n! порядков без повторов и пропусков.
Дерево вызовов fib(n): наивная рекурсия пересчитывает одно и то же экспоненциально много раз.
Коммивояжёр за 2ⁿ·n²: подмножества городов в битах маски.
Максимальная сумма подотрезка за один проход: текущая сумма либо растёт, либо сбрасывается.
Грабить дома нельзя два подряд: взять или пропустить — два бегущих максимума.
Сколькими способами подняться по лестнице — это Фибоначчи в костюме задачи.
Из угла в угол по сетке, только вправо и вниз — минимальная сумма маршрута.
Самая длинная цепочка роста — элементы можно пропускать.
Где ставить скобки: порядок умножений меняет стоимость в разы.
Что взять в рюкзак при лимите веса: каждая вещь либо в рюкзаке, либо нет.
Набрать сумму минимальным числом монет — жадность часто врёт, динамика честна.
Находим число в отсортированном массиве, отбрасывая половину зоны поиска на каждом шаге.
Бинарный поиск в значении ответа: если свойство монотонно — работает.
Два указателя идут навстречу из концов отсортированного массива — пара с нужной суммой находится за один проход.
Проще некуда: проверяем элементы по очереди, пока не найдём нужный.
Один проход строит массив префиксных сумм — и любой диапазонный запрос закрывается одним вычитанием.
Окно фиксированной ширины скользит по массиву: вместо пересчёта — вычесть уходящее, прибавить входящее.
Разбиение вокруг опорного: меньшие влево, большие вправо — и рекурсия в обе половины.
Max-heap: корень — всегда максимум. Извлекаем корень в хвост, просеиваем — O(n log n) на месте.
Сортировка по разрядам — единицам, десяткам, сотням — устойчивыми проходами подсчёта.
Берём элемент и вставляем на место в отсортированной части — как карты в руке.
В каждой зоне находим минимум и ставим его в начало зоны — обменов меньше, чем у пузырька.
Ни одного сравнения: считаем вхождения значений и раскладываем по счётчикам за O(n + k).
Соседние пары меняются местами, пока максимум не «всплывёт» в конец — и так для каждой позиции.
Сливаем отсортированные прогоны удваивающейся ширины — всегда O(n log n), без худших случаев.
Каждая перестановка равновероятна за один проход — и один seed всегда даёт одно перемешивание.
a^n за log n умножений: биты экспоненты + возведение в квадрат.
Резинка вокруг точек: минимальный выпуклый контур.
Свидетели составности отсеивают за O(k·log³ n).
НОД двух чисел через остатки: a mod b, пока не ноль.
Все простые до N: вычёркиваем кратные каждого простого.