Достижимость

редактировать
, можно ли достичь одной вершины из другой в графе

В теории графов, достижимость относится к способности переходить от одной вершины к другой в пределах графа. Вершина s {\ displaystyle s}s может достигать вершины t {\ displaystyle t}tt {\ displaystyle t}tдоступен из s {\ displaystyle s}s ), если существует последовательность смежных вершин (т. Е. путь ), которая начинается с s {\ displaystyle s}s и заканчивается на t {\ displaystyle t}t.

. В неориентированном графе достижимость между всеми парами вершин может быть определена путем идентификации компоненты связности графа. Любая пара вершин в таком графе может достигать друг друга тогда и только тогда, когда они принадлежат одной компоненте связности; следовательно, в таком графе достижимость симметрична (s {\ displaystyle s}s достигает t {\ displaystyle t}tiff t {\ displaystyle t}tдостигает s {\ displaystyle s}s ). Связные компоненты неориентированного графа можно идентифицировать за линейное время. Остальная часть статьи посвящена более сложной проблеме определения попарной достижимости в ориентированном графе (который, кстати, не обязательно должен быть симметричным).

Содержание
  • 1 Определение
  • 2 Алгоритмы
    • 2.1 Алгоритм Флойда-Уоршалла
    • 2.2 Алгоритм Торупа
    • 2.3 Алгоритм Камеды
  • 3 Связанные проблемы
  • 4 См. Также
  • 5 Ссылки
Определение

Для ориентированного графа G = (V, E) {\ displaystyle G = (V, E)}G = (V, E) с набором вершин V {\ displaystyle V}V и набор краев E {\ displaystyle E}E , отношение достижимости из G {\ displaystyle G}G - это транзитивное замыкание элемента E {\ displaystyle E}E , то есть набор всех упорядоченных пар (s, t) {\ displaystyle (s, t)}(s, t) вершин в V {\ displaystyle V}V , для которых существует последовательность вершин v 0 = s, v 1, v 2,..., vk = t {\ displaystyle v_ {0} = s, v_ {1}, v_ {2},..., v_ {k} = t}v_ {0} = s, v_ {1}, v_ {2},..., v_ {k} = t такой, что край (vi - 1, vi) {\ displaystyle (v_ {i-1}, v_ {i})}(v _ {{i-1}}, v_ {i}) находится в E {\ displaystyle E}E для всех 1 ≤ я ≤ К {\ displaystyle 1 \ leq i \ leq k}1 \ leq i \ leq k .

Если G {\ displaystyle G}G является ациклическим, то его отношение достижимости является частичный заказ ; любой частичный порядок может быть определен таким образом, например, как отношение достижимости его транзитивной редукции. Примечательным следствием этого является то, что, поскольку частичные порядки антисимметричны, если s {\ displaystyle s}s может достигать t {\ displaystyle t}t, тогда мы знаем, что t {\ displaystyle t}tне может достичь s {\ displaystyle s}s . Интуитивно, если бы мы могли путешествовать от s {\ displaystyle s}s до t {\ displaystyle t}tи обратно к s {\ displaystyle s}s , тогда G {\ displaystyle G}G будет содержать цикл, что противоречит его ацикличности. Если G {\ displaystyle G}G является направленным, но не ациклическим (т.е. содержит хотя бы один цикл), то его отношение достижимости будет соответствовать предварительному заказу вместо частичного порядок.

Алгоритмы

Алгоритмы для определения достижимости делятся на два класса: те, которые требуют предварительной обработки, и те, которые этого не делают.

Если вам нужно сделать только один (или несколько) запросов, может быть более эффективным отказаться от использования более сложных структур данных и напрямую вычислить достижимость желаемой пары. Это может быть выполнено за линейное время с использованием таких алгоритмов, как поиск в ширину или итеративный поиск с углублением в глубину.

Если вы будете делать много запросов, тогда более может использоваться сложный метод; точный выбор метода зависит от характера анализируемого графа. В обмен на время предварительной обработки и дополнительное пространство для хранения мы можем создать структуру данных, которая затем может отвечать на запросы о доступности для любой пары вершин всего за O (1) {\ displaystyle O (1)}O (1) время. Ниже описаны три различных алгоритма и структуры данных для трех различных, все более специализированных ситуаций.

