Все темы
93

Порядок для вещей, зависящих друг от друга

Tier 1Закрыто

Где применяется

1. Задача

Ты одеваешься. Носки раньше ботинок. Рубашка раньше пиджака. Бельё раньше брюк. Ни одно правило не говорит «надень меня третьим». Каждое говорит только «надень меня после вот этого». Нужно найти полный порядок, который не нарушает ни одного правила.

Программы решают такую задачу постоянно. Менеджер пакетов ставит библиотеки, и каждую надо ставить после всех библиотек, которые ей нужны. Система сборки компилирует файлы, и файл, который импортирует другой, собирается после него. У курсов в учебном каталоге есть пререквизиты (курсы, которые надо пройти раньше). Везде один и тот же запрос: дан набор правил «X должно идти раньше Y», выдай один порядок, в котором выполнены все правила.

Иногда такого порядка нет. Если A нужен B, а B нужен A, ни один порядок не подойдёт. Хорошая программа должна это заметить и сообщить, а не крутиться вечно.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Порядок задач по алгоритму Кана
topoSort(6, [[1, 2], [3], [3, 5], [4, 5], [], []])
число над задачей = сколько задач она ещё ждёт
queue (готовы к запуску)
пусто
order
пусто

Стрелка u → v значит, что u должна выполниться раньше v. Считаем входящие стрелки у каждой задачи.

Как узнать

Топологическая сортировка (алгоритм Кана) (Topological sort (Kahn's algorithm))

Эти слова в условии значат этот паттерн

  • задача должна идти перед другой
  • порядок, соблюдающий зависимости
  • обнаружить цикл в предпосылках
  • порядок сборки / расписание курсов / порядок установки
  • ориентированный граф, X должен произойти перед Y

Похоже, но не то

V вершин и E рёбер дают O(V + E). Каждое ребро убирается ровно один раз.

На LeetCode

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

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности