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 .
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.
Réponses:
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.
Monika R. Henzinger et Valerie King. Algorithmes de graphe entièrement dynamiques randomisés avec temps polylogarithmique par opération . Journal de l'ACM 46 (4): 502-516, 1999.
Jacob Holm, Kristian de Lichtenberg et Mikkel Thorup. Algorithmes entièrement dynamiques déterministes poly-logarithmiques pour la connectivité, l'arbre couvrant minimum, 2 arêtes et la biconnectivité , Journal of the ACM 48 (4): 723—760, 2001.
Mikkel Thorup. Connectivité graphique entièrement dynamique presque optimale . Proc. 32e STOC 343—350, 2000.
la source
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
la source
(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.
la source