Supposons que j'ai un graphe clairsemé fini non orienté et que je dois être capable d'exécuter efficacement les requêtes suivantes:
- - renvoie T s'il existe un chemin entre N 1 et, sinon F
- - retourne l'ensemble des nœuds accessibles depuis
Cela se fait facilement en pré-calculant les composants connectés du graphique. Les deux requêtes peuvent s'exécuter en temps .
Si je dois également pouvoir ajouter des bords arbitrairement - - alors je peux stocker les composants dans une structure de données à ensembles disjoints . Chaque fois qu'un bord est ajouté, s'il connecte deux nœuds dans des composants différents, je fusionnerais ces composants. Cela ajoute O ( 1 ) à A d e r m a n n ( | N o d e s | ) ) à I et O ( I n v e r s e A c k et C o n n e c t e d N o d e s (qui pourrait aussi bien être O ( 1 ) ).
Si je dois également pouvoir supprimer arbitrairement des bords, quelle est la meilleure structure de données pour gérer cette situation? Est-on connu? Pour résumer, il doit prendre en charge efficacement les opérations suivantes:
- - rendements T s'il existe un chemin entre N 1 et N 2 , sinon F .
- - retourne l'ensemble de noeuds qui sont accessibles à partir de N .
- - ajoute un bord entre deux nœuds. Notez que N 1 , N 2 ou les deux peuvent ne pas avoir existé auparavant.
- - supprime un bord existant entre deux nœuds.
(Je m'intéresse à cela du point de vue du développement du jeu - ce problème semble se produire dans plusieurs situations. Peut-être que le joueur peut construire des lignes électriques et nous devons savoir si un générateur est connecté à un bâtiment. Peut-être que le joueur peut verrouiller et déverrouiller les portes, et nous devons savoir si un ennemi peut atteindre le joueur. Mais c'est un problème très général, donc je l'ai formulé comme tel)