Featured image of post Sem perder uma única letra, por que é possível diminuir o tamanho de um arquivo?: Princípios e limites da compressão sem perdas

Sem perder uma única letra, por que é possível diminuir o tamanho de um arquivo?: Princípios e limites da compressão sem perdas

Do princípio da casa dos pombos que prova a impossibilidade da compressão universal até a entropia de Shannon e o teorema da codificação de fonte, desigualdade de Kraft-McMillan, Huffman, codificação aritmética, Sistemas Numéricos Assimétricos (ANS / Zstandard), LZ77, DEFLATE e a transformada de Burrows-Wheeler.

1. O princípio da casa dos pombos: por que não existe um compressor universal capaz de encolher todos os arquivos

Quando utilizamos diariamente ferramentas como zip, gzip, zstd, 7z ou PNG para reduzir documentos, código-fonte ou imagens a uma fração do tamanho original e, ao descomprimi-los, recuperamos cada bit com exatidão absoluta (compressão sem perdas / reversível), surge um questionamento intuitivo: se um compressor diminui o tamanho de um arquivo, por que não comprimimos o arquivo .zip resultante dez vezes seguidas até reduzir qualquer filme ou banco de dados a apenas 1 byte?

A resposta é definitiva: isso é matematicamente impossível. A prova decorre diretamente do princípio da casa dos pombos (Pigeonhole Principle) da combinatória elementar.

Seja $E: \{0,1\}^* \to \{0,1\}^*$ uma função de codificação sem perdas e $D: \{0,1\}^* \to \{0,1\}^*$ sua função de decodificação. Para garantir reversibilidade perfeita $D(E(x)) = x$ para qualquer sequência binária $x$, a função $E$ deve ser obrigatoriamente injetora (um para um): se dois arquivos distintos $x_1 \ne x_2$ fossem comprimidos na mesma sequência curta $y = E(x_1) = E(x_2)$, o decodificador jamais saberia se deve restaurar $x_1$ ou $x_2$.

Existem exatamente $2^N$ arquivos binários de comprimento $N$ bits, mas o número total de cadeias binárias estritamente menores que $N$ bits (de comprimento $0$ até $N-1$) é:

$$\sum_{k=0}^{N-1} 2^k = 2^N - 1 < 2^N$$

Como há $2^N$ arquivos de entrada («pombos») para apenas $2^N - 1$ cadeias mais curtas («casas»), qualquer algoritmo de compressão sem perdas que encolha pelo menos um arquivo DEVE necessariamente expandir outros! Mais ainda, a fração de arquivos de $N$ bits que podem ser encolhidos em pelo menos $c$ bits é limitada por:

$$P\bigl(|E(X)| \le N - c\bigr) < 2^{-(c-1)}$$

Quase todas as sequências binárias aleatórias são algoritmicamente incompressíveis. Nossos compressores funcionam tão bem na prática porque textos humanos, códigos-fonte e imagens naturais ocupam um subconjunto minúsculo, altamente estruturado e de baixa entropia dentro de $\{0,1\}^N$.


2. O teorema da codificação de fonte de Shannon e a entropia: o limite físico absoluto

Em 1948, Claude E. Shannon estabeleceu em «A Mathematical Theory of Communication» o limite fundamental da compressão de dados. Para uma fonte discreta sem memória que emite símbolos de um alfabeto $\mathcal{A} = \{s_1, \dots, s_m\}$ com probabilidades $P = (p_1, \dots, p_m)$, a autoinformação (Surprisal) de um símbolo $s_i$ e seu valor esperado, a entropia de Shannon $H(X)$, são definidos por:

$$I(s_i) = -\log_2 p_i, \qquad H(X) = -\sum_{i=1}^{m} p_i \log_2 p_i \quad (\text{bits por símbolo})$$

Todo código livre de prefixo (instantâneo) com comprimentos de palavra $\ell_1, \dots, \ell_m$ deve satisfazer a desigualdade de Kraft-McMillan:

$$\sum_{i=1}^{m} 2^{-\ell_i} \le 1$$

Pela não negatividade da divergência de Kullback-Leibler $D_{\text{KL}}(P \,\|\, Q) \ge 0$ com $q_i = 2^{-\ell_i}/Z$ ($Z = \sum 2^{-\ell_i} \le 1$), demonstra-se o teorema da codificação de fonte sem ruído de Shannon para o comprimento médio $L = \sum_{i=1}^m p_i \ell_i$:

$$L - H(X) = \sum_{i=1}^m p_i \log_2 \frac{p_i}{2^{-\ell_i}} = D_{\text{KL}}(P \,\|\, Q) + \log_2 \frac{1}{Z} \ge 0 \implies H(X) \le L < H(X) + 1$$
  flowchart TD
    A["Fluxo de dados original (Texto / Imagem / Binário)"] --> B["Etapa 1: Transformação e modelagem por dicionário (BWT / LZ77)"]
    B --> C["Distribuição de probabilidade P(s) de símbolos e ponteiros (distância, comprimento)"]
    C --> D["Etapa 2: Codificação de entropia estatística (Huffman / Aritmética / ANS)"]
    D --> E["Fluxo de bits compacto próximo ao limite de Shannon N·H(X)"]

