В теории графов, достижимость относится к способности переходить от одной вершины к другой в пределах графа. Вершина может достигать вершины (и доступен из ), если существует последовательность смежных вершин (т. Е. путь ), которая начинается с и заканчивается на .
. В неориентированном графе достижимость между всеми парами вершин может быть определена путем идентификации компоненты связности графа. Любая пара вершин в таком графе может достигать друг друга тогда и только тогда, когда они принадлежат одной компоненте связности; следовательно, в таком графе достижимость симметрична (достигает iff достигает ). Связные компоненты неориентированного графа можно идентифицировать за линейное время. Остальная часть статьи посвящена более сложной проблеме определения попарной достижимости в ориентированном графе (который, кстати, не обязательно должен быть симметричным).
Для ориентированного графа с набором вершин и набор краев , отношение достижимости из - это транзитивное замыкание элемента , то есть набор всех упорядоченных пар вершин в , для которых существует последовательность вершин такой, что край находится в для всех .
Если является ациклическим, то его отношение достижимости является частичный заказ ; любой частичный порядок может быть определен таким образом, например, как отношение достижимости его транзитивной редукции. Примечательным следствием этого является то, что, поскольку частичные порядки антисимметричны, если может достигать , тогда мы знаем, что не может достичь . Интуитивно, если бы мы могли путешествовать от до и обратно к , тогда будет содержать цикл, что противоречит его ацикличности. Если является направленным, но не ациклическим (т.е. содержит хотя бы один цикл), то его отношение достижимости будет соответствовать предварительному заказу вместо частичного порядок.
Алгоритмы для определения достижимости делятся на два класса: те, которые требуют предварительной обработки, и те, которые этого не делают.
Если вам нужно сделать только один (или несколько) запросов, может быть более эффективным отказаться от использования более сложных структур данных и напрямую вычислить достижимость желаемой пары. Это может быть выполнено за линейное время с использованием таких алгоритмов, как поиск в ширину или итеративный поиск с углублением в глубину.
Если вы будете делать много запросов, тогда более может использоваться сложный метод; точный выбор метода зависит от характера анализируемого графа. В обмен на время предварительной обработки и дополнительное пространство для хранения мы можем создать структуру данных, которая затем может отвечать на запросы о доступности для любой пары вершин всего за время. Ниже описаны три различных алгоритма и структуры данных для трех различных, все более специализированных ситуаций.
Алгоритм Флойда-Уоршалла может использоваться для вычисления транзитивного замыкания любого ориентированного графа, что приводит к соотношению достижимости, как в определение выше.
Алгоритм требует времени и пробел в худшем случае. Этот алгоритм заинтересован не только в достижимости, но и в вычислении кратчайшего пути между всеми парами вершин. Для графов, содержащих отрицательные циклы, кратчайшие пути могут быть не определены, но достижимость между парами все же может быть отмечена.
Для планарных орграфов доступен гораздо более быстрый метод, как описано Миккель Торуп в 2004 г.. Этот метод может отвечать на запросы о достижимости на плоском графе за времени после время предварительной обработки для создания структуры данных размер. Этот алгоритм также может предоставить приблизительное расстояние кратчайшего пути, а также информацию о маршруте.
Общий подход заключается в том, чтобы связать с каждой вершиной относительно небольшой набор так называемых путей разделителя, так что любой путь от вершины к любой другой вершина должна проходить по крайней мере через один из разделителей, связанных с или . Схема разделов, связанных с достижимостью, приводится ниже.
Для данного графа алгоритм начинается с организации вершин в слои, начиная с произвольной вершины . Слои строятся чередующимися шагами, сначала рассматриваются все вершины, достижимые с предыдущего шага (начиная только с ), а затем все вершины, доходящие до предыдущего. шаг, пока все вершины не будут назначены слою. При построении слоев каждая вершина появляется не более чем на двух уровнях, и каждый направленный путь или угол наклона в содержится в двух смежных слоях. и . Пусть будет последним созданным слоем, то есть наименьшим значением для такое, что .
Затем график повторно выражается в виде серии орграфов , где каждый и где - сокращение всех предыдущих уровней в единственная вершина. Поскольку каждый погружной путь появляется не более чем в двух последовательных слоях, и поскольку каждый образован двумя последовательными слоями, каждый погруженный путь в целиком появляется по крайней мере в одном (и не более чем в двух последовательных таких графиках)
Для каждого определены три разделителя, при удалении которых диаграмма разбивается на три компонента, каждая из которых содержит не более вершины оригинала. Поскольку состоит из двух слоев противоположных каналов, каждый разделитель может состоять из до 2 каналов, всего до 6 каналов на всех разделители. Пусть будет этим набором кривых. Доказательство того, что такие разделители всегда можно найти, связано с теоремой о плоских разделителях Липтона и Тарьяна, и эти разделители могут быть расположены за линейное время.
Для каждого направленный характер предусматривает естественная индексация его вершин от начала до конца пути. Для каждой вершины в мы находим первую вершину в , достижимый , и последняя вершина в , которая достигает на . То есть мы смотрим, как рано до мы можем перейти от и как далеко мы можем оставайтесь в и все равно возвращайтесь в . Эта информация сохраняется с каждым . Тогда для любой пары вершин и , может достигать через , если подключается к раньше, чем соединяется с .
Каждая вершина помечена, как указано выше для каждый шаг рекурсии, которая строит . Поскольку эта рекурсия имеет логарифмическую глубину, в общей сложности дополнительная информация сохраняется для каждой вершины. С этого момента запрос логарифмического времени для достижимости так же прост, как поиск по каждой паре меток общего, подходящего . Затем в оригинальной статье время запроса сокращается до .
Подводя итоги анализа этого метода, сначала учтите, что многоуровневый подход разбивает вершины так, чтобы каждая вершина считается только раз. Фаза разделения алгоритма разбивает граф на компоненты, которые не больше размера исходного графа, в результате чего получается логарифмическая глубина рекурсии. На каждом уровне рекурсии требуется только линейная работа для определения разделителей, а также возможных связей между вершинами. Общий результат: время предварительной обработки только с дополнительная информация, хранящаяся для каждой вершины.
Еще более быстрый метод предварительной обработки, предложенный Т. Камедой в 1975 году, можно использовать, если график плоский, ациклический, а также обладает следующими дополнительными свойствами: все 0- степени и все 0- исходящие вершины появляются на одном и том же face (часто предполагается, что это внешняя грань), и можно разделить границу этой грани на две части так, чтобы все вершины с нулевой степенью появлялись на одной части, а все вершины с нулевой степенью выходили на другой (т.е. два типа вершин не чередуются).
Если демонстрирует эти свойства, то мы можем предварительно обработать график только за время и хранить только дополнительных битов на вершину, отвечая на запросы о достижимости для любой пары вершин за раз с простым сравнением.
Предварительная обработка выполняет следующие шаги. Мы добавляем новую вершину , у которой есть ребро для каждой вершины с нулевым углом, и еще одну новую вершину с ребрами из каждой вершины с нулевой степенью выхода. Обратите внимание, что свойства позволяют нам делать это при сохранении планарности, то есть после этих добавлений пересечений краев не будет. Для каждой вершины мы храним список смежностей (внешних ребер) в порядке планарности графа (например, по часовой стрелке относительно вложения графа). Затем мы инициализируем счетчик и начинаем обход в глубину с . Во время этого обхода список смежности каждой вершины просматривается слева направо по мере необходимости. Когда вершины выталкиваются из стека обхода, они помечаются значением , а затем уменьшается.. Обратите внимание, что всегда помечается значением и всегда имеет метку . Затем повторяется обход в глубину, но на этот раз список смежности каждой вершины просматривается справа налево.
По завершении удаляются и и их инцидентные края. Каждая оставшаяся вершина хранит двухмерную метку со значениями от до . Даны две вершины и и их метки и , мы говорим, что
Затем в основном результате этого метода говорится, что
Связанная проблема заключается в решении запросов о достижимости с некоторым количеством
Другая проблема, связанная с запросами о достижимости, заключается в быстром пересчете изменений в отношениях достижимости, когда некоторая часть графа изменилось. Например, это актуальная проблема для сборки мусора, которая должна уравновесить восстановление памяти (чтобы ее можно было перераспределить) с проблемами производительности работающего приложения.