Problema
Eu tenho um gráfico não direcionado (com várias arestas), que mudará com o tempo, nós e arestas podem ser inseridos e excluídos. Em cada modificação do gráfico, eu tenho que atualizar os componentes conectados deste gráfico.
Propriedades
As propriedades adicionais são que nunca dois componentes serão reconectados. Obviamente, o gráfico pode ter ciclos para uma quantia arbitrária (caso contrário, a solução seria trivial). Se uma aresta não contiver um nó n , nunca adotará esse nó. No entanto, se n ∈ e , ele pode mudar para n ∉ e .
Abordagens
Até agora, tenho duas abordagens possíveis, mas como você verá, elas são horríveis:
Lento sem estado
Posso pesquisar (dfs / bfs) o gráfico a partir do (s) elemento (s) modificado (s) toda vez. Isso economiza espaço, mas é lento, pois temos O (n + m) para cada modificação.
Abordagem rápida com estado (-er) (?)
Posso armazenar todos os caminhos possíveis para cada nó em todos os nós possíveis, mas se eu o vir corretamente, isso consumirá memória O (n ^ 4). Mas não tenho certeza de como é a melhoria do tempo de execução (se houver uma, porque preciso manter as informações atualizadas para cada nó no mesmo componente).
Questão
Você tem alguma dica, como posso aprender mais sobre esse problema ou talvez sobre alguns algoritmos em que posso desenvolver?
Nota
Se houver uma grande melhoria no tempo de execução / memória, eu poderia viver com uma solução não ideal que às vezes diz que dois componentes são um, mas é claro que eu preferiria uma solução ideal.
Respostas:
Existem várias estruturas de dados que suportam inserções de bordas, exclusões de bordas e consultas de conectividade (esses dois vértices estão no mesmo componente conectado?) Em tempo polilogarítmico.
Monika R. Henzinger e Valerie King. Algoritmos aleatórios de gráficos totalmente dinâmicos com tempo polilogarítmico por operação . Journal of the ACM 46 (4): 502-516, 1999.
Jacob Holm, Kristian de Lichtenberg e Mikkel Thorup. Algoritmos totalmente dinâmicos determinísticos polia logarítmicos para conectividade, spanning tree mínimo, 2 arestas e biconectividade , Journal of the ACM 48 (4): 723-760, 2001.
Mikkel Thorup. Conectividade gráfica dinâmica quase ideal . Proc. 32a STOC 343-350, 2000.
fonte
Eu acho que você está procurando o que é chamado de algoritmo de gráfico dinâmico para decomposição de componentes conectados. O algoritmo de Holm, de Lichtenberg e Thorup [HLT01] amortizou o tempo polilogarítmico em cada atualização de borda. Faz muito tempo que não olhei o problema da última vez, então provavelmente há um progresso mais recente.
[HLT01] Jacob Holm, Kristian de Lichtenberg e Mikkel Thorup. Algoritmos totalmente dinâmicos determinísticos polia logarítmicos para conectividade, spanning tree mínimo, 2 arestas e biconectividade. Journal of the ACM , 48 (4): 723–760, julho de 2001. http://doi.acm.org/10.1145/502090.502095
fonte
(Por enquanto, deixe-me ficar com as consultas de conectividade, que infelizmente podem não ser suficientes para o seu aplicativo.)
Muitos dos trabalhos anteriores sobre o problema de conectividade dinâmica estão no modelo de atualização de borda: você assume que o número de vértices é fixo e pode inserir e / ou excluir bordas enquanto faz consultas. Se você só pode inserir (excluir), é incremental (decremental). Se você pode fazer as duas coisas, é totalmente dinâmico. O trabalho de Thorup, como apontado por JeffE (e eu no comentário), é para atualizações de ponta.
AFAIK, a comunidade da teoria do CS está apenas começando a procurar atualizações de vértices para gráficos gerais. Houve um trabalho inovador sobre Chan, Pătraşcu e Roditty no FOCS 2008. Consulte este link para uma revisão muito recente (setembro de 2010) e as referências.
fonte