Existe-t-il un algorithme en ligne pour suivre les composants d'un graphique non orienté en évolution?

12

Problème

J'ai un graphique non orienté (avec plusieurs arêtes), qui changera au fil du temps, des nœuds et des arêtes peuvent être insérés et supprimés. A chaque modification du graphe, je dois mettre à jour les composants connectés de ce graphe.

Propriétés

Les propriétés supplémentaires sont qu'aucun composant ne sera jamais reconnecté. Évidemment, le graphique peut avoir des cycles à une quantité arbitraire (sinon la solution serait triviale). Si un bord ne contient pas de nœud n , il n'adoptera jamais ce nœud. Cependant, si n e , il peut changer en n e .ennene

Approches

Jusqu'à présent, j'ai deux approches possibles, mais comme vous le verrez, elles sont horribles:

Lent sans état

Je peux rechercher (dfs / bfs) le graphe à partir des éléments modifiés à chaque fois. Cela conserve de l'espace, mais est lent car nous avons O (n + m) pour chaque modification.

Approche rapide (-er) (?) Dynamique

Je peux stocker tous les chemins possibles pour chaque nœud vers tous les nœuds possibles, mais si je le vois correctement, cela prendra de la mémoire O (n ^ 4). Mais je ne sais pas comment est l'amélioration de l'exécution (s'il y en a une, car je dois garder les informations à jour pour chaque nœud du même composant).

Question

Avez-vous des conseils, comment puis-je en savoir plus sur ce problème ou peut-être quelques algorithmes sur lesquels je peux construire?

Remarque

S'il y a une grande amélioration de l'exécution / mémoire, je pourrais vivre avec une solution non optimale qui dit parfois que deux composants sont un, mais bien sûr, je préférerais une solution optimale.

bitmask
la source
Si je lis vos deux dernières phrases dans "Propriétés" à droite, alors il semble que vous ne vous intéressez qu'au problème décrémentiel. Si c'est le cas, assurez-vous de vérifier les travaux de Thorup sur la connectivité dynamique décrémentielle. (Vous pouvez trouver la citation via les pointeurs de JeffE, qui concernent la version entièrement dynamique du problème.)
Maverick Woo
@Maverick Woo: Il peut toujours y avoir de nouveaux bords / nœuds. Je pense que la dernière propriété n'est pas très solide, c'est exactement pour cette raison. Est-il toujours qualifié de décrémental?
bitmask
Oups, je ne sais pas comment j'ai raté la toute première phrase ... Voir la "réponse" ci-dessous.
Maverick Woo du

Réponses:

17

Il existe plusieurs structures de données qui prennent en charge les insertions de bord, les suppressions de bord et les requêtes de connectivité (ces deux sommets sont-ils dans le même composant connecté?) En temps polylogarithmique.

Jeffε
la source
Cela semble génial, une fois que j'aurai fini les papiers, je l'accepterai très probablement.
bitmask
6

Je pense que vous cherchez ce qu'on appelle l'algorithme de graphe dynamique pour la décomposition des composants connectés. L'algorithme de Holm, de Lichtenberg et Thorup [HLT01] a amorti le temps polylogarithmique à chaque mise à jour de bord. Cela fait longtemps que je n'ai pas examiné le problème la dernière fois, il y a donc probablement des progrès plus récents.

[HLT01] Jacob Holm, Kristian de Lichtenberg et Mikkel Thorup. Algorithmes déterministes poly-logarithmiques entièrement dynamiques pour la connectivité, l'arbre couvrant minimum, 2 arêtes et la biconnectivité. Journal de l'ACM , 48 (4): 723–760, juillet 2001. http://doi.acm.org/10.1145/502090.502095

Tsuyoshi Ito
la source
Jinx. Tu me dois un coca.
Jeffε
@JeffE: Je ne connaissais pas ce jeu . Mais selon les règles, je n'ai pas perdu la partie (je suis juste dans l'état «jinxed»), donc je ne vous dois pas de coke à moins que je ne parle plus… oh, attends un instant.
Tsuyoshi Ito
si seulement vous pouviez échanger des points de réputation :)
Suresh Venkat
5

(Pour l'instant, permettez-moi de m'en tenir aux requêtes de connectivité, qui peuvent malheureusement ne pas être suffisantes pour votre application.)

Une grande partie du travail précédent sur le problème de connectivité dynamique se trouve dans le modèle de mise à jour des bords: vous supposez que le nombre de sommets est fixe et vous pouvez insérer et / ou supprimer des bords tout en effectuant des requêtes. Si vous pouvez uniquement insérer (supprimer), c'est incrémentiel (décrémentiel). Si vous pouvez faire les deux, c'est entièrement dynamique. Le travail de Thorup comme l'a souligné JeffE (et moi-même dans le commentaire) sont tous destinés aux mises à jour de pointe.

AFAIK, la communauté de la théorie CS commence seulement à regarder les mises à jour des sommets pour les graphiques généraux. Il y a eu un travail révolutionnaire à ce sujet par Chan, Pătraşcu et Roditty dans FOCS 2008. Voir ce lien pour une révision très récente (septembre 2010) et les références à l'intérieur.

Maverick Woo
la source
Pourquoi pensez-vous que le Holm et. Al. approche ne fonctionne pas pour mon problème? J'allais l'adopter.
bitmask
1
Si votre graphique a un degré limité, alors en théorie, vous pouvez émuler une mise à jour de sommet en utilisant un tas de mises à jour de bord. Sinon, une seule mise à jour de sommet (par exemple, la suppression du centre d'un graphique en étoile) peut changer radicalement la connectivité du graphique, et dans ce cas, vous avez besoin du résultat de Chan et al.
Maverick Woo du
Je vois. J'aurais dû dire dans la question initiale que les suppressions de sommets sont rares, donc je peux me permettre de le faire bord à bord.
bitmask