Алгоритм Флойда-Уоршалла

Алгоритм Флойда-Уоршалла может использоваться для вычисления транзитивного замыкания любого ориентированного графа, что приводит к соотношению достижимости, как в определение выше.

Алгоритм требует O (| V | 3) {\ displaystyle O (| V | ^ {3})}O (| V | ^ {3}) времени и O (| V | 2) {\ displaystyle O (| V | ^ {2})}O (| V | ^ {2}) пробел в худшем случае. Этот алгоритм заинтересован не только в достижимости, но и в вычислении кратчайшего пути между всеми парами вершин. Для графов, содержащих отрицательные циклы, кратчайшие пути могут быть не определены, но достижимость между парами все же может быть отмечена.

Алгоритм Торупа

Для планарных орграфов доступен гораздо более быстрый метод, как описано Миккель Торуп в 2004 г.. Этот метод может отвечать на запросы о достижимости на плоском графе за O (1) {\ displaystyle O (1)}O (1) времени после O (n log ⁡ n) {\ displaystyle O (n \ log {n})}O (n \ log {n}) время предварительной обработки для создания структуры данных O (n log ⁡ n) {\ displaystyle O (n \ log {n})}O (n \ log {n}) размер. Этот алгоритм также может предоставить приблизительное расстояние кратчайшего пути, а также информацию о маршруте.

Общий подход заключается в том, чтобы связать с каждой вершиной относительно небольшой набор так называемых путей разделителя, так что любой путь от вершины v {\ displaystyle v}v к любой другой вершина w {\ displaystyle w}w должна проходить по крайней мере через один из разделителей, связанных с v {\ displaystyle v}v или w {\ displaystyle w}w . Схема разделов, связанных с достижимостью, приводится ниже.

Для данного графа G {\ displaystyle G}G алгоритм начинается с организации вершин в слои, начиная с произвольной вершины v 0 {\ displaystyle v_ {0 }}v_ {0} . Слои строятся чередующимися шагами, сначала рассматриваются все вершины, достижимые с предыдущего шага (начиная только с v 0 {\ displaystyle v_ {0}}v_ {0} ), а затем все вершины, доходящие до предыдущего. шаг, пока все вершины не будут назначены слою. При построении слоев каждая вершина появляется не более чем на двух уровнях, и каждый направленный путь или угол наклона в G {\ displaystyle G}G содержится в двух смежных слоях. L i {\ displaystyle L_ {i}}L_i и L i + 1 {\ displaystyle L_ {i + 1}}L _ {{i + 1}} . Пусть k {\ displaystyle k}к будет последним созданным слоем, то есть наименьшим значением для k {\ displaystyle k}к такое, что ⋃ i = 0 К L я = V {\ displaystyle \ bigcup _ {i = 0} ^ {k} L_ {i} = V}{\ displaystyle \ bigcup _ {i = 0} ^ {k} L_ {i} = V} .

Затем график повторно выражается в виде серии орграфов G 0, G 1,…, G k - 1 {\ displaystyle G_ {0}, G_ {1}, \ ldots, G_ {k-1}}G_ {0}, G_ {1}, \ ldots, G _ {{k-1}} , где каждый G i = ri ∪ L я ∪ L я + 1 {\ displaystyle G_ {i} = r_ {i} \ cup L_ {i} \ cup L_ {i + 1}}G_ {i} = r_ {i} \ чашка L_ {i} \ cup L _ {{i + 1}} и где ri {\ displaystyle r_ { i}}r_ {i} - сокращение всех предыдущих уровней L 0… L i - 1 {\ displaystyle L_ {0} \ ldots L_ {i-1}}L_ {0} \ ldots L _ {{i-1}} в единственная вершина. Поскольку каждый погружной путь появляется не более чем в двух последовательных слоях, и поскольку каждый G i {\ displaystyle G_ {i}}G_i образован двумя последовательными слоями, каждый погруженный путь в G {\ displaystyle G}G целиком появляется по крайней мере в одном G i {\ displaystyle G_ {i}}G_i (и не более чем в двух последовательных таких графиках)

