Алгоритмы с нуля
Графы: тест с множественным выбором
Шесть вопросов, пронизывающих весь юнит. Каждый выбирает алгоритм или представление, которого реально требует задача, — это не определение для пересказа, а решение по моделированию, которое нужно обосновать.
Убедитесь, что вы связываете выбор представления, порядок обхода, упорядочивание, кратчайшие пути со весами и динамическую связность — синтез, к которому вели восемь уроков.
В социальном графе 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 было бы расточительно. Подбирайте алгоритм под форму задачи до того, как написать строку кода.