Не «прочитай определение», а «увидь, что он делает». Каждый алгоритм — интерактивная визуализация, пошаговый разбор и исходный код с подсветкой активной строки.
Дейкстра с эвристикой: f = g + h тянет к цели, не теряя корректности.
Кратчайшие пути во взвешенном графе: фиксируем ближайший узел и «расслабляем» его рёбра.
MST: рёбра по возрастанию веса, создающие цикл — отбрасываем.
MST растёт из вершины: всегда самое дешёвое ребро из дерева наружу.
Кратчайшие пути с отрицательными рёбрами: V−1 проход ослабления.
Можно ли разбить вершины на две доли без рёбер внутри доли — BFS-раскраской.
Закрасить связную область: волна от точки, стены не перепрыгнуть.
Сколько в графе «островков» — обход с раскраской каждой компоненты.
Идём вглубь до дна каждой ветки, а стек помнит, куда вернуться.
Обходим граф волной: сначала всех соседей, потом соседей соседей — слой за слоем.
Порядок вершин, уважающий все направленные рёбра (алгоритм Кана).
Все кратчайшие пути сразу: матрица, пересчитываемая через k-ю вершину.
Функция вызовется только после паузы: серия событий схлопывается в один вызов в конце.
Вытесняет ключи с наименьшим числом обращений.
Вытесняет то, к чему дольше всего не обращались.
Запросы копятся в очереди, обрабатываются строго равномерно.
По кругу и всем поровну: расхождение максимум один слот.
Вызов срабатывает сразу, но не чаще раза в интервал — лишние события дропаются.
Токены капают равномерно; запрос тратит токен; пусто — отказ.
Кольцо хешей: ключ у ближайшего сервера; новый узел забирает только свой сектор.
Ретраи с растущей задержкой и джиттером: 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) в среднем.
Находим число в отсортированном массиве, отбрасывая половину зоны поиска на каждом шаге.
Два указателя идут навстречу из концов отсортированного массива — пара с нужной суммой находится за один проход.
Проще некуда: проверяем элементы по очереди, пока не найдём нужный.
Один проход строит массив префиксных сумм — и любой диапазонный запрос закрывается одним вычитанием.
Окно фиксированной ширины скользит по массиву: вместо пересчёта — вычесть уходящее, прибавить входящее.
Разбиение вокруг опорного: меньшие влево, большие вправо — и рекурсия в обе половины.
Max-heap: корень — всегда максимум. Извлекаем корень в хвост, просеиваем — O(n log n) на месте.
Сортировка по разрядам — единицам, десяткам, сотням — устойчивыми проходами подсчёта.
Берём элемент и вставляем на место в отсортированной части — как карты в руке.
В каждой зоне находим минимум и ставим его в начало зоны — обменов меньше, чем у пузырька.
Ни одного сравнения: считаем вхождения значений и раскладываем по счётчикам за O(n + k).
Соседние пары меняются местами, пока максимум не «всплывёт» в конец — и так для каждой позиции.
Сливаем отсортированные прогоны удваивающейся ширины — всегда O(n log n), без худших случаев.
Каждая перестановка равновероятна за один проход — и один seed всегда даёт одно перемешивание.