Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 ·...

31
Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas de união e busca

Transcript of Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 ·...

Page 1: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Estruturas de Dados Avançadas (INF1010)

Grafos: árvore geradora mínimaestruturas de união e busca

Page 2: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Árvore Geradora de Custo Mínimo

G = (V, E, p) um grafo conexo ponderado

árvore geradora de G: subgrafo acíclico com todos os vértices de G e caminhos entre quaisquer dois vértices

árvore geradora de custo mínimo: a soma dos pesos das arestas é mínima

1 2

0

3

1 2

0

3

1 2

0

3

Page 3: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal1. Considere cada nó como uma árvore separada (formando uma floresta)

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

Page 4: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

Page 5: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

Page 6: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

14

Page 7: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

14 16

Page 8: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

14 16

18

Page 9: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

14 16

22

Page 10: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

14 16

22

24

Page 11: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Algoritmo de Kruskal2. Examine a aresta de menor custo. Se ela unir duas árvores na floresta, inclua-a3. Repita o passo 2 até todos os nós estarem conectados

0

51

2

3

4

6

25

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

12

14 16

22

25

Page 12: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Implementação

→ o grafo continua representado como antes

→ heap de prioridade para arestas

→ Min Heap para remover aresta de menor custo

como descobrir se a aresta de menor custo une 2 árvores distintas?

Page 13: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Implementação

→ o grafo continua representado como antes

→ heap de prioridade para arestas

→ Min Heap para remover aresta de menor custo

como descobrir se a aresta de menor custo une 2 árvores distintas?

estrutura de união e busca

Page 14: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Definições

Universo U = {x1,x2,…,xn}

Uma partição é uma coleção C = {S1,…,Sk}

→ Si ⊆ U (todos os conjuntos estão contidos no universo)

→ S1 ∪ … ∪ Sk = U (cobertura: a união de todos os conjuntos representa o universo)

→ Si ∩ Sj = ∅, para i≠j (os conjuntos são disjuntos)

Cada conjunto Si é identificado por um elemento x ∈ Si (representante de Si )

Page 15: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Estruturas de União e BuscaEstruturas de Dados para manipulação de partições de conjuntos

Operações básicas:

cria()

cria uma partição do conjunto original

busca(x) informa a qual conjunto (parte) um elemento pertence, retornando o

elemento que representa o conjunto

→ útil para determinar se dois elementos estão no mesmo conjunto

união(x,y) combina dois conjuntos, substituindo Si e Sj por um novo conjunto Sk

tal que Si ∪ Sj = Sk

Page 16: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

União e Busca para KruskalVerificar se arestas unem dois componentes não conexos

→ inicialmente cria-se uma partição com “conjuntos unitários”

→ ao inserir arestas, faz-se a união das partes correspondentes

→ operação de busca indica se vértices já estão conectados

0

51

2

3

4

625

22

24

10

14

28

16

18 12

0

51

2

3

4

6

10

Page 17: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Representação por Árvores Reversas

Cada nó aponta para seu pai

A raiz é o representante do conjunto

→ aponta para si mesma (ou NULL)

x

s w

x

s w

x

y w

x

y w

Page 18: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Representação por Árvores Reversas

U = {s,t,u,v,w,x,y,z}

S1 = {t,u,v,y,z} S2={s,w,x}

v

u

z yt

x

s w

u

t v y z s w

x

Page 19: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Operação cria

cria(n) → {S0, …, Sn-1}

→ cria uma estrutura união-e-busca (partição) com n elementos disjuntos

v

u

yt

w

ut v y zs w x

Page 20: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Operação busca

busca(ub, v)

→ identifica o conjunto ao qual o elemento pertence→ retorna o representante do conjunto→ caminhar até a raiz

v

u

z yt

x

s w

u

t v y z s w

x

Page 21: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Operação união

união(ub, u, x)

→ une dois conjuntos, fazendo com que a raiz de um aponte para a raiz do outro

→ torna uma árvore uma sub-árvore da outra→ se os elementos não são representantes,

precisamos achar os representantes (busca)

v

u

z yt

x

s w

u

t v y z s w

x

Page 22: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Complexidade

busca (e união) → O(h) (altura)

usando operações de união quaisquer a árvore resultante pode ficar “degenerada”

→ complexidade O(n)

união por número de nós ou por altura

uut v y zs w x

Page 23: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Representação por Vetor

Cada elemento do vetor representa um elemento do universo (índice = elemento)

→ cada elemento aponta para seu pai (índice do pai)

7

v

u

z yt

x

s w

2

0 4 5 7 1 6

3

0 1

2 3

2 3

-1 -1

4 5

2 2

6 7

3 2

Page 24: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Implementação com Vetor

typedef struct suniaoBusca UniaoBusca; UniaoBusca* ub_cria(int tam);/* cria particao de conjunto com tam elementos *//* cada elemento está inicialmente em parte separada */

int ub_busca (UniaoBusca* ub, int u);/* retorna o representante da parte em que está u */

int ub_uniao (UniaoBusca* ub, int u, int v);/* retorna o representante do resultado */

void ub_libera (UniaoBusca* ub);/* libera a estrutura */

void debug (UniaoBusca *ub);

Page 25: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Implementação ineficientetypedef struct uniaobusca UniaoBusca;struct uniaoBusca { int n; int *v;};

UniaoBusca* cria(int tam) {/* cria estrutura com tamanho dado e preenche vetor com -1 */}

int busca (UniaoBusca* ub, int u) { while (ub->v[u] >= 0) u = ub->v[u]; return u;}

int uniao (UniaoBusca* ub, int u, int v) { v = busca (ub, v); /* acha raiz da árvore de v */ u = busca (ub, u); /* acha raiz da árvore de u */ ub->v[u] = v; return v;}

Page 26: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

União ineficiente

d

e f

a

b c

j

k l

g

h i

p

q r

m

n o

Page 27: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

União ineficiente

b

d

e f

a

c

j

k l

g

h i

p

q r

m

n o

b

d

e f

a

c

j

k l

g

h i

p

q r

m

n o

Operações de busca com tempo linear O(n)

Page 28: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

União nas raízesint ub_uniao (UniaoBusca* ub, int u, int v){ u = ub_busca(ub, u); v = ub_busca(ub, v); … /* une u e v! */}

28

7

v

u

z yt

x

s w2

0 4 5 7

1 6

3

ou

7v

u

z ytx

s w

2

0 4 5 7

1 6

3

Page 29: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Otimização

“Pendurar” árvore com menor número de nós:

int ub_uniao (UniaoBusca* ub, int u, int v){ u = busca(ub, u); v = busca(ub, v); /* uniao com base no numero de nós */ if /* arvore em u tem menos nós */ { ub->v[u] = v; /* atualiza o numero de nós de v */ return v; } else { /* arvore em v tem menos nós */ ub->v[v] = u; /* atualiza o numero de nós de u */ return u; }

Page 30: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Como manter número de nós?

Podemos usar o campo que indica o pai, e nas raizes armazenar -(número de nós) em vez de -1

int ub_uniao (UniaoBusca* ub, int u, int v){ u = busca(ub, u); v = busca(ub, v); /* uniao com base no numero de nós */ if (ub->v[u] > ub->v[v] ) { /* negativos: v[u] menor em módulo! */ ub->v[v] += ub->v[u]; /* atualiza o numero de nós de v */ ub->v[u] = v; return v; } else { /* arvore em v tem menos nós */ ub->v[u] += ub->v[v]; /* atualiza o numero de nós de u */ ub->v[v] = u; return u; }

Page 31: Estruturas de Dados Avançadas (INF1010)amoura/inf1010/Grafos_UniaoBusca.pdf · 2019-11-11 · Estruturas de Dados Avançadas (INF1010) Grafos: árvore geradora mínima estruturas

Otimização

Na busca podemos aproveitar para pendurar nós intermediários diretamente na raiz...

int busca (UniaoBusca* ub, int u){ int x = u; int aux; if ((u < 0) || (u > ub->n)) return -1; while (ub->v[u] >= 0) u = ub->v[u]; while (ub->v[x] >= 0) { aux = x; x = ub->v[x]; /* pai atual */ ub->v[aux] = u; /* muda para raiz */ } return u;}