Você está na página 1de 22

Conjuntos

Estruturas de Dados 1 – 2023.1


Prof. Pedro Nuno Moura

Material adaptado da Profa. Adriana Alvim


Conceitos Básicos
 Conjunto de objetos de um mesmo tipo, sem ordem
 Por exemplo
 conjunto de inteiros
 Notação
 A = {1,2,3,4,5}, conjunto de elementos de 1 a 5
 Conjunto universo
 conjunto que contém todos os outros conjuntos do
problema sendo considerado

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Conceitos Básicos
 Notação
 Pertinência
 Subconjunto
 Subconjunto próprio de A
 há elementos de A que não pertencem ao subconjunto

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Operações Básicas
 Sejam os conjuntos
A = {1,2,3,4,5}, B = {3,4,5,6,7} e
U(Universo) = {1,2,3,4,5,6,7,8,9,10}
 União
 A  B = {1,2,3,4,5,6,7}
 Intersecção
 A  B = {3,4,5}
 Diferença
 A - B = {1,2}
 Complemento de A = {6,7,8,9,10}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Representação de conjuntos
 Existem diversas representações possíveis para
representar conjuntos finitos
 não existe método melhor
 a escolha depende das operações necessárias e do
tipo dos elementos do conjunto

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Representação de conjuntos
 Problema: subconjuntos dos elementos {1, …, n}
 usar um vetor [1.. n] de n elementos
 valor booleano para cada elemento
 pertence ou não pertence
 Operações
 Tornar conjunto vazio: tempo linear, proporcional a n
 Verificar pertinência: imediato, tempo constante
 Adicionar: imediato, tempo constante
 Remover: imediato, tempo constante
 Menor elemento: tempo linear, proporcional a n
 Testar se conjunto está vazio: tempo linear, proporcional
an

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Representação de conjuntos
 Mesmo problema
 com a exigência para verificar se o conjunto está vazio
em tempo constante
 Solução: guardar o número de elementos em uma
variável auxiliar
 Mesmo problema
 com a exigência de buscar o menor elemento em
tempo constante
 Solução: guardar também o menor elemento em uma
variável auxiliar

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Representação de conjuntos
 Problema
 os elementos do conjunto são inteiros
 sem limites (inferior e superior) de valor
 o número de elementos no conjunto não excede n
 o espaço de armazenamento (memória) é limitado em n
 usar um vetor [1, ..., n] de n posições onde são
armazenados k elementos distintos
 os elementos podem ser guardados em uma fila

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Representação de conjuntos
 (continuação)
 Operações
 Tornar conjunto vazio: tempo constante
 Cardinalidade: tempo constante
 Verificar pertinência: tempo linear, proporcional a n
 Adicionar (sabendo que não existe): imediato, tempo