Для каждого G i {\ displaystyle G_ {i}}G_i определены три разделителя, при удалении которых диаграмма разбивается на три компонента, каждая из которых содержит не более 1/2 { \ displaystyle 1/2}1/2 вершины оригинала. Поскольку G i {\ displaystyle G_ {i}}G_i состоит из двух слоев противоположных каналов, каждый разделитель может состоять из до 2 каналов, всего до 6 каналов на всех разделители. Пусть S {\ displaystyle S}S будет этим набором кривых. Доказательство того, что такие разделители всегда можно найти, связано с теоремой о плоских разделителях Липтона и Тарьяна, и эти разделители могут быть расположены за линейное время.

Для каждого Q ∈ S {\ displaystyle Q \ in S}Q \ in S направленный характер Q {\ displaystyle Q}Q предусматривает естественная индексация его вершин от начала до конца пути. Для каждой вершины v {\ displaystyle v}v в G i {\ displaystyle G_ {i}}G_i мы находим первую вершину в Q { \ displaystyle Q}Q , достижимый v {\ displaystyle v}v , и последняя вершина в Q {\ displaystyle Q}Q , которая достигает на v {\ displaystyle v}v . То есть мы смотрим, как рано до Q {\ displaystyle Q}Q мы можем перейти от v {\ displaystyle v}v и как далеко мы можем оставайтесь в Q {\ displaystyle Q}Q и все равно возвращайтесь в v {\ displaystyle v}v . Эта информация сохраняется с каждым v {\ displaystyle v}v . Тогда для любой пары вершин u {\ displaystyle u}u и w {\ displaystyle w}w , u {\ displaystyle u}u может достигать w {\ displaystyle w}w через Q {\ displaystyle Q}Q , если u {\ displaystyle u}u подключается к Q {\ displaystyle Q}Q раньше, чем w {\ displaystyle w}w соединяется с Q {\ displaystyle Q}Q .

Каждая вершина помечена, как указано выше для каждый шаг рекурсии, которая строит G 0…, G k {\ displaystyle G_ {0} \ ldots, G_ {k}}G_ {0} \ ldots, G_ {k} . Поскольку эта рекурсия имеет логарифмическую глубину, в общей сложности O (log ⁡ n) {\ displaystyle O (\ log {n})}O (\ log {n}) дополнительная информация сохраняется для каждой вершины. С этого момента запрос логарифмического времени для достижимости так же прост, как поиск по каждой паре меток общего, подходящего Q {\ displaystyle Q}Q . Затем в оригинальной статье время запроса сокращается до O (1) {\ displaystyle O (1)}O (1) .

Подводя итоги анализа этого метода, сначала учтите, что многоуровневый подход разбивает вершины так, чтобы каждая вершина считается только O (1) {\ displaystyle O (1)}O (1) раз. Фаза разделения алгоритма разбивает граф на компоненты, которые не больше 1/2 {\ displaystyle 1/2}1/2 размера исходного графа, в результате чего получается логарифмическая глубина рекурсии. На каждом уровне рекурсии требуется только линейная работа для определения разделителей, а также возможных связей между вершинами. Общий результат: O (n log ⁡ n) {\ displaystyle O (n \ log n)}O (n \ log n) время предварительной обработки только с O (log ⁡ n) {\ displaystyle O (\ log {n})}O (\ log {n}) дополнительная информация, хранящаяся для каждой вершины.

Алгоритм Камеды

Подходящий орграф для метода Камеды с добавлением s {\ displaystyle s}s и t {\ displaystyle t}t Тот же график, что и выше, после запуска алгоритма Камеды, показывающий метки DFS для каждой вершины

Еще более быстрый метод предварительной обработки, предложенный Т. Камедой в 1975 году, можно использовать, если график плоский, ациклический, а также обладает следующими дополнительными свойствами: все 0- степени и все 0- исходящие вершины появляются на одном и том же face (часто предполагается, что это внешняя грань), и можно разделить границу этой грани на две части так, чтобы все вершины с нулевой степенью появлялись на одной части, а все вершины с нулевой степенью выходили на другой (т.е. два типа вершин не чередуются).

Если G {\ displaystyle G}G демонстрирует эти свойства, то мы можем предварительно обработать график только за O (n) {\ displaystyle O (n)}O (n) время и хранить только O (log ⁡ n) {\ displaystyle O (\ log {n})}O (\ log {n}) дополнительных битов на вершину, отвечая на запросы о достижимости для любой пары вершин за O (1) {\ displaystyle O (1)}O (1) раз с простым сравнением.

