Atingibilidade (teoria dos grafos)

Em teoria dos grafos, a atingibilidade se refere a capacidade de ir de um vértice para outro em um grafo. Dizemos que um vértice  pode alcançar outro vértice  (ou que  é atingível a partir de ) se exite uma sequência de vértices adjacentes (ex.: um caminho) que começam com  e terminam com .

Em um grafo não-direcionado, é suficiente identificar apenas os componentes conexos, assim como qualquer par de vértices, em tal grafo, pode se alcançar se e somente se eles pertencem ao mesmo componente conexo. Os componentes conexos de um grafo podem ser identificados em tempo linear. Lembramos que este artigo foca em atingibilidade nas configurações de grafos orientados.

Definição editar

Para um grafo direcionado  , onde   é o conjunto de vértices e   o conjunto de arestas, a relação de atingibilidade de   é o fecho transitivo de  , ou seja, o conjunto dos pares ordenados   com vértices em   para os quais existe uma sequência de vértices   da mesma forma que a aresta   está em   para todo  .[1]

Se   é acíclico, então sua relação de atingibilidade é um conjunto parcialmente ordenado; qualquer conjunto parcialmente ordenado deve ser definido dessa forma, por exemplo, a relação de atingibilidade da sua redução transitiva.[2] Uma consequência notável disso é que uma vez que conjuntos parcialmente ordenados são antessimétricos, se   pode alcançar  , então sabemos que   não pode alcançar  . Intuitivamente, se podemos ir de   para   voltar para  , então   teria um ciclo, contradizendo que ele é acíclico. Se   é direcionado mas não acíclico (ex.: contem pelo menos um ciclo), então sua relação de atingibilidade irá corresponder a um pré-ordem ao em vez de um ordem parcial. [3]

Algoritmos editar

Algoritmos para determinar atingibilidade se dividem em duas classes: aquelas que requerem pré-processamento e aquelas que não requerem.

Se existem apenas uma (ou poucas) consultas a serem feitas, seria mais eficiente abdicar do uso de estruturas mais complexas de dados e computar a atingibilidade do par desejado diretamente. Isto pode ser realizado em tempo linear usando algoritmos tal como busca em largura ou o IDDS um algoritmo de busca em estado espaço.[4]

Se várias consultas serão feitas, então um método mais sofisticado pode ser usado; a escolha exata do método depende da natureza do grafo que está sendo analisado. em troca de um tempo de pré-processamento e algum espaço de armazenamento extra, é possível criar uma estrutura de dados que podem então responder as consultas de atingibilidade em qualquer par de vértices em tempo tão curto quanto  . Três diferentes algoritmos e estruturas de dados para três diferentes para três diferentes situações cada vez mais especializadas são mostradas abaixo.

Algoritmo de Floyd-Warshall editar

O Algoritmo de Floyd-Warshall[5] pode ser usado para computar o feche transitivo de qualquer grafo direcionado, que da origem a relação de atingibilidade como mostra a definição abaixo.

O algoritmo requer tempo   e espaço   no pior caso. Este algoritmo não é unicamente interessado em atingibilidade como também computa o caminho mais curto entre todos pares de vértices. Para grafos contendo ciclos negativos, caminhos mais curtos talvez não possam ser definidos, mas a atingibilidade entre pares ainda pode ser notada.

Algoritmo de Thorup editar

Para um grafo planar, um método muito mais rápido está disponível, como descrito por Mikkel Thorup em 2004.[6] Este método pode responder a consultas de atingibilidade no grafo planar em tempo   depois de gastar um tempo de processamento de   para criar uma estrutura de dados de tamanho  . Este algoritmo pode também fornecer aproximações de distâncias de caminhos mais curtos assim como informações de percurso.

A abordagem global é associar a cada vértice um conjunto relativamente pequeno dos chamados "caminhos separadores" de tal forma que qualquer caminho saindo de um vértice   para qualquer outro vértice   deve ir para, no mínimo, um dos separadores associados a   ou  . Um esbouço das seções relacionadas a atingibilidade é mostrado a seguir.

