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