Ata de Resolução de Exercícios - Conjuntos Disjuntos - 09/05/2003
FIND-SET(x9)
NR_FIND-SET(x) representante <- x ; primeiro achamos o representante do conjunto (primeira passada) enquanto (representante <> pai[representante]) faça representante <- pai[representante] ; agora subimos novamente na árvore, associando os pais de x ao representante caminho <- x enquanto (caminho <> pai[caminho]) faça temp <- pai[caminho] pai[caminho] <- representante caminho <- temp retorna representante
Sequëncia possível de operações, onde n é o número de elementos: for i <- 1 to n do MAKE-SET(xi) for dist <- 1 to piso(lgn) do for i <- 1 to ((n+1) - 2^dist) by 2^dist UNION(xi, xi+((2^dist)/2)) for j <- 1 to n do FIND-SET(x1) As linhas 1 e 2 realizam n operações MAKE-SET. As linhas 3, 4 e 5 realizam sucessivas uniões em pares de nós: na primeira vez temos as uniões de pares consecutivos (x1,x2), (x3,x4),...,(xn-1,xn); depois temos (x1,x3), (x5,x7),...,(xn-3,xn-1); de forma que continuamos isso até termos somente um conjunto formado. Isso leva um total de n-1 operações de UNION e produz uma árvore de altura Ω(lgn). Por fim, as linhas 6 e 7 realizam n operações FIND-SET na folha mais profunda da árvore. Então, para m = n + n - 1 + n temos o tempo de Ω(n+mlgn) = Ω(mlgn). |