¿Cuál es el algoritmo y la estructura de datos más eficientes para mantener la información de componentes conectados en un gráfico dinámico?


9

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 FIsConnected(N1,N2) - retornos si existe un camino entre y , de lo contrarioTN1N2F
  • NConnectedNodes(N) : devuelve el conjunto de nodos a los que se puede acceder desdeN

Esto se hace fácilmente calculando previamente los componentes conectados del gráfico. Ambas consultas pueden ejecutarse en tiempo.O(1)

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 cAddEdge(N1,N2)O(1)AddEdgeO(InverseAckermann(|Nodes|))C o n n e c t e d N o d e s O ( 1 )IsConnectedConnectedNodesO(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:

  • IsConnected(N1,N2) - devuelve si existe un camino entre y , de lo contrario .N 1 N 2 FTN1N2F
  • ConnectedNodes(N) - devuelve el conjunto de nodos que son accesible desde .N
  • AddEdge(N1,N2) : agrega un borde entre dos nodos. Tenga en cuenta que , o ambos no podrían haber existido antes.N1N2
  • RemoveEdge(N1,N2) : 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)


ConnectedNodes no podría ejecutarse en , porque si devuelve una lista de nodos, necesitaría tiempo . La implementación de con un BFS es óptima, por lo que una estructura de datos potencial solo necesitaría admitir IsConnected, AddEdge y RemoveEdge. Esto parece relevante para su pregunta: stackoverflow.com/questions/7241151/…O(1)nΩ(n)ConnectedNodes
Tom van der Zanden

@TomvanderZanden Devolver un conjunto que ya está construido (en programación, un puntero o referencia) es ... aunque no hay mucho que el usuario de pueda hacer que y no esté cubierto por . C o n n e c t e d N o d e s O ( 1 ) I s C o n n e c t e dO(1)ConnectedNodesO(1)IsConnected
user253751

Respuestas:


11

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.