open atlas

algorithms

Алгоритмы с нуля

Знаешь один язык программирования, не знаешь алгоритмов. Закончишь, уверенно решая сложные задачи.

12 юнитов·128 уроков·~101 ч

Начать трек
01

Алгоритмическое мышление и сложность

Как измерить цену алгоритма ещё до запуска.
02

Массивы и строки

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

Сортировка и бинарный поиск

Порядок даёт скорость: отсортируй раз — ищи за логарифм.
04

Рекурсия и backtracking

Функция, что зовёт сама себя, и как перебрать все варианты.
05

Хеширование

Меняем память на время: мгновенный ответ «видел ли я это?».
06

Связные списки, стеки, очереди

Три способа держать последовательность, у каждого своя дисциплина.
07

Деревья

Данные, что ветвятся, и рекурсия как способ их обойти.
08

Кучи и приоритетные очереди

Всегда достать сначала наименьший (или наибольший) элемент.
09

Графы

Узлы и рёбра — как обойти, упорядочить и найти кратчайшие пути.
10

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

Реши раз, запомни, переиспользуй — экспонента становится полиномом.
01 Что это динамическое программирование? 25 мин 02 Мемоизация: нисходящий DP, кэшируй рекурсию 26 мин 03 Табуляция: восходящее ДП, таблица 25 мин 04 Одномерная ДП: грабитель домов, подъём по лестнице, способы декодирования 28 мин 05 Двумерная ДП: пути в сетке, LCS, расстояние редактирования 30 мин 06 Задача о рюкзаке 0/1 и сумма подмножества: максимизировать ценность при ограничении по весу 30 мин 07 Наибольшая возрастающая подпоследовательность: ДП за O(n^2) и приём с массивом хвостов за O(n log n) 30 мин 08 Интервальная ДП: перемножение цепочки матриц и разбиение по последнему действию 32 мин 09 Dynamic programming: тест с множественным выбором 14 мин 10 Dynamic programming: тест со свободным воспроизведением 14 мин 11 Dynamic programming: чтение кода 14 мин 12 Dynamic programming: построить и доказать DP-решатель 240 мин 13 Динамическое программирование: тренажёр для собеседований 120 мин
11

Жадные алгоритмы

Бери лучший локальный выбор — и докажи, что он останется лучшим.
12

Инструментарий решения задач

Биты, интервалы и чтение задачи ради верного инструмента.

Проекты по этому треку

Guided-проекты, которые закрепляют изученное здесь.

◆ Проекты

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

Собери lossless-компрессор с нуля: постройте оптимальное дерево prefix-free кодов снизу вверх, выведи битовые строки и докажи, что round-trip точен, а результат короче кодирования фиксированной шириной.

◆ Проекты

JSON-парсер с нуля

Напиши рекурсивно-нисходящий парсер JSON по спецификации — токенизатор, диспетчер значений, обработчик escape-последовательностей, декодер чисел — и наблюдай, как каждый крайний случай RFC 8259 превращается в конкретный путь в коде.

◆ Проекты

Числовой инструментарий

Собери небольшую библиотеку, на которую втайне опирается любая численная программа: векторы, матрицы, решатель линейных систем и описательную статистику — написанные тобой и проверенные на ответах, которые ты можешь подтвердить вручную. Здесь алгебра, которую ты выучил, перестаёт быть домашним заданием и становится кодом, который вызывает другой код. Ты на собственном опыте поймёшь, почему арифметика с плавающей точкой немного врёт, почему решить Ax = b сложнее, чем подсказывает учебник, и как доказать, что твои числа верны.

◆ Проекты

Движок поиска маршрутов

Четыре алгоритма поиска — одна общая задача: добраться из A в B по взвешенной сетке. Ты построишь BFS, DFS, Dijkstra и A* на одной модели графа, а затем запустишь их бок о бок и увидишь, как они расходятся: DFS бросается в тупик, BFS равномерно растекается, Dijkstra ползёт наружу по стоимости, A* тянется к цели. Именно здесь раздел про алгоритмы перестаёт быть набором фактов и становится инструментами, между которыми ты выбираешь осознанно.

◆ Проекты

Движок регулярных выражений

Собери движок регулярных выражений с нуля через конструкцию Томпсона и симуляцию подмножества состояний — тот же метод, что делает grep и re2 иммунными к катастрофическому обратному ходу.

◆ Проекты

Мини-сигналы

Собери реактивную библиотеку сигналов примерно в 100 строк (signal/computed/effect) с автоматическим отслеживанием зависимостей и безглючными батч-обновлениями — та же модель, что лежит в основе Solid, Preact Signals и Vue 3.

◆ Проекты

Список с пропусками

Реализуй вероятностную упорядоченную структуру данных, которая обеспечивает O(log n) поиск, вставку и удаление без балансировочной бухгалтерии деревьев — только слоистые «экспресс-полосы» через отсортированный связный список.

◆ Проекты

Текстовый diff — алгоритм Майерса

Реализуй алгоритм diff Майерса с нуля: вычисли наибольшую общую подпоследовательность, построй edit script обратным ходом, докажи минимальность и применяй патчи так, чтобы любой round-trip был побайтово точным.

◆ Проекты

Крошечная стековая виртуальная машина

Собери машину, которая исполняет программы. Ты определишь небольшой набор инструкций в виде байт-кода, напишешь ассемблер, превращающий читаемые мнемоники в байты, и напишешь цикл интерпретатора, который по одной достаёт, декодирует и исполняет их. К концу ты разберёшь по косточкам весь путь от строки исходника до работающей программы — потому что каждый его слой написал сам.

◆ Проекты

Планировщик сборки на топологической сортировке

Собери планировщик задач на основе DAG — как Make или CI-пайплайн — который упорядочивает задачи по зависимостям, обнаруживает циклы до дедлока и определяет, какие задачи можно выполнять параллельно.

◆ Проекты

Движок автодополнения на основе trie

Собери префиксное дерево для ранжированного автодополнения — вставляй слова с весами, проходи каждый префикс за O(длина_префикса + результаты) и детерминированно разрешай ничьи без базы данных.

◆ Проекты

Прувер по таблицам истинности

Преврати логику, которую ты изучал на бумаге, в работающий движок: распарси формулу пропозициональной логики в дерево, обойди все наборы значений и построй её таблицу истинности, а затем реши, тавтология ли она, выполнима ли и эквивалентна ли другой формуле. Логика — это место, где строгость становится механической, и написать машину, которая проверяет рассуждение, — самый верный способ понять, почему рассуждение верно. В итоге у тебя будет маленький, но честный проверяльщик теорем, которому ты доверяешь, потому что собрал каждый его шаг сам.

◆ Проекты

Union-Find (система непересекающихся множеств)

Построй структуру непересекающихся множеств от наивного массива родителей до почти константного амортизированного времени — и прими на ней алгоритм Краскала для поиска минимального остовного дерева.

Следующий трек

Сети и протоколы

От битов в проводе до TLS 1.3 — путь одного пакета, рассказанный для senior-инженеров.