Algoritmo de Kruskal Disciplina Análise de Algoritmos Bacharelado em CC.

Post on 22-Apr-2015

125 views 0 download

Transcript of Algoritmo de Kruskal Disciplina Análise de Algoritmos Bacharelado em CC.

Algoritmo de Kruskal

Disciplina Análise de Algoritmos

Bacharelado em CC

Algoritmo de Kruskal

Utiliza o arcabouço geral do método guloso para MST, com os seguintes detalhes:

• O conjunto inicial X0 é um subgrafo com |V| vértices isolados e nenhuma aresta.

• A cada etapa k :– O corte (S,V-S) só deve satisfazer a propriedade de “respeitar” o

Xk-1, isto é, cada aresta de Xk-1 tem seus dois vértices do mesmo lado do corte. Nenhuma aresta de Xk-1 atravessa o corte.

– Não necessariamente um lado do corte contém TODAS as arestas de Xk-1, como no algoritmo PRIM.

Exemplo de Aplicação de Kruskal

Considere o seguinte grafo G

Etapa 0 : X0 é o subgrafo X0 = (V,E) onde V = {a,b,c,d,e,f,g,h,i} e E =

Lembre que : No algoritmo de PRIM, na etapa 0, X0 = (V,E), onde V = , E =

Etapa 1

Considera a aresta de menor custo {h,g} ligando duas componentes conexas h e g distintas !

X1 = {h-g}

Etapa 2

X1 = {h-g}

Considera a 2a aresta de menor custo {i,c} – ligando duas componentes conexas distintas i e c

X2 = {h-g,i-c}

Etapa 3

X2 = {h-g,i-c}

Considera a 3a aresta de menor custo {g,f} – ligando duas componentes conexas distintas {h-g} e {f}

X3 = {h-g,i-c,g-f}

Etapa 4

X3 = {h-g,i-c,g-f}

Considera a 4a aresta de menor custo {a,b}, ligando as componentes conexas distintas {a} e {b}

X4 = {h-g,i-c,g-f,a-b}

Etapa 5

X4 = {h-g,i-c,g-f,a-b}

Considera a 5a aresta de menor custo {c,f}, ligando duas componentes conexas distintas

X5 = {h-g,i-c,g-f,a-b,c-f}

Etapa 6

X5 = {h-g,i-c,g-f,a-b,c-f}Considera a 6a aresta de menor custo {c,d} ligando duas componentes conexas distintas.

Repare que a aresta i-g liga vértices da mesma componente conexa de X6, logo não pode ser considerada, embora seja de menor custo !

Resultado final

Exercicio: continue as demais etapas a partir da sétima até chegarneste resultado final.

Justificando a corretude do Algoritmo de Kruskal

Considere o seguinte grafo G

Etapa 0 : X0 é o subgrafo X0 = (V,E) onde V = {a,b,c,d,e,f,g,h,i} e E = Corte S = { } , V – S = V

Lembre que : No algoritmo de PRIM, na etapa 0, X0 = (V,E), onde V = , E =

Etapa 1

Considera a aresta de menor custo {h,g}

Corte: S = {h}, V- S = {a,b,c,d,e,f,g,i}S contém os vértices das arestas de X0 (nenhum vértice !)

X1 = {h-g}

Etapa 2

X1 = {h-g}

Considera a 2a aresta de menor custo {i,c}

Corte: S = {h,g,i}, S contém os vértices das arestas de X1

X2 = {h-g,i-c}

Etapa 3

X2 = {h-g,i-c}

Considera a 3a aresta de menor custo {g,f}

Corte: S = {h,g} V- S = {i,c,d,e,f,a,b}, cada aresta de X2 está contida em S ou em V-S.

X3 = {h-g,i-c,g-f}

Etapa 4

X3 = {h-g,i-c,g-f}

Considera a 4a aresta de menor custo {a,b}

Corte: S = {h,g,f,a} V- S = {i,c,d,e,b}, cada aresta de X3 está contida em S ou em V-S.

X4 = {h-g,i-c,g-f,a-b}

Etapa 5

X4 = {h-g,i-c,g-f,a-b}

Considera a 5a aresta de menor custo {c,f}

Corte: S = {h,g,f,a,b}, V- S = {i,c,d,e}

X5 = {h-g,i-c,g-f,a-b,c-f}

Etapa 6

X5 = {h-g,i-c,g-f,a-b,c-f}Considera a 6a aresta de menor custo {c,d}Corte: S = {h,g,i,c,a,b,f}, V-S = {d,e}X6 = {h-g,i-c,g-f,a-b,c-f,c-d}

Repare que a aresta i-g liga vértices da mesma componente conexa de X6, logo não pode ser considerada, embora seja de menor custo !

