Based on the idea that a zipped file is a new binnary file, why I can't reduce it's size by zipping it again and successively up to a very small file?
Como a compactação funciona com base na localização de padrões e na redução de dados semelhantes.
Por exemplo, RLE (Codificação de comprimento de execução) é um método de compactação simples em que os dados são examinados e executados de dados semelhantes são compactados da seguinte forma:
AAABCEEEJFFYYYYYYYYYYOOAAAAGGGGGAAA
becomes
3ABC3EJ2F10YOO4A5G3A
Como você pode ver, substituindo dados repetidos apenas pelos dados e uma contagem de quantas vezes isso ocorre, você pode reduzir esse exemplo específico de 35 bytes para 20 bytes. Isso não é uma redução enorme , mas ainda é 42% menor. Além disso, este é um pequeno exemplo inventado; exemplos maiores e reais poderiam ter uma compactação ainda melhor. (O OO
foi deixado sozinho porque substituí-lo por 2O
não salvaria nada.)
Os arquivos de texto geralmente são muito bem compactados porque tendem a ter muitos padrões que podem ser compactados. Por exemplo, a palavra a é muito comum em inglês, então você pode soltar todas as instâncias da palavra com um identificador que é apenas um byte (ou até menos). Você também pode compactar mais com partes de palavras semelhantes como cAKE
, bAKE
, shAKE
, undertAKE
e assim por diante.
Então, por que você não pode compactar um arquivo que já está compactado? Porque quando você fez a compactação inicial, você removeu os padrões .
Veja o exemplo de RLE comprimido. Como você pode comprimir isso ainda mais? Não há execuções de dados idênticos para compactar. Na verdade, quando você tenta compactar um arquivo que já está compactado, pode acabar com um arquivo maior . Por exemplo, se você forçou o exemplo acima a ser recodificado, pode acabar com algo parecido com isto:
131A1B1C131E1J121F11101Y2O141A151G131A
Agora, os dados de compactação (as contagens de execução) estão sendo tratados como dados, então você acaba com um arquivo maior do que começou.
O que você poderia tentar é usar um algoritmo de compressão diferente porque é possível que a saída de um algoritmo de compactação possa ser primo para um algoritmo diferente, mas isso geralmente é pouco provável.
Naturalmente, isso é tudo sobre compactação sem perdas , em que os dados descompactados devem ser exatamente idênticos aos dados originais. Com a compactação com perdas , geralmente é possível remover mais dados, mas a qualidade diminui. Além disso, a compactação com perdas normalmente usa algum tipo de esquema baseado em padrões (ele não somente descarta os dados), de modo que você acabará alcançando um ponto em que simplesmente não há padrões para localizar.