Supongamos que tengo un gráfico disperso finito no dirigido y necesito poder ejecutar las siguientes consultas de manera eficiente:
- T N 1 N 2 F - retornos si existe un camino entre y , de lo contrario
- N : devuelve el conjunto de nodos a los que se puede acceder desde
Esto se hace fácilmente calculando previamente los componentes conectados del gráfico. Ambas consultas pueden ejecutarse en tiempo.
Si también necesito poder agregar bordes arbitrariamente ( , entonces puedo almacenar los componentes en una estructura de datos de conjunto disjunto . Cada vez que se agrega un borde, si conecta dos nodos en componentes diferentes, fusionaría esos componentes. Esto agrega el costo a y el costo a y (que también podría ser ).O ( 1 ) A d d E d g e O ( I n v e r s e A c k e r m a n n ( | N o d e s | ) ) I s C o n n e cC o n n e c t e d N o d e s O ( 1 )
Si también necesito poder eliminar bordes arbitrariamente, ¿cuál es la mejor estructura de datos para manejar esta situación? ¿Se conoce uno? Para resumir, debe soportar las siguientes operaciones de manera eficiente:
- - devuelve si existe un camino entre y , de lo contrario .N 1 N 2 F
- - devuelve el conjunto de nodos que son accesible desde .
- : agrega un borde entre dos nodos. Tenga en cuenta que , o ambos no podrían haber existido antes.
- : elimina un borde existente entre dos nodos.
(Estoy interesado en esto desde la perspectiva del desarrollo del juego: este problema parece ocurrir en bastantes situaciones. Tal vez el jugador pueda construir líneas eléctricas y necesitamos saber si un generador está conectado a un edificio. Tal vez el jugador pueda bloquear y desbloquear puertas, y necesitamos saber si un enemigo puede alcanzar al jugador. Pero es un problema muy general, así que lo he expresado como tal)
fuente
Respuestas:
Este problema se conoce como conectividad dinámica y es un área activa de investigación en la comunidad teórica de la informática. Todavía algunos problemas importantes todavía están abiertos aquí.
Para aclarar la terminología, solicita una conectividad totalmente dinámica, ya que desea agregar y eliminar bordes. Hay un resultado de Holm, de Lichtenberg y Thorup (J.ACM 2001) que logra el tiempo de actualización y el tiempo de consulta . Según tengo entendido, parece ser implementable. Simplemente hablando, la estructura de datos mantiene una jerarquía de árboles de expansión, y la conectividad dinámica en los árboles es más fácil de cubrir. Puedo recomendar las notas de Erik D. Demaine para una buena explicación, ver aquí un video. La nota de Erik también contiene punteros a otros resultados relevantes. Como nota: todos estos resultados son resultados teóricos.O ( log n / log log n )O(log2n) O(logn/loglogn)
Es posible que estas estructuras de datos no proporcionen consultas ConnectedNodes per se, pero es fácil lograrlo. Simplemente mantenga como una estructura de datos adicional el gráfico (digamos como una lista de bordes doblemente conectada) y realice la búsqueda de profundidad primero para obtener los nodos a los que se puede llegar desde un determinado nodo.
fuente