El problema con quick-find es al hacer la operación unir, hay que recorrer todo el array y hacer varios cambios.
¿Qué podemos hacer para añadir un nodo a una componente?
Utilizamos un array ID:
ID = [0,1,7,5,6,6,6,5];
encontrar_raiz(n):
mientras id[n] != n:
n = id[n]
return n
Conectados(p,q):
return encontrar_raiz(p) == encontrar_raiz(q)
unir(p,q):
pid = encontrar_raiz(p)
qid = encontrar_raiz(q)
id[pid] = qid
El problema es que los árboles se pueden volver muy altos.
¿Cómo podemos hacer que los árboles crezcan menos?
Dada las siguientes ordenes,
unir(0,1); unir(2,0);unir(7,2);unir(3,7);unir(4,3);
¿cómo debería hacerse el árbol para que quede de la ``mejor'' forma posible? ¿y la ``peor''?
encontrar_raiz(n):
mientras id[n] != n:
n = id[n]
return n
Conectados(p,q):
return encontrar_raiz(p) == encontrar_raiz(q)
unir(p,q):
pid = encontrar_raiz(p)
qid = encontrar_raiz(q)
if pid != quid:
if tamaño[pid] <tamaño[qid]:
id[pid] = qid
tamaño[qid] += tamaño[pid]
else:
id[qid] = pid
tamaño[pid] += tamaño[qid]
Dados N objetos, y después de un número finito de inserciones, la altura de cualquiera de los árboles que se han generado es del orden logarítmico.
La idea de la prueba es que los árboles solo crecen cuando son añadidos a otro árbol con más nodos.
¿Cuantos nodos tendrá, como mínimo, el nuevo árbol? ¿cuantas veces se puede repetir este proceso?
Aquí podríamos parar pero, se puede mejorar:
En este problema, hay una transición de fase (es lo que se deduce del los experimentos), para N = 20: