Saltar al contenido principal

Solución de tiempo O(logn)O(\log n)

Obviando las soluciones muy elementales, que requieren tiempo O(n)O(n) para alguna de las dos operaciones, una solución sencilla es tener nn nodos, uno por cada elemento vv, y que cada clase de equivalencia sea un árbol formado por los nodos de los elementos participantes. En estos árboles, los hijos apuntan a su padre, y la raíz es el representante de la clase. La operación Find(v)Find(v) consiste entonces en recorrer los ancestros sucesivos de vv hasta llegar a la raíz xx, y entonces responder xx. La operación Union(x,y)Union(x,y), para dos raíces xx e yy, cuelga xx como un hijo más de yy (es decir, hace que yy sea el padre de xx) o vice versa, eligiendo siempre colgar el árbol con menos nodos del árbol con más nodos (cada nodo conoce el tamaño de su subárbol, lo que es fácil de mantener cuando se le agrega otro subárbol como hijo).

--> imagen

Es fácil ver por inducción que, en los árboles resultantes, un árbol de altura rr tiene v2rv \ge 2^r nodos. Esto vale para los nodos iniciales, que definimos de altura 00 y que contienen 20=12^0=1 nodos. Ahora consideremos dos árboles de v1v_1 y v2v_2 nodos, y alturas r1r_1 y r2r_2, respectivamente. Por hipótesis inductiva se cumple que v12r1v_1 \ge 2^{r_1} y v22r2v_2 \ge 2^{r_2}. Supongamos que v1v2v_1 \le v_2, por lo que el primer árbol se cuelga del segundo. El árbol resultante tiene entonces v=v1+v2v=v_1+v_2 nodos y su altura es r=max(r1+1,r2)r=\max(r_1+1,r_2). Si la altura es r=r1+1r = r_1+1, la tesis inductiva se cumple porque v=v1+v22v122r1=21+r1=2rv = v_1+v_2 \ge 2 v_1 \ge 2 \cdot 2^{r_1} = 2^{1+r_1} = 2^r. Si, en cambio, la altura es r=r2r = r_2, la tesis inductiva se cumple porque v=v1+v2v22r2=2rv = v_1 + v_2 \ge v_2 \ge 2^{r_2} = 2^r.

Como un árbol tiene a lo más nn nodos, su altura no puede ser más de log2n\log_2 n, por lo cual la operación FindFind cuesta tiempo O(logn)O(\log n). Por otro lado, la operación UnionUnion es O(1)O(1).