[email protected] adriana libório fernandes lins arthur cavalcanti alem Átila valgueiro malta...

15
[email protected] Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva Botelho Matheus Bispo Arrais de Souza Murilo Raphael de Souza Lira Rafael Alberto Gomes Pereira Lima Rafael Brandão Lobo Rafael Loureiro de Carvalho Tiago Carneiro Pessoa Canto Vinicius Miranda Cesar

Upload: stella-formoso

Post on 07-Apr-2016

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

[email protected]

Adriana Libório Fernandes LinsArthur Cavalcanti AlemÁtila Valgueiro Malta MoreiraFlavio Juvenal da Silva JúniorGustavo Cauê Silva BotelhoMatheus Bispo Arrais de Souza

Murilo Raphael de Souza LiraRafael Alberto Gomes Pereira LimaRafael Brandão LoboRafael Loureiro de CarvalhoTiago Carneiro Pessoa CantoVinicius Miranda Cesar

Page 2: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

ConjuntosUma estrutura de dados conjuntos-disjuntos é uma

coleção S = {S1, . . . , Sk} de conjuntos dinâmicos disjuntos.

Cada conjunto Sk é identificado por um representante, que é um membro do conjunto (head); que obviamente faz parte do conjunto.

Tipicamente não importa quem é o representante, apenas que ele seja consistente.

Page 3: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

ConjuntosAlgumas aplicações envolvem o agrupamento de N

elementos em uma coleção de conjuntos disjuntos, ou seja, um particionamento dos elementos em conjuntos.

Alguns usos:

° problemas de grafos

° equivalência de tipos em compiladores

Page 4: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

ConjuntosMake_Set(x): cria um novo conjunto cujo único

elemento é apontado por X (head). X não pode pertencer a outro conjunto da coleção.

Union(x, y): executa a união dos conjuntos que contêm x e y, digamos Sx e Sy, em um conjunto único. Sx ∩ Sy = Ø. O representante de S = Sx Sy∪ é o representante de Sx ou de Sy. (x e y não necessariamente são os heads).

Find(x): retorna um ponteiro para o representante (único) do conjunto que contém x.

Page 5: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosUma maneira simples de implementar uma estrutura

de dados Conjuntos Disjuntos consiste em representar cada conjunto como uma lista encadeada.

O primeiro elemento da lista é o representante. Ex: S = {a, d, e}HEAD:

Conjunto 1. a h n d h n e h n

a, d, e = Valorh = ponteiro para headn = ponteiro para next

Page 6: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosEm Conjuntos Disjuntos de Listas Encadeadas:

• A forma mais simples de implementar a operação união [union(x, y)] é adicionar a lista de x no fim da lista de y.

• O representante do conjunto x agora será o elemento que era originalmente o representante de y.

• Todavia, temos de atualizar o ponteiro para o representante (ponteiro head) de todos os elementos da lista de x.

Page 7: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosTodos os elementos são indexados.

Cada subconjunto terá o nome de seu representante.

Mantemos um vetor de nomes para o subconjunto disjunto de cada elemento.

1

5

210

7

4

6

3

8 9

1 2 3 2 1 3 2 3 3 2Conjunto

1 2 3 4 5 6 7 8 9 10

Page 8: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosEm uma implementação mais rápida da estrutura de dados

Conjuntos Disjuntos, representamos conjuntos por meio de árvores.

A raiz da árvore contém o representante do conjunto.

O filho aponta para o pai.Ex: S1 = {c, h, e, b} e S2 = {f, d, g}

h

c

b

e

g

d

f

Page 9: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosEm Florestas de Conjuntos Disjuntos:

Make Set: cria uma árvore com um único vértice.

Find Set: segue os ponteiros para os pais até atingir a raiz.

Union: faz a raiz de uma árvore apontar para a raiz da outra.

Page 10: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosCada entrada do vetor contém o pai do elemento i.

1 2 3 2 1 3 4 3 3 4Conjunto

1 2 3 4 5 6 7 8 9 10

31

10

5

7

4

2

986

Page 11: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosElemento

Implementação:Elemento{

inteiro indice;

inteiro indice_do_pai;

Objeto outras_coisas;

construtor(inteiro indice){

this.indice = indice;

}

}

Page 12: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosConstrutor

Implementação:Criador_de_floresta (inteiro tamanho) {

//criacao da floresta

array = novo elemento[tamanho];

//estamos admitindo que o array inicia como se //todos os elementos fossem NULL

}

Page 13: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosMake Set

Implementação:

Criar_conjunto (elemento e) {

e.indice_do_pai = e.indice;

array[e.indice] = e;

}

Page 14: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosFind Set

Implementação:elemento procurar_representante (elemento e) {

Se (e.indice_do_representante == e.indice)

retorna e;

Senão

array[e.indice].indice_do_representante = procurar_representante (array[e.indice_do_representante]).indice;

retorna array[e.indice_do_representante];

}

Page 15: If672.ufpe@gmail.com Adriana Libório Fernandes Lins Arthur Cavalcanti Alem Átila Valgueiro Malta Moreira Flavio Juvenal da Silva Júnior Gustavo Cauê Silva

Representação de Conjuntos DisjuntosUnion

Implementação mais simples:

União (elemento a, elemento b) {

elemento representante_a = array[procurar_representante(a).indice];

elemento representante_b = array[procurar_representante(b).indice];

se (representante_a != representante_b)

array[representante_a.indice].indice_do_representante = representante_b.indice;

}