Вы находитесь на странице: 1из 12

INF 1010

Estruturas de Dados Avanadas


Conjuntos (Sets)

07/04/16

2012 DI, PUC-Rio Estruturas de Dados Avanadas 2012.2

Uma interface geral


#ifndef SET_H
#define SET_H
#typedef struct _set Set;
void set_init(Set*set, int (*match)(const void *key1, const void *key2),
void (*destroy)(void *data));
Set* set_destroy(Set* set);
int set_insert(Set *set, const void *data);
int set_remove(Set *set, void **data);
int set_union(Set *setu, const Set *set1, const Set *set2);
int set_intersection(Set *seti, const Set *set1, const Set *set2);
int set_difference(Set *setd, const Set *set1, const Set *set2);
int set_is_member(const Set *set, const void *data);
int set_is_subset(const Set *set1, const Set *set2);
int set_is_equal(const Set *set1, const Set *set2);
int set_size(Set* set);
#endif

07/04/16

2011 DI, PUC-Rio Estruturas de Dados Avanadas 2011.1

Implementaes

Listas

rvores

Hash

etc

Um caso particular muito eficiente a seguir.


07/04/16

2010 DI, PUC-Rio Estruturas de Dados Avanadas 2010.1

Conjuntos como vetor de bits


supondo conjuntos de at 8 elementos
C = {a,b,c,d,e,f,g,h}

cada elemento mapeado para um bit


b7

b6

b5

b4

b3

b2

b1

b0

cada conjunto pode ser representado por um byte,


ligando os bits correspondentes a cada elemento
M = {a,d,e,f}

07/04/16

0011 1001

b7

b6

b5

b4

b3

b2

b1

b0

2010 DI, PUC-Rio Estruturas de Dados Avanadas 2010.1

Conjuntos como vetor de bits


(at 4 elementos)

Operadores sobre bits


(bitwise operators)
&

AND

OR

XOR

&

>>

deslocamento bit a bit para a direita

<<

deslocamento bit a bit para a esquerda

07/04/16

~ complemento

2010 DI, PUC-Rio Estruturas de Dados Avanadas 2010.1

Pertence?

b7

b6

b5

b4

b3

b2

b1

b0

verificar se um elemento e pertence a um conjunto C =


verificar se o bit correspondente a e est ligado
representao(C) & mscara(e)

representao(C) & mscara(e)

exemplo
d

C?

representao de C = {a,d,e,f}:
mscara(d):

0011 1001

& 0000 1000


0000 1000

07/04/16

2010 DI, PUC-Rio Estruturas de Dados Avanadas 2010.1

Como construir uma mscara ?


mscara para o bit i
1. inicia com 1
2. desloca os bits para a esquerda, i vezes
m = 1 << i;

mscara para d (bit 3)


m = 1 << 3;
m

0000 1000

b7 b6 b5 b4 b3 b2 b1 b0
h

Como inserir um elemento num conjunto?

ligando o bit correspondente


conjunto OR mscara(bit)

exemplo

b7 b6 b5 b4 b3 b2 b1 b0
h

C|d

C = {a,b}
C = C U {d}
C = C | d;

Unio de conjuntos

conjuntoA OR conjunto B
exemplo
A = {a,c,d,f}

b7 b6 b5 b4 b3 b2 b1 b0
h

A|B

B = {b,c,d}
C=AUB
C = {a,b,c,d,f}
C = A | B;

Interseo de conjuntos

conjuntoA AND conjunto B


exemplo
A = {a,c,d,f}

b7 b6 b5 b4 b3 b2 b1 b0
h

A&B

B = {b,c,d}
C=A B
C = {c,d}
C = A & B;

Complemento

C = ~A;
exemplo
A = {a,c,d,f}

b7 b6 b5 b4 b3 b2 b1 b0
h

~A

~A = {b,e,g,h}