Considera un grafico diretto su cui puoi aggiungere dinamicamente i bordi e fare alcune domande specifiche.
Esempio: foresta disgiunta
Considera il seguente set di query:
arrow(u, v)
equiv(u, v)
find(u)
il primo aggiunge una freccia al grafico, il secondo decide se , l'ultimo trova un rappresentante canonico della classe di equivalenza di , ovvero una tale che implica .u ↔ ∗ v ↔ ∗ r ( u ) u ↔ ∗ v r ( v ) = r ( u )
Esiste un noto algoritmo che utilizza la struttura di dati forestali disgiunti che implementa queste query in complessità ammortizzata quasi costante, vale a dire . Si noti che in questo caso equiv
viene implementato utilizzando find
.
Variante più complessa
Ora sono interessato a un problema più complesso in cui le indicazioni contano:
arrow(u, v)
confl(u, v)
find(u)
il primo aggiunge una freccia , i secondi decidono se esiste un nodo raggiungibile sia da che da , cioè . L'ultimo dovrebbe restituire un oggetto tale che implica dove dovrebbe essere facilmente calcolabile. (Per, diciamo, calcola ). L'obiettivo è trovare una buona struttura di dati in modo che queste operazioni siano veloci.confl
cicli
Il grafico può contenere cicli.
Non so se esiste un modo per calcolare in modo efficiente e incrementale i componenti fortemente connessi, al fine di considerare solo i DAG per il problema principale.
Naturalmente apprezzerei anche una soluzione per i DAG. Corrisponderebbe a un calcolo incrementale dell'antenato meno comune.
Approccio ingenuo
La struttura di dati della foresta disgiunta non è utile qui, poiché ignora la direzione dei bordi. Si noti che non può essere un singolo nodo, nel caso in cui il grafico non sia confluente.
Si può definire e definire come quando . Ma come calcolare questo in modo incrementale?
Probabilmente che il calcolo di un set così grande non è utile, un set più piccolo dovrebbe essere più interessante, come nel solito algoritmo di ricerca unione.