Algoritmo de Kruskal1. X = grafo (V,)2. Para cada vértice v ∈ V3. Makeset(v) ; % transforma cada vértice isolado é

uma componente conexa de X4. Ordena as arestas de G em ordem crescente de custo5. Para cada aresta (u,v) de G, considerando a ordem

crescente de custo6. Se Find(u) Find(v) % no máximo |V| - 1 vezes 7. X = X {(u,v)}8. Union(Find(u), Find(v)9. Retorna X

Esquema Geral:|V|.makeset + O(|E|.log(|E|) + |E|.(Find) + (|V| - 1) (Union)

Análise da ComplexidadeEsquema Geral:|V|.makeset + O(|E|.log(|E|) + |E|.(Find) + (|V| - 1) (Union)

A complexidade depende da implementação das operações de conjunto:

Makeset, Find, Union

Implementação de Find e Union utilizando representação de conjuntos por árvores e ranks em cada nó da árvore : log(|V|)

Complexidade = |V|.O(1)+ O(|E|.log(|E|) + O(|E|+|V|).(log(|V|))

Pior caso |E| = |V|2 : O( log(|E|) = O( log(|V) )

Complexidade = O( |V|2 log(|V| )Ver prova nos slidesseguintes

Representação de conjuntos como àrvores

Como representar um conjunto {A1,..., An} por uma árvore ?Exemplo: {A,B,C,D,E,F,G}

Passo 0: Constrói, para cada elemento X, uma árvore de um único elemento (raiz) X0 de rank 0.

A0 B0 C0 D0 E0 F0 G0

Passos 1, 2 e 3: union(A,B), union(C,D), union(E,F), resultando em 4 árvores:

B1

A0

D1

C0

F1

E0

union(A,B) union(C,D) union(E,F)

G0

• Passos 4 e 5: union(B,D), union(F,G) : resultado 2 árvores

B1

A0

union(B,D)

D2

C0

F1

E0 G0

union(F,G)

Passo 6 : union(D,F)

B1

A0

D2

C0F1

E0 G0

Representação de {A,B,C,D,E,F,G} em árvore

Representantes de Conjuntos• O representante oficial de uma árvore é a sua raiz.• Assim, a árvore

B1

A0

D2

C0

tem como representante oficial a raiz D.

Também pode-se se referir a esta árvore através de qualquer de seus nós. Porexemplo, a árvore da figura pode ser referida por “A”. Mas seu representanteoficial é D.

Operação Find(A): retorna o representante oficial da árvore contendo o nó A = D

Se rank D é k então Find(A) executa no máximo k passos para chegar até a raiz D.

Operações Find e Makeset Makeset(x)1. pai(x) = x2. rank(x) = 0

Complexidade de Makeset = O(1)

Find(x)1. While x pai(x) 2. x = pai(x)3. Retorna x

Complexidade de Find(x) = O(k), onde k = profundidade da árvore contendo x = rank da raiz desta árvore

Observação: a raiz de uma árvore é o único nó que é seu próprio pai.

Operação Union

Union(x,y)

1. Rx = Find(x)

2. Ry = Find(y)

3. Se Rx = Ry: retorna x

4. Se rank(Rx) > rank(Ry)

5. pai(Ry) = Rx

6. Else

7. Pai(Rx) = Ry

8. Se rank(Rx) = rank(Ry)

9. rank(Ry) = Rank(Ry) + 1

Complexidade das operações Find e Union

Qual a relação entre o número n de elementos de uma árvore e a sua profundidade k ?

Vamos mostrar k ≤ log2(n)

Propriedade 1: Para todo x (diferente da raiz), rank(x) < rank(pai(x))

Propriedade 2: Qualquer nó de rank k tem no mínimo 2k descendentes.

Prova: por indução sobre k

Base da indução: k = 0. Neste caso o único descendente é o próprio nó. Portanto número de descendentes = 1 = 20

Passo da indução: Suponha o resultado verdadeiro para rank = k-1 e seja x um nó de rank k > 0. Neste caso, a árvore de x foi obtida juntando-se duas árvores de raiz u e raiz v de mesmo rank k-1. Logo o número de descendentes de x = número de descendentes de u + número de descendentes de v ≤ 2k-1 + 2k-1 = 2. 2k-1 = 2k

Complexidade das operações Find e Union

Qual a relação entre o número n de elementos de uma árvore e a sua profundidade k ?

Considere uma árvore de n elementos com raiz x de rank k

Então k = profundidade da árvore

Pela propriedade 2, temos que n ≥ 2k

Logo: log2(n) ≥ k

Portanto : k ≤ log2(n)

Portanto a complexidade de Find e Union é O(log(n)), uma vez que todas as árvores têm profundidade máxima log2(n)