3. Três gerações de codificação de entropia: Huffman, Codificação Aritmética e ANS

3.1 Codificação de Huffman (1952): árvores de prefixo ótimas com comprimentos inteiros

O algoritmo guloso de David A. Huffman constrói em tempo $O(m \log m)$ a árvore livre de prefixo ótima fundindo iterativamente os dois símbolos menos prováveis. Sua limitação estrutural é que cada palavra de código deve ter um número inteiro de bits ($\ell_i \ge 1$): um símbolo com probabilidade $p_1 = 0,99$ carrega apenas $-\log_2(0,99) \approx 0,0145\,\text{bit}$ de informação, mas consome no mínimo $1\,\text{bit}$ inteiro.

3.2 Codificação Aritmética (Arithmetic / Range Coding): bits fracionários

A codificação aritmética (Rissanen, Pasco, Witten et al.) supera a barreira inteira mapeando toda a sequência da mensagem $x_1 x_2 \dots x_N$ em um único subintervalo $[L_{\text{low}}, H_{\text{high}}) \subset [0, 1)$ cuja largura final $\Delta = \prod_{t=1}^N P(x_t)$ exige apenas $\lceil -\log_2 \Delta \rceil + 1 \approx N \cdot H(X)$ bits, alcançando bits fracionários ao custo de multiplicações sequenciais mais lentas.

3.3 Sistemas Numéricos Assimétricos (ANS, Jarek Duda 2009–2014)

Criados pelo físico e cientista da computação polonês Jarek Duda, os Asymmetric Numeral Systems (tANS e rANS) unem a taxa de compressão ótima da codificação aritmética com a velocidade de tabela de busca de Huffman. Ao codificar um símbolo $s$ de probabilidade $p_s$ no estado inteiro $x \in \mathbb{N}$, o estado evolui segundo:

$$C(x, s) \approx \frac{x}{p_s}$$

Hoje o ANS é o coração do Zstandard (zstd) da Meta, do LZFSE da Apple e do JPEG XL do Google.


4. Compressão por dicionário e transformações: LZ77, DEFLATE, BWT e «Comprimir é prever»

Para explorar a repetição de substrings e o contexto sequencial, os compressores modernos combinam modelagem por dicionário com codificadores de entropia:

  • LZ77 (Lempel & Ziv, 1977): substitui substrings repetidas dentro de uma janela deslizante por ponteiros retroativos (distance, length). Combinado com Huffman, forma o DEFLATE (gzip, zip, PNG); combinado com ANS, forma o Zstandard (zstd).
  • Transformada de Burrows-Wheeler (BWT, 1994, bzip2): ordena lexicograficamente todas as rotações cíclicas de um bloco e extrai a última coluna $L$, agrupando caracteres com contexto subsequente idêntico para compressão via Move-To-Front (MTF) e Run-Length Encoding (RLE).
  flowchart TD
    A["Fluxo de bytes de entrada"] --> B["Busca da correspondência mais longa na janela deslizante (LZ77)"]
    B --> C{"Comprimento da correspondência >= 3?"}
    C -- "Sim" --> D["Emitir ponteiro retroativo (distance, length)"]
    C -- "Não" --> E["Emitir byte literal original (Literal)"]
    D --> F["Codificação de entropia via Huffman (DEFLATE) ou ANS (Zstandard)"]
    E --> F
Algoritmo / FerramentaDicionário / TransformaçãoCodificador de entropiaTaxa de compressão típicaVelocidade de descompressãoAplicações industriais principais
lz4LZ77 alinhado a bytesNenhum (fluxo de bytes direto)$\sim 48\%$$\sim 4.000\,\text{MB/s}$Compressão de RAM (ZRAM), bancos de dados em tempo real
gzip (DEFLATE)LZ77 (janela de 32 KB)Codificação de Huffman$\sim 32\%$$\sim 400\,\text{MB/s}$Tráfego web HTTP, .tar.gz, imagens PNG
zstd (Zstandard)LZ77 (janela grande + cache de offsets)ANS (tANS / FSE) + Huffman$\sim 28\%$$\sim 1.500\,\text{MB/s}$Pacotes Linux, armazenamento em nuvem, Btrfs
bzip2Ordenação de blocos BWT + MTF + RLEHuffman multitabela$\sim 26\%$$\sim 60\,\text{MB/s}$Arquivos de código-fonte, bioinformática
xz (LZMA2)LZ77 (dicionário gigante + contexto bit)Codificação aritmética de intervalo$\sim 21\%$$\sim 120\,\text{MB/s}$Distribuição de software de tamanho mínimo, firmware
cmix / PAQ8 / LLMMistura de contextos / TransformerCodificação aritmética$\sim 11\%\text{–}14\%$$< 1\,\text{MB/s}$Hutter Prize, equivalência entre compressão e IA

No sentido matemático mais profundo, comprimir é exatamente equivalente a prever: qualquer modelo probabilístico (incluindo grandes modelos de linguagem Transformer) que minimize a entropia cruzada $-\sum \log_2 P_\theta(x_t \mid x_{

comments powered by Disqus