¿Cuál es el mejor tiempo de ejecución de un algoritmo que verifica la conexión entre dos conjuntos de nodos en un gráfico?

Como dijo Ashish, DFS está bien, pero creo que el conjunto de datos disjuntos funcionará rápido y de una manera mucho mejor cuando el número de nodos sea mayor. Básicamente consiste en 3 conjuntos de operaciones (), Buscar (). Si el usuario comprime la versión de este algoritmo, obtendrá el tiempo amortizado por operación. , dónde es el inverso de la función y es la función de Ackerman de crecimiento extremadamente rápido. Ya que es el inverso de esta función, es inferior a 5 para todos los valores remotamente prácticos de . Por lo tanto, el tiempo de ejecución amortizado por operación es efectivamente una pequeña constante.
U puede probar ambos apporach (DFS, DISJOINT SET) en el problema http://www.spoj.pl/problems/CAM5/ y verificar el tiempo de ejecución.

Pseudocódigo

función MakeSet (x)
x.parent: = x
x.rank: = 0

función Unión (x, y)
xRoot: = Buscar (x)
yRoot: = Buscar (y)
si xRoot == yRoot return
// x e y aún no están en el mismo conjunto. Fusionarlos.
si xRoot.rank <yRoot.rank
xRoot.parent: = yRoot
más si xRoot.rank> yRoot.rank
yRoot.parent: = xRoot
más yRoot.parent: = xRoot
xRoot.rank: = xRoot.rank + 1

función Buscar (x)
si x.parent! = x
x.parent: = Buscar (x.parent)
return x.parent

Encontrar la intersección de ambos conjuntos de nodos es trivial.

Para la parte de la ruta, creo que un simple BFS o DFS será suficiente. Para verificar si hay una ruta entre al menos un par de nodos n1, n2 donde n1 está en el primer conjunto y n2 está en el segundo conjunto, haga una primera búsqueda en profundidad desde un nodo (digamos x) en el primer conjunto, si Si llega a un nodo (digamos y) en el segundo conjunto, definitivamente puede decir que existe tal ruta. El tiempo de ejecución es solo el costo de hacer la primera búsqueda en profundidad en el gráfico, O (V + E). Breadth First Search también se puede usar en lugar de Depth First Search. Pero creo que DFS funcionará mejor.

Psuedocódigo del algoritmo:

  procedimiento dfs (fuente del nodo):
	 visitado [fuente] = 1
	 si fuente en nodeset2:
    	 volver verdadero
	 para todos los nodos adyacentes v que visitaron [v] = 0:
    	 si dfs (v):
	 volver verdadero
	 visitado [fuente] = 2
	 falso retorno

  procedimiento isConnected (nodeset1, nodeset2):
		 para el nodo en el conjunto de nodos1:
			 visitado [nodo] = 0
		 if setIntersection (nodeset1, nodeset2):
			 volver verdadero
		 para el nodo en el conjunto de nodos1:
			 si no se visita [nodo] y dfs (nodo):
				 volver verdadero
		 falso retorno

No necesita verificar las rutas entre todos los pares de nodos. Simplemente puede verificar si puede llegar a cualquier nodo en n2, comenzando desde cualquier nodo en n1.

Para hacer eso, ejecute una Búsqueda de aliento primero (BFS) en un gráfico que consta de ambos conjuntos de nodos y márquelo a medida que los visita. Debe iniciar BFS desde cada nodo n1 no visitado y detener el algoritmo cada vez que visite cualquier nodo en n2.

En el peor de los casos, debe visitar todos los nodos y seguir todos los bordes. Por lo tanto, la complejidad temporal del algoritmo es O (V + E), mientras que la complejidad espacial es O (V + E)

More Interesting

¿Es bueno tener más y más parámetros capturados para los datos de calificación crediticia? ¿Los algoritmos comienzan a fallar / se vuelven inexactos si hay demasiados atributos en los datos? ¿Cómo se pueden erradicar los parámetros que no son muy útiles?

¿Cuáles son algunas arquitecturas informáticas generales viables y potencialmente útiles que no sean las de Von Neumann?

¿Para qué fines es útil la teoría de la información?

¿Qué son "hilos sin peso" y cómo los implemento? ¿Cuáles son las ventajas de usarlos?

¿Qué startups reclutan estudiantes universitarios con experiencia en aprendizaje automático?

¿Cuál es el algoritmo más eficiente para encontrar todos los números primos entre dos números arbitrarios dados?

¿Qué debo hacer durante el verano antes de mi segundo año como estudiante de informática?

¿Cuál es la diferencia entre MapReduce, inteligencia artificial y aprendizaje automático? O más bien, ¿cómo están relacionados?

La mayoría de la gente dice que Windows tiene fugas de seguridad. ¿Qué tan cierto es eso?

¿Hay algún papel de JavaScript en el aprendizaje automático o el desarrollo de IA?

Si tengo n computadoras que ejecutan un programa Python, ¿cómo sincronizo los relojes de esas computadoras para que todas acepten menos de 0.1 milisegundos?

¿Es la Ley de Moore el resultado de los términos de licencia del Departamento de Defensa?

¿Cómo funciona Google Translator (función de cámara)?

Cómo extraer títulos de trabajo de los perfiles públicos de LinkedIn para mi base de datos de ventas de más de 100k

¿La ingeniería eléctrica está relacionada con la informática?