constante
 Remover: tempo linear, proporcional a n
 Menor elemento: tempo linear, proporcional a n
 Testar se está vazio: tempo constante

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Exemplo
 Manutenção de elementos ordenados em lista
 aproveitar ordem nas operações de união e interseção

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj
public class Conj{

/* Classe auxiliar para guardar cada elemento do conjunto. */


private class Elo{
int dado;
Elo prox;

public Elo(){
prox = null;
}

public Elo(int elem){


dado = elem;
prox = null;
}

public Elo(int elem, Elo prox_elem){


dado = elem;
prox = prox_elem; }
}; Estruturas de Dados I - Pedro Nuno Moura - UNIRIO
Classe Conj (continuação)
private Elo prim;
public Conj(){
prim = null;
}

/* Função privada para realizar uma cópia de um outro conjunto. */


private void copia(Conj cj2){
Elo ult = null, q;

prim = null;
for (Elo p = cj2.prim; p != null; p = p.prox)
{
q = new Elo(p.dado);
if (ult == null)
prim = q;
else
ult.prox = q;
ult = q;
}
} Estruturas de Dados I - Pedro Nuno Moura - UNIRIO
Classe Conj (continuação)
/* Função privada para realizar uma cópia de um outro conjunto. */
public void apaga(){
for (Elo p = prim; p != null; p = prim){
prim = prim.prox;
}

/* Simula uma sobrecarga do operador de atribuição. */


public Conj atribui(Conj cj2){
if (this != cj2)
{
apaga();
copia(cj2);
}
return this;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj (continuação)
/* Testa se o conjunto está vazio. */
public boolean vazio(){
return prim == null;
}

/* Teste de pertinência. Usa fato de estar ordenado */


public boolean pertence(int valor){
Elo p;

for (p = prim; ((p != null) && (p.dado < valor)); p = p.prox);


if ((p == null) || (p.dado > valor)) return false;
return true;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj (continuação)
/* Inserção de elemento no conjunto. Usa fato de estar ordenado.
Retorna false se elemento já estava lá. */
public boolean insere(int valor){
Elo p = prim, ant = null;

for (p = prim; (p != null); p = p.prox){


if (p.dado == valor) return false;
if (p.dado > valor) break;
ant = p;
}
Elo q = new Elo(valor);
if (p == prim)
prim = q;
else
ant.prox = q;
q.prox = p;
return true;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj (continuação)
/* Remoção de elemento do conjunto. Usa fato de estar ordenado.
Retorna false se elemento não estava lá. */
public boolean remove(int valor){
Elo p = prim, ant = null;

for (p = prim; (p != null); p = p.prox){


if (p.dado > valor) return false;
if (p.dado == valor) break;
ant = p;
}
if (p == null) return false;
if (p == prim)
prim = prim.prox;
else
ant.prox = p.prox;

p = null;
return true;
}
Estruturas de Dados I - Pedro Nuno Moura - UNIRIO
Considerações
 A operação de união de conjuntos é implementada no
seguinte método

public void uniao(Conj cj2) (...)

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj (continuação)
/* Método para união de conjuntos. Une conjunto com cj2 e retorna novo conjunto com a
união. Usa fato de conjuntos estarem ordenados e percorre as listas em paralelo. */
public Conj uniao(Conj cj2) {
Elo q, p1 = prim, p2 = cj2.prim, ult = null;
Conj uniao = new Conj();
while ( (p1 != null) || (p2 != null) ){
if ( (p1 != null) && ( (p2 == null) || (p1.dado < p2.dado))){
q = new Elo(p1.dado);
p1 = p1.prox;
}
else {
q = new Elo(p2.dado);
if ((p1 != null) && (p1.dado == p2.dado))
p1 = p1.prox;
p2 = p2.prox;
}
if (ult == null)
uniao.prim = q;
else
ult.prox = q;
ult = q;
}
return uniao;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj (continuação)
/* Método para união de conjuntos. Outra implementação. Menos eficiente que a
primeira. */
public Conj uniao(Conj cj2){
Elo p1 = prim, p2 = cj2.prim;
Conj uniao = new Conj();

while ( p1 != null ){
uniao.insere(p1.dado);
p1 = p1.prox;
}
while ( p2 != null ){
if ( ! uniao.pertence(p2.dado) )
uniao.insere(p2.dado);
p2 = p2.prox;
}
return uniao;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Classe Conj (continuação)
/* Retorna cardinalidade do conjunto */
public int tamanho() {
int tam = 0;
Elo p;

for(p = prim; p != null; p = p.prox)


tam++;
return tam;
}

/* Imprime todos os elementos do conjunto */


public void imprime() {
Elo p;
System.out.println("Elementos do conjunto");
for(p = prim; p != null; p = p.prox)
System.out.print(p.dado + “ ”);
System.out.println();
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Exercícios
 Adicione os seguintes métodos à classe:
 Diferença
 Teste se um conjunto é um subconjunto de outro
 Teste se um conjunto é igual ao outro
 Testa se um conjunto é um subconjunto próprio

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Referências
 Este material foi produzido baseado no material do
curso de ED1 oferecido pelo Prof. Ângelo Ciarlini e
disponível em
 http://www.uniriotec.br/~angelo.ciarlini/edd1/material_di
datico.htm

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO

Você também pode gostar