Предварительная обработка выполняет следующие шаги. Мы добавляем новую вершину s {\ displaystyle s}s , у которой есть ребро для каждой вершины с нулевым углом, и еще одну новую вершину t {\ displaystyle t}tс ребрами из каждой вершины с нулевой степенью выхода. Обратите внимание, что свойства G {\ displaystyle G}G позволяют нам делать это при сохранении планарности, то есть после этих добавлений пересечений краев не будет. Для каждой вершины мы храним список смежностей (внешних ребер) в порядке планарности графа (например, по часовой стрелке относительно вложения графа). Затем мы инициализируем счетчик i = n + 1 {\ displaystyle i = n + 1}i = n + 1 и начинаем обход в глубину с s {\ displaystyle s}s . Во время этого обхода список смежности каждой вершины просматривается слева направо по мере необходимости. Когда вершины выталкиваются из стека обхода, они помечаются значением i {\ displaystyle i}i , а затем i {\ displaystyle i}i уменьшается.. Обратите внимание, что t {\ displaystyle t}tвсегда помечается значением n + 1 {\ displaystyle n + 1}n + 1 и s {\ displaystyle s}s всегда имеет метку 0 {\ displaystyle 0}{\ displaystyle 0} . Затем повторяется обход в глубину, но на этот раз список смежности каждой вершины просматривается справа налево.

По завершении удаляются s {\ displaystyle s}s и t {\ displaystyle t}tи их инцидентные края. Каждая оставшаяся вершина хранит двухмерную метку со значениями от 1 {\ displaystyle 1}1 до n {\ displaystyle n}n . Даны две вершины u {\ displaystyle u}u и v {\ displaystyle v}v и их метки L (u) = (a 1, a 2) {\ displaystyle L (u) = (a_ {1}, a_ {2})}L (u) = (a_ {1}, a_ {2}) и L (v) = (b 1, b 2) {\ displaystyle L ( v) = (b_ {1}, b_ {2})}L (v) = (b_ {1}, b_ {2}) , мы говорим, что L (u) < L ( v) {\displaystyle L(u)L (u) <L (v) тогда и только тогда, когда a 1 ≤ b 1 {\ displaystyle a_ {1} \ leq b_ {1}}a_ {1} \ leq b_ {1} , a 2 ≤ b 2 {\ displaystyle a_ {2} \ leq b_ {2}}a_ {2} \ leq b_ {2} , и существует хотя бы один компонент a 1 {\ displaystyle a_ {1}}a_ {1} или a 2 {\ displaystyle a_ {2}}a_ {2} , который строго меньше b 1 {\ displaystyle b_ {1}}b_ {1} или b 2 {\ displaystyle b_ {2}}b_ {2} соответственно.

Затем в основном результате этого метода говорится, что v {\ displaystyle v}v доступен из u {\ displaystyle u}u , если и только если L (u) < L ( v) {\displaystyle L(u)L (u) <L (v) , который легко вычисляется за O (1) {\ displaystyle O (1)}O (1) времени.

Связанные проблемы

Связанная проблема заключается в решении запросов о достижимости с некоторым количеством k {\ displaystyle k}к отказов вершин. Например: «Может ли вершина u {\ displaystyle u}u по-прежнему достигать вершины v {\ displaystyle v}v , даже если вершины s 1, s 2,..., sk {\ displaystyle s_ {1}, s_ {2},..., s_ {k}}s_ {1}, s_ {2},..., s_ {k} потерпели неудачу и больше не могут использоваться? " Подобная проблема может относиться к сбоям ребер, а не к сбоям вершин, или их сочетанию. Методика поиска в ширину также хорошо работает с такими запросами, но создание эффективного оракула является более сложной задачей.

Другая проблема, связанная с запросами о достижимости, заключается в быстром пересчете изменений в отношениях достижимости, когда некоторая часть графа изменилось. Например, это актуальная проблема для сборки мусора, которая должна уравновесить восстановление памяти (чтобы ее можно было перераспределить) с проблемами производительности работающего приложения.

См. Также
Ссылки
Последняя правка сделана 2021-06-03 09:46:02
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте