O conceito de conjuntos é um conceito útil e uma noção geral que figura como tipo de dados-padrão em algu- mas linguagens de programação, tais como Pascal e Modula-2. Nessas linguagens o conjunto universo S pre- cisa ser especificado e então as variáveis que representam subconjuntos de S, isto é, elementos de , po- dem ser definidas. Existe um limite de tamanho para o conjunto universo de forma que os elementos de não podem ser arbitrariamente grandes; além disso, o conjunto universo precisa ser enumerável ou contável em uma determinada ordem, como uma seqüência.
A declaração de tipo Pascal a seguir define o conjunto universo Alfabeto e como o conjunto de todos os carac- teres do teclado, tais como A, X, 7 e %.
type
Alfabeto = set of char;
Agora, subconjuntos de Alfabeto podem ser definidos como variáveis no programa, através de declarações como
var
Iniciais : Alfabeto; Letras : Alfabeto;
e as atribuições a seguir seriam válidas para essas variáveis:
Iniciais : = ['A' . . 'F']; Letras := ['C . . 'G'];
onde os pontos indicam uma seqüência na ordem de enumeração que, neste caso, é a alfabética. (Em Pascal são usados colchetes no lugar de chaves para denotar os conjuntos.)
Após a atribuição acima, Iniciais tem o valor {A, B, C, D, E, F} e Letras tem o valor {C, D, E, F, G}. A ordem de enumeração é conveniente para a definição de quais são os elementos de um conjunto, mas como eles são conjuntos, a ordem dos elementos não é importante, e a atribuição
Iniciais := ['B', 'A', 'D', 'F' 'E', 'C'];
dá o mesmo valor a Iniciais que a atribuição anterior. Como um conjunto não é ordenado, não podemos refe- renciar elementos individuais do conjunto; portanto, não podemos dizer "o terceiro elemento" do conjunto
Iniciais. •
As expressões condicionais podem ser formadas pela comparação das variáveis do tipo conjunto A e B da seguinte maneira:
Sintaxe de Programação Semântica (Significado)
A=B A<>B A< = B A> = B
Finalmente, as operações de união, interseção e diferença são oferecidas pelos operadores +, * e —, respectivamente. O conteúdo de uma variável conjunto A pode ser construído dinamicamente durante a exe- cução do programa, iniciando-se A como um conjunto vazio, e então realizando uniões de A com conjuntos com um único elemento, a fim de incluir esses elementos em A.
Após as atribuições do Exemplo 19 a Iniciais e Letras, encontre os seguintes conjuntos:
PRÁTICA 20
a. Iniciais * Letras b. Iniciais — Letras c. Iniciais + Letras d. Letras + ['Q'] •
Uma linguagem de programação, chamada SETL (de set /anguage — linguagem de conjuntos), dá ênfa- se à manipulação de conjuntos para a realização de tarefas relacionadas à programação. A SETL inclui con- juntos e n-uplas como tipos de dados básicos. Além do conjunto usual de operações entre conjuntos, novos conjuntos podem ser formados a partir dos primeiros através do uso de tipos de descrições teóricas de conjun- tos que temos empregado nesta seção.
Dado um conjunto S de inteiros, novos conjuntos podem ser criados em SETL por descrições semelhantes às seguintes:
EXEMPLO 20
•
Se o conjunto não for fornecido como um tipo de dados básico em uma linguagem de programação, então o programador pode implementar as idéias de conjuntos teóricos, implementando um tipo abstrato de dados para "conjuntos". Um tipo abstrato de dados é nada mais do que um modelo mental de uma coleção de
Seção 3.1 Conjuntos 109 itens relacionados, juntamente com as operações apropriadas a serem realizadas entre instâncias dessas cole- ções. Neste caso, o modelo mental é um conjunto, e as operações apropriadas são as operações entre conjun- tos, tais como a união, interseção e complemento. O programador deve usar as facilidades fornecidas pela lin- guagem para simular os conjuntos e as operações que não forem fornecidas.
Uma forma comum de representação de conjuntos é através de um vetor, sendo cada elemento uma en- trada desse vetor. Isto limita o número de elementos do conjunto; isto é, o conjunto universo não pode exceder o tamanho do vetor. Isto também impõe uma ordem artificial aos elementos do conjunto. Operações de con- juntos, tais como a união e interseção, são realizadas através de manipulações do vetor.
Suponha que o conjunto universo S seja S = {1, 2, 3, 4, 5}. Então um vetor de cinco elementos comporta qualquer elemento de O conjunto A = {1,4}, por exemplo, pode ser representado pelo vetor
EXEMPLO 21
Apenas as duas primeiras entradas do vetor são itens válidos. Pode ser mantida uma variável separada que contenha um contador do número de entradas válidas. • Outra representação para conjuntos impõe uma ordem para o conjunto universo e então usa um vetor de bits, um vetor de Os e ls, para denotar quais elementos do conjunto universo estão presentes ou ausentes ao subconjunto.
Usando a ordenação natural de S do Exemplo 21, o subconjunto A = {1,4} poderia ser representado pelo vetor de bits
EXEMPLO 22
• A representação em vetores de bits torna as operações de conjuntos mais simples de serem implementadas. A união é realizada através do OU dos componentes de ambos os vetores, e a interseção é feita através do E. Encontre o vetor de bits que representa o complemento do conjunto do Exemplo 22. •
Uma outra possibilidade é usar listas encadeadas para representar conjuntos. Uma lista encadeada é uma lista de dados com "ponteiros" que conectam cada item da lista ao seguinte. Um ponteiro nulo (um pon- teiro que aponta para lugar algum) marca o fim da lista. Algumas linguagens de programação, tais como Pas- cal, oferecem um tipo de dado de ponteiro; em outras linguagens, ponteiros precisam ser simulados usando os recursos da linguagem de programação.
A representação através de uma lista encadeada apresenta a vantagem de não impor uma limitação a
priori no tamanho do conjunto, mas continua a impor uma ordem em seus elementos. As operações entre os
conjuntos são realizadas através de varredura, comparação, inserção e deleção nas listas encadeadas. O subconjunto A = {1,4} pode ser representado pela lista encadeada mostrada na figura abaixo, onde o ponto representa o ponteiro nulo.
PRÁTICA 21
EXEMPLO 23
•