Upload
stella-formoso
View
213
Download
0
Embed Size (px)
Citation preview
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
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.
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
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.
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
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.
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
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
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.
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
Representação de Conjuntos DisjuntosElemento
Implementação:Elemento{
inteiro indice;
inteiro indice_do_pai;
Objeto outras_coisas;
construtor(inteiro indice){
this.indice = indice;
}
}
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
}
Representação de Conjuntos DisjuntosMake Set
Implementação:
Criar_conjunto (elemento e) {
e.indice_do_pai = e.indice;
array[e.indice] = e;
}
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];
}
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;
}