I Minimum Spanning Tree Algoritmos de Prim e Kruskal I · Algoritmos de Prim e Kruskal Fernando...

9
Minimum Spanning Tree Algoritmos de Prim e Kruskal Fernando Lobo Algoritmos e Estrutura de Dados II 1 / 35 Algoritmo de Prim I Inicialmente A = I Mantemos V - A numa fila com prioridade Q . I A chave de cada n´ o na fila indica o custo m´ ınimo de juntar esse n´ o a um qualquer n´ o de A. I Quando o algoritmo termina, a fila Q est´ a vazia. A MST A ´ e dada por: A = {(v , v ): v V -{s }} 2 / 35 Pseudoc´odigo MST-Prim(G , w , s ) for each u G . V u. key = u= nil s . key =0 Q = G . V while Q 6= u = Extract-Min(Q ) for each v G . Adj [u] if v Q and w (u, v ) < v . key v = u v . key = w (u, v ) 3 / 35 Exemplo 4 / 35

Transcript of I Minimum Spanning Tree Algoritmos de Prim e Kruskal I · Algoritmos de Prim e Kruskal Fernando...

Minimum Spanning TreeAlgoritmos de Prim e Kruskal

Fernando Lobo

Algoritmos e Estrutura de Dados II

1 / 35

Algoritmo de Prim

I Inicialmente A = ∅

I Mantemos V − A numa fila com prioridade Q.

I A chave de cada no na fila indica o custo mınimo de juntaresse no a um qualquer no de A.

I Quando o algoritmo termina, a fila Q esta vazia. A MST A edada por:

A = {(v , v .π) : v ∈ V − {s}}

2 / 35

Pseudocodigo

MST-Prim(G ,w , s)

for each u ∈ G .Vu.key = ∞u.π = nil

s.key = 0Q = G .Vwhile Q 6= ∅

u = Extract-Min(Q)for each v ∈ G .Adj [u]

if v ∈ Q and w(u, v) < v .keyv .π = uv .key = w(u, v)

3 / 35

Exemplo

4 / 35

Inicializacao

5 / 35

1a iteracao do ciclo while

6 / 35

2a iteracao do ciclo while

7 / 35

3a iteracao do ciclo while

8 / 35

4a iteracao do ciclo while

9 / 35

5a iteracao do ciclo while

10 / 35

6a iteracao do ciclo while

11 / 35

7a iteracao do ciclo while

12 / 35

Complexidade do Algoritmo de Prim

I Depende da implementacao da fila com prioridade.

I Se implementarmos com um heap binario:

I Inicializacao → Build-Heap → O(V )

I Ciclo while e executado |V | vezes.

I |V | Extract-Mins → O(V lg V )

I No maximo, |E | Decrease-Keys → O(E lg V )

I Total = O(V lg V + E lg V ) = O(E lg V )

I A verificacao if v ∈ Q pode ser obtida em tempo constante semantivermos um bit vector com indicacao dos nos que estaoem Q.

13 / 35

Complexidade do Algoritmo de Prim

I E possıvel obter uma complexidade melhor se usarmos heapsde Fibonacci para implementar a fila.(Nao demos estes heaps, mas se tiverem curiosidade poder lero capıtulo do vosso livro que fala sobre eles.)

I Consegue-se fazer com que |E | Decrease-Keys tenhacomplexidade O(E ), amortizado.=⇒ TPrim = O(V lg V + E )

I E um ganho substancial para grafos esparsos.

14 / 35

Algoritmo de Kruskal

I Inicialmente A = ∅. No final A sera uma MST.

I Ordenamos os arcos do grafo por ordem crescente de peso.

I Percorre-se a lista ordenada dos arcos, um a um, eadicionamos o arco a A desde que nao produza ciclo.

I Ao contrario do algoritmo de Prim, o algoritmo de Kruskalmantem ums floresta. Inicialmente a floresta tem |V | arvores,uma para cada no. No final, a floresta so tem uma arvore quee uma Minimum Spanning Tree.

15 / 35

Exemplo: Inicializacao

16 / 35

Iteracao 1

17 / 35

Iteracao 2

18 / 35

Iteracao 3

19 / 35

Iteracao 4

20 / 35

Iteracao 5

21 / 35

Iteracao 6

22 / 35

Iteracao 7, 8, 9, 10

23 / 35

Evolucao da floresta de arvores

Inicializacao

24 / 35

Iteracao 1

25 / 35

Iteracao 2

26 / 35

Iteracao 3

27 / 35

Iteracao 4

28 / 35

Iteracao 5

29 / 35

Iteracao 6

30 / 35

Iteracao 7, 8, 9, 10

31 / 35

Implementacao do Algoritmo de Kruskal

I Necessitamos de uma estrutura de dados que permita manterdinamicamente uma floresta de arvores.

I Inicialmente temos |V | arvores.

I A cada passo do algoritmo juntamos duas arvores e ficamoscom menos uma arvore na floresta.

I Na realidade, nao e necessario manter explicitamente asarvores.

I Basta manter os nos que cada arvore contem.

I Nota: As arvores sao disjuntas. Um no e elemento de uma euma so arvore.

32 / 35

Implementacao do Algoritmo de Kruskal

I O que necessitamos e de uma estrutura de dados para manteruma coleccao S de conjuntos disjuntos.

I Essa estrutura de dados tem o nome UNION-FIND (vamosestuda-la em detalhe na proxima aula).

I Suporta estas operacoes: Make-Set(x), Find-Set(x) eUnion(x , y)

I Make-Set(x): cria {x} e acrescenta-o a S .

I Find-Set(x): retorna um identificador do conjunto quecontem x .

I Union(x , y): faz a uniao do conjunto que contem x com oconjunto que contem y e acrescenta-o a S , eliminado osconjuntos originais que continham x e y .

33 / 35

Pseudocodigo

MST-Kruskal(G ,w)

A = ∅for each v ∈ G .V

Make-Set(v)sort G .E in ascending order of weight wfor each (u, v) ∈ G .E , taken in ascending order of weight

if Find-Set(u) 6= Find-Set(v)A = A ∪ {(u, v)}Union(u, v)

return A

34 / 35

Complexidade do Algoritmo de Kruskal

I Primeiro ciclo for: O(V ) Make-Sets

I Ordenar E : O(E lg E )

I Segundo ciclo for: O(E ) Find-Sets e UnionsNa realidade so fazemos O(V ) Unions. Porque?

I A complexidade vai depender da dorma como se implementa aestrutura de dados UNON-FIND.

I Mas e possıvel obter uma complexidade de O(E lg V ).Veremos como na proxima aula.

35 / 35