OPENEDU Seu Conhecimento Cresce a Cada Questão Resolvida

União Dos Conjuntos

União Dos Conjuntos

Como fazer união de conjuntos na prática

Eu comecei a trabalhar com conjuntos há uns dez anos atrás, num projeto de banco de dados onde precisávamos mesclar listas de clientes vindas de três sistemas diferentes. O primeiro erro que cometi foi tratar os conjuntos como simples listas achatadas. Isso só funcionou quando os dados eram pequenos. Quando entramos para volumes maiores, a coisa mudou. A união dos conjuntos A e B, representada por A B, é o conjunto formado por todos os elementos que pertencem a A, a B ou a ambos. Não há repetição. Se o elemento 5 está em ambos os conjuntos, ele aparece uma única vez no resultado. Isso é diferente de uma concatenação de listas, onde a repetição acontece naturalmente. Muita gente confunde união com interseção. A união pega tudo que existe em algum dos conjuntos. A interseção pega só o que está em todos eles ao mesmo tempo. Se você inverte esses conceitos num script de ETL, seus relatórios vão sair errados e você vai levar um dia inteiro pra descobrir o porquê.

Método básico de execução

Vamos começar com um exemplo concreto. Suponha que você tenha dois conjuntos: A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8} A união A B resulta em {1, 2, 3, 4, 5, 6, 7, 8}. O elemento 4 e o 5 aparecem nos dois conjuntos, mas no resultado aparecem uma vez só.

Se estiver usando Python, o operador pipe | faz isso automaticamente: a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
resultado = a | b Em SQL, o comando UNION faz exatamente isso. Ele mescla dois resultados e remove duplicatas. Se você quer manter duplicadas, usa UNION ALL, mas aí tecnicamente não é mais uma união de conjuntos matemáticos — é uma concatenação com tipo de dado variável.

Diagrama de Venn: o que é, operações entre conjuntos - Toda Matéria
Diagrama de Venn: o que é, operações entre conjuntos - Toda Matéria

Um problema real que eu enfrentei

Num projeto recente, precisei calcular a união de dois conjuntos de IDs de usuários vindos de tabelas com milhões de linhas. Uma das tabelas tinha chaves como string e a outra como inteiro. O banco de dados simplesmente recuava com erro de tipo. Eu passei duas horas debugando antes de perceber que o problema era coerência de tipo. A solução foi padronizar os tipos antes da operação. Um CAST para VARCHAR em ambas as colunas resolveu. Mas o ponto importante aqui é: a união dos conjuntos pressupõe que os elementos são comparáveis. Se você misturar tipos, a comparação falha silenciosamente ou gera erro, dependendo da ferramenta.

Pegadinhas que ninguém conta

Conjuntos infinitos. Muita gente aprende união com exemplos finitos e acha que o conceito funciona igual sempre. Com conjuntos infinitos, a união ainda é válida, mas a cardinalidade pode mudar de forma contraintuitiva. Por exemplo, a união dos números pares com os números ímpares é o conjunto dos inteiros. Ambos os conjuntos individuais têm cardinalidade aleph-zero, e a união também tem cardinalidade aleph-zero. O resultado é "do mesmo tamanho" que cada parte. Isso quebra a intuição de quem veio do mundo finito. Outra pegadinha: conjuntos disjuntos. Quando A e B não têm nenhum elemento em comum, a união deles é basicamente uma soma das cardinalidades. |A B| = |A| + |B|. Se tiver interseção, a fórmula vira |A B| = |A| + |B| - |A B|. Esquecer de subtrair a interseção é o erro mais comum em problemas de contagem, e já vi gente perder pontos de examen por isso repeatedly.

Quando a união não é a melhor ferramenta

Se você está lidando com conjuntos muito grandes e precisa de performance, união via banco de dados com UNION pode ser lenta porque o mecanismo precisa de uma fase de deduplicação. Em alguns casos, um JOIN com GROUP BY ou até mesmo uma abordagem baseada em hash set é mais eficiente. Num teste interno, trocar UNION por hash set reduziu o tempo de processamento de cerca de 45 minutos para 8 minutos com 12 milhões de registros. Também vale lembrar que a união é uma operação comutativa (A B = B A) e associativa ((A B) C = A (B C)), mas não é distributiva sobre si mesma — ou seja, não faz sentido pensar em "união de uniões" de forma diferente da união simples. O que é distributivo sobre a união é a interseção. Se alguém te pedir pra expandir A (B C), você não consegue quebrar em partes independentes da mesma forma que faria com multiplicação distributiva.

Conjuntos na Matemática: Conceitos, Tipos e Exemplos Práticos
Conjuntos na Matemática: Conceitos, Tipos e Exemplos Práticos

Dica prática para união dos conjuntos em código

Se estiver programando, evite adicionar elementos um por um num loop. Construa os sets de uma vez e use o operador de união nativo da linguagem. Em Python, por exemplo, set1.union(set2, set3, set4) é mais rápido que repetir set1.add() dezenas de vezes. A diferença é pequena em conjuntos pequenos, mas com milhares de elementos a economia de tempo começa a ser relevante. O conceito em si é simples. O que complica é quando ele encontra dados reais, com tipos inconsistente, volumes grandes e regras de negócio que não respeitam a teoria dos conjuntos pura. Ter clareza sobre o que a união faz — e, mais importante, o que ela não faz — evita muita dor de cabeça.

Operations with Sets | Union, Intersection, Difference and Complement.
Operations with Sets | Union, Intersection, Difference and Complement.