awesome-everything EN
↑ Обратно к восхождению

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

Графы: тест с множественным выбором

Суть Синтез по всему юниту графов в виде теста: компромиссы представлений, BFS против DFS, topological sort, инвариант фиксации Dijkstra и union-find.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 13 min

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

Цель

Убедитесь, что вы связываете выбор представления, порядок обхода, упорядочивание, кратчайшие пути со весами и динамическую связность — синтез, к которому вели восемь уроков.

Викторина

В социальном графе 50 миллионов пользователей и ~200 связей у каждого (то есть E порядка 5 миллиардов направленных записей, намного меньше V в квадрате). Горячая операция — «перебрать друзей пользователя». Какое представление и почему?

Викторина

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

Викторина

Система сборки запускает алгоритм Кана (Kahn) на своём DAG зависимостей, и выходной порядок содержит только 18 из 20 целей сборки. О чём это говорит?

Викторина

В графе цен некоторые рёбра представляют возвраты (отрицательная стоимость). Инженер запускает Dijkstra и иногда получает завышенные ответы. Почему и как это исправить?

Викторина

Рёбра приходят по одному в потоке, и после каждого нужно мгновенно отвечать «уже ли u и v в одной компоненте?». Какая структура подходит и почему повторный запуск BFS — неверный выбор?

Викторина

Коллега утверждает, что его union-find работает за O(1) на операцию, потому что он добавил path compression. Какова точная сложность и что упущено или преувеличено?

Итог

Сквозная линия юнита — одно дерево решений по моделированию: выбирайте представление по плотности (list для разрежённых, matrix для плотных или O(1) поиска ребра); выбирайте обход по нужде (BFS для путей с наименьшим числом рёбер и уровней, DFS для глубины и структуры циклов); добавьте веса — и BFS уступает Dijkstra, но только при неотрицательных рёбрах, иначе Bellman-Ford. topological sort упорядочивает DAG и попутно ловит циклы, а union-find отвечает на динамическую связность за амортизированное O(alpha(n)) там, где повторять BFS было бы расточительно. Подбирайте алгоритм под форму задачи до того, как написать строку кода.

Продолжить восхождение ↑Графы: тест на свободное припоминание
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.