Dado um grafo  , o algoritmo começa organizando os vértices em camadas começando de um vértice arbitrário  . As camadas são construídas em passo alternados considerando primeiro todos os vértices atingíveis partindo do paço anterior (começando apenas com  ) e depois todos os vértices que chegam ao paço anterior até que todos os vértices tenho sido associados a uma camada. Pela construção das camadas, todo vértice aparece no máximo em duas camadas, e cada caminho direcionado, ou dipath, em   está contido em duas camadas adjacentes   e  . Faça   ser a ultima camada criada, ou seja, o menor valor para   tal que  .

O grafo é expressado novamente como um série de digraphs   onde cada   e onde   é a contração de todos os níveis   em um único vértice. Porque toda dipath aparece no máximo em duas camadas consecutivas, e porque cada   é formado por duas camadas consecutivas, toda dipath em   aparece em sua totalidade em pelo menos um   (e não mais que 2 destes grafos consecutivos).

Para cada  , três separadores são identificados tal que, quando removidos, separam o grafos em três componentes onde cada componente contém no máximo   vértices do original. Como   é construído a partir de duas camadas de dipaths opostas, cada separador pode consistir de 2 dipaths, para um total maior que 6 dipaths todos os separadores. Faça   ser esse conjunto de dipaths. A prova de que tal separador pode sempre ser achado está relacionada com o Teorema do Separador Planar de Lipon e Tarjan, e esses separadores podem ser localizados em tempo linear.

Para cada  , a natureza dirigida de   permite uma indexação natural dos seu vértices do início ao fim do caminho. Para cada vértice   em  , nós localizamos o primeiro vértice em   atingível por  , e o ultimo vértice em   que alcança  . Isto é, estamos olhando o quão cedo em   nós podemos chegar de  , e quão longe nós podemos estar em   e ainda voltar para  . Essa informação é guardada com cada  . Então para qualquer par de vértices   e  ,   pode alcançar   através de   se   se conecta a   mais cedo do que   é conectado de  .

Todos vértice é denominado como mostrado acima para cada paço da recursão que constrói  . Como esta recursão tem profundidade logarítmica, um total de   de informação extra é armazenado por vértice. A partir daqui, um uma consulta de atingibilidade em tempo logarítmico é tão simples quanto procurar em cada par de vértices para um   comum e adequado. O artigo original, em seguida, trabalha para ajustar o tempo de consulta a  .

Em resumo, a analise desse método, primeiro considera que a abordagem de estratificação divide os vértices de uma forma que cada vértice é considerado apenas em tempo ↵. A fazer de separação do algoritmo divide o grafo em componentes ↵que são no máximo do tamanho do grafo original, resultando em uma ↵recursão de profundidade logarítmica. Em cada nível da recursão, é preciso apensa de um custo linear para ↵identificar os separadores assim como as possíveis conexões entre ↵vértices. O resultado global é um tempo de pré-processamento com apenas↵ com informações adicionais armazenadas para cada vértice.

 
Um digraph adequado para o métodos de Kameda com   e   adicionados.

Algoritmo de Kameda editar

 
O mesmo grafo mostrado acima depois de ser aplicado sobre ele o algoritmo de Kameda, mostrando o rótulo DFS para cada vértice.

Um método ainda mais rápido para pré-processamento, feito por T. Kameda em 1975,[7] pode ser usado se o gralo é planar, acíclico e também exibe as seguintes propriedades adicionais: todo vértice 0-indegree e todo vértice 0-outdegree aparece na mesma face (normalmente é assumida para ser a face exterior), e isso possibilita dividir os limites da face em duas partes tais que todos vértice 0-indegree aparece em uma parte, e todo vértice 0-outdegree aparece em outra (ex.: os dois tipos de vértices não alternam).

Se   apresenta essas propriedades, então podemos pré-processar o grafo em tempo   apenas, e armazenar apenas   bits extras por vértice, respondendo a consultas de atingibilidade para qualquer par de vértices em tempo   com uma simples comparação.

