algorithms
Алгоритмы с нуля
Знаешь один язык программирования, не знаешь алгоритмов. Закончишь, уверенно решая сложные задачи.
Начать трек →Алгоритмическое мышление и сложность
Как измерить цену алгоритма ещё до запуска.Массивы и строки
Массив: ряд ячеек и приёмы, что скользят по нему.Сортировка и бинарный поиск
Порядок даёт скорость: отсортируй раз — ищи за логарифм.Рекурсия и backtracking
Функция, что зовёт сама себя, и как перебрать все варианты.Хеширование
Меняем память на время: мгновенный ответ «видел ли я это?».Связные списки, стеки, очереди
Три способа держать последовательность, у каждого своя дисциплина.Деревья
Данные, что ветвятся, и рекурсия как способ их обойти.Кучи и приоритетные очереди
Всегда достать сначала наименьший (или наибольший) элемент.Графы
Узлы и рёбра — как обойти, упорядочить и найти кратчайшие пути.Динамическое программирование
Реши раз, запомни, переиспользуй — экспонента становится полиномом.Жадные алгоритмы
Бери лучший локальный выбор — и докажи, что он останется лучшим.Инструментарий решения задач
Биты, интервалы и чтение задачи ради верного инструмента.Проекты по этому треку
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-инженеров.