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
- ¿Cómo debería aprender el aprendizaje automático este verano e implementarlo en un proyecto como menor o mayor?
- ¿Cuáles son los proyectos geniales que uno puede hacer en Inteligencia Artificial y Aprendizaje Automático?
- ¿Existe un MOOC gratuito para aprender A +, seguridad de red u otros cursos necesarios para certificaciones informáticas comunes?
- ¿Cómo funciona exactamente un protocolo proxy ARP? ¿Funciona para dos ubicaciones remotas?
- En la programación de ensamblaje (todos los tipos), ¿es útil / necesaria la instrucción de salto a desplazamiento (PC + x) si ya hay una instrucción de salto que apunta a un registro o valor absoluto? Estoy pidiendo una PC que estoy diseñando actualmente.
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