Módulo 2 · Matemática discreta e combinatória

Conjuntos, relações e funções

Aula 2.1 · cerca de 15 minutos

Conjuntos são coleções sem ordem e sem repetição, como o set do Python. As operações básicas têm tradução direta para código:

A ∪ B   união          a | b
A ∩ B   interseção     a & b
A \ B   diferença      a - b
A △ B   dif. simétrica a ^ b
|A|     cardinalidade  len(a)

Relações

Uma relação entre A e B é um subconjunto de A × B. Uma tabela de junção no banco de dados (usuario_id, grupo_id) é literalmente uma relação. Relações de equivalência (reflexiva, simétrica, transitiva) dividem o conjunto em classes: é o que a estrutura Union-Find mantém.

Funções

Uma função f: A → B associa cada elemento de A a exatamente um de B. Ela é injetora se não repete saídas, sobrejetora se atinge todo B e bijetora se é as duas coisas. Toda função de hash de um domínio grande para um pequeno deixa de ser injetora: colisões são inevitáveis.

Dica: Princípio da casa dos pombos: se n + 1 itens vão para n gavetas, alguma gaveta recebe dois. É a prova de que nenhum compressor sem perdas consegue encurtar todos os arquivos.
def e_equivalencia(rel, universo):
    reflexiva = all((a, a) in rel for a in universo)
    simetrica = all((b, a) in rel for (a, b) in rel)
    transitiva = all((a, d) in rel
                     for (a, b) in rel for (c, d) in rel if b == c)
    return reflexiva and simetrica and transitiva

Exercício 1

Quantas funções existem de um conjunto com 3 elementos para um com 4? Quantas são injetoras?

Exercício 2

Por que um encurtador de URL com códigos de 6 caracteres [a-z0-9] tem colisões se usar hash em vez de contador?