O pré-processamento realiza os seguintes paços. Um novo vértice   que tem uma aresta para cada vértice 0-indegree, e outro novo vértice   com aresta para cada vértice 0-outdegree. Note que as propriedades de   nos permite fazê-lo mantendo a planaridade, ou seja, ainda não haverá o cruzamento de arestas depois dessa adição. Para cada vértice é guardada a lista de adjacência a fim de manter a planaridade do grafo. Depois é inicializado um contador   e começa uma Depth-First Traversal a partir de  . Durante essa traversal, a lista de adjacência de cada vértice é visitada da esquerda para a direita de acordo com a necessidade. A medida que os vértices são retirados da pilha transversal, eles são rotulados com o valor  , e   é então decrementado. Note que   é sempre rotulado com o valor   e   é sempre rotulado com  . O depth-first traversal é então repetido, mas dessa vez a lista adjacente de cada vértice é visitada da direita para esquerda.

Quando completado,   e  , e as arestas conectadas a eles, não removidas. Cada vértice que sobra armazena um rotulo de 2 dimensões com valores de   a  . Dados dois vértices   e  , e seus rótulos   e  , dizemos que   se e somente se  ,  , e existe pelo menos um componente   ou   que é estritamente menor que   ou  , respectivamente.

Então o resultado principal desse método afirma que   é atingível a partir de   se e somente se  , que é facilmente calculado em tempo  .

Problemas Relacionados editar

Um problema relacionado é resolver consultas de atingibilidade com um número   de falhas de vértice. Por exemplo: "O vértice   ainda consegue alcançar o vértice   mesmo se o vértices   tenham falhado e não podem mais ser usados?" Um problema similar pode considerar falha de aresta em vez de falha de vértice, ou uma mistura dos dois. A técnica de busca em largura funciona assim como tais consultas, mas construir um oráculo eficiente é mais desafiador.[8]

Outro problema relacionado a consultas de atingibilidade está em recalcular rapidamente as mudanças para a relação de atingibilidade quando alguma porção do grafo é mudada. Por exemplo, este é um interesse relevante para Coletor de Lixo que precisa balancear a requisição de memória (de modo que ela possa ser realocada) com o interesse da performance da aplicação em execução.

Veja também editar

Referencias editar

  1. Skiena, Steven S. (2011), «15.5 Transitive Closure and Reduction», The Algorithm Design Manual, ISBN 9781848000698 2nd ed. , Springer, pp. 495–497 
  2. Cohn, Paul Moritz (2003), Basic Algebra: Groups, Rings, and Fields, ISBN 9781852335878, Springer, p. 17 .
  3. Schmidt, Gunther (2010), Relational Mathematics, ISBN 9780521762687, Encyclopedia of Mathematics and Its Applications, 132, Cambridge University Press, p. 77 .
  4. Gersting, Judith L. (2006), Mathematical Structures for Computer Science, ISBN 9780716768647 6th ed. , Macmillan, p. 519 
  5. Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001), «Transitive closure of a directed graph», Introduction to Algorithms, ISBN 0-262-03293-7 2nd ed. , MIT Press and McGraw-Hill, pp. 632–634 
  6. Thorup, Mikkel (2004), «Compact oracles for reachability and approximate distances in planar digraphs», Journal of the ACM, 51 (6): 993–1024, MR 2145261, doi:10.1145/1039488.1039493 .
  7. Kameda, T (1975), «On the vector representation of the reachability in planar directed graphs», Information Processing Letters, 3 (3): 75–77, doi:10.1016/0020-0190(75)90019-8 .
  8. Demetrescu, Camil; Thorup, Mikkel; Chowdhury, Rezaul Alam; Ramachandran, Vijaya (2008), «Oracles for distances avoiding a failed node or link», SIAM Journal on Computing, 37 (5): 1299–1318, MR 2386269, doi:10.1137/S0097539705429847 .