Топологическая сортировка
Порядок вершин, уважающий все направленные рёбра (алгоритм Кана).
1function topoSort(graph: Map<string, string[]>): string[] {2 const indeg = new Map<string, number>()3 for (const [v] of graph) indeg.set(v, 0)4 for (const targets of graph.values()) {5 for (const t of targets) indeg.set(t, (indeg.get(t) ?? 0) + 1)6 }7 8 const queue: string[] = [...indeg.entries()]9 .filter(([, d]) => d === 0)10 .map(([v]) => v)11 12 const order: string[] = []13 while (queue.length > 0) {14 const v = queue.shift() as string15 order.push(v)16 for (const t of graph.get(v) ?? []) {17 indeg.set(t, (indeg.get(t) ?? 0) - 1)18 if ((indeg.get(t) ?? 0) === 0) queue.push(t)19 }20 }21 22 return order23}Проблема
Порядок вершин, уважающий все направленные рёбра (алгоритм Кана).
Что вы видите
Зависимости сборки: узлы без входящих готовы сразу; снятие ребер освобождает следующих.
Как это работает
In-degree каждого узла; очередь готовых; обработанный узел уменьшает in-degree соседей. Цикл = очередь опустела раньше конца.
Пошаговый разбор
- 01
In-degree
Считаем входящие рёбра.
- 02
Готовы
In-degree 0 — в очередь.
- 03
Снятие
Обработка уменьшает счётчики соседей.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«В каком порядке собирать зависимости»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.