Trabalhar com conjuntos de números no dia a dia
A maioria das pessoas aprende conjuntos na escola e acha que é só coisa de diagrama de Venn. Na prática, quando você começa a manipular grandes volumes de dados, perceber a diferença entre união, interseção e diferença absoluta costuma ser a linha entre um script que roda em segundos e um que gasta horas. Eu já vi gente perder dia inteiro porque não tinha clareza sobre como remover duplicatas de forma eficiente quando os dados vinham de fontes diferentes. O problema real aparece quando você precisa cruzar listas que não seguem o mesmo formato. Um vem como array, outro como lista encadeada, um terceiro tem números repetidos e outros têm gap entre os valores. Sem entender o básico de teoria dos conjuntos aplicada, o código fica ilegível e lento.
ao se trabalhar com conjuntos de numeros é importante
começar pelo objetivo. Qual é a operação que você realmente precisa? União significa juntar tudo sem repetir. Interseção pega só o que aparece nos dois lados. Diferença A menos B mostra o que existe em A mas não em B. Simples na teoria, complicado na hora de implementar quando os tipos de dados não batem. No meu caso, trabalhando com análise de vendas, precisei comparar listas de clientes de dois sistemas que usavam formatos diferentes. Um tinha CPF como string, outro como inteiro. A interseção direta falhava porque os tipos não conversavam. A solução foi normalizar tudo para string formatada antes de aplicar qualquer operação de conjunto. Isso cortou o tempo de processamento de 45 minutos para cerca de 3 segundos num dataset de 200 mil registros.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Outro ponto que poucos explicam: a complexidade algorítmica muda drasticamente dependendo da estrutura escolhida. Listas normais dão O(n²) na interseção. Sets ou hash tables reduzem para O(n). Se você tá lidando com mais de mil elementos, essa diferença é a coisa que mais importa no seu código. Também tem a questão da identidade dos elementos. Números float podem parecer iguais mas ter representação binária diferente. 1.1 + 2.2 não é exatamente 3.3 na maioria das linguagens. Quando você usa conjuntos com valores decimais, a interseção pode falhar silenciosamente. A workaround que uso é arredondar para uma casa decimal relevante antes de inserir no set, ou usar decimais exatos se o domínio permitir.
Outro erro comum é confundir diferença simétrica com diferença simples. Diferença simétrica A sim B pega tudo que está em A ou B mas não nos dois. É útil quando você quer achar divergências entre duas lists. Mas se você quer saber o que saiu de A, usa diferença simples A menos B. Misturar esses dois conceitos já me custou umas duas noites de sono corrigindo relatórios que não fechavam. Se você tá começando agora, recomendação prática: use as estruturas nativas da linguagem. Python tem set, Java tem HashSet, JavaScript tem Set desde 2015. Não reinvente a roda com loops aninhados. A menos que você tenha motivo muito específico pra fazer customizado, as implementações padrão são otimizadas e testadas há anos.
Para quem quer aprofundar, o livro "Concrete Mathematics" do Knuth tem capítulos sólidos sobre combinações e conjuntos aplicados a computação. Não é leitura divertida, mas é referênclia quando você precisa justificar pro chefe por que determinado algoritmo é mais rápido que outro. Se o seu caso envolve conjuntos muito grandes tipo milhões de elementos, considerar estruturas bitmap ou até processamento paralelo pode fazer sentido. Mas aí você já tá num nível diferente, e o custo de implementação precisa justificar o ganho de performance. Na maioria dos casos de uso comum, um set bem usado resolve.