Existe um máximo conhecido de quanto uma cadeia de 0 e 1 pode ser compactada?

38

Há muito tempo, li um artigo de jornal em que algum tipo de professor disse que, no futuro, poderemos comprimir dados em apenas dois bits (ou algo assim).

É claro que isso não está correto (e pode ser que minha memória do que ele exatamente tenha declarado não esteja correta). Compreensivelmente, não seria prático compactar qualquer sequência de 0 e 1 para apenas dois bits porque (mesmo que fosse tecnicamente possível), muitos tipos diferentes de cadeias acabariam comprimindo para os mesmos dois bits (já que temos apenas 01 'e' 10 'para escolher).

Enfim, isso me fez pensar sobre a viabilidade de compactar uma sequência arbitrária de 0 e 1 de acordo com algum esquema. Para esse tipo de string, existe uma relação conhecida entre o comprimento da string (a relação entre 0 e 1 provavelmente não importa) e a compressão máxima?

Em outras palavras, existe uma maneira de determinar qual é o comprimento mínimo (menor possível) em que uma cadeia de 0 e 1 pode ser compactada?

(Aqui estou interessado na compressão máxima matemática, não no que é tecnicamente possível no momento.)

x457812
fonte
7
Também teríamos '00' e '11' para escolher. Mas o argumento é o mesmo; se você usá-los, existem apenas quatro cadeias diferentes que podem ser compactadas.
RemcoGerlich 28/11
3
mathoverflow.net/q/160099/34859 : Veja aqui que vide o princípio do buraco de pombo sempre haverá um número infinito de strings que não podem ser compactadas ... Independentemente do algoritmo usado. (Veja a seção intitulada 'Background' em a questão
ARi
4
A compactação depende do conhecimento que você tem sobre a estrutura dos dados. Havia este artigo sobre a compactação de movimentos de xadrez que mostra como a adição de conhecimento ajuda a aumentar a compactação.
espectras
11
Você pode esclarecer: A compactação pode ser "com perdas" ou "sem perdas" (ou algum "híbrido" que pode usar ambos). Você está falando sobre a compactação máxima usando apenas métodos de compactação "sem perdas" ou está incluindo (permitindo) o uso de métodos de compactação "com perdas" também. Em outras palavras, acho que existem três possibilidades: procurar "compressão máxima" onde (1) os dados sempre devem poder ser descomprimidos exatamente como antes da compressão, (2) os dados devem ser descomprimidos, mas alguma "perda" é permitida (3) não é um requisito que os dados possam ser descomprimidos.
Kevin Fegan
Oi @KevinFegan, nesse caso, teria que ser a opção 1: "os dados sempre devem poder ser descompactados exatamente como eram antes da compactação"
x457812 # 304515

Respostas:

45

A complexidade de Kolmogorov é uma abordagem para formalizar isso matematicamente. Infelizmente, calcular a complexidade de Kolmogorov de uma string é um problema incontestável. Consulte também: Aproximando a complexidade de Kolmogorov .

É possível obter melhores resultados se você analisar a origem da string em vez da própria string . Em outras palavras, frequentemente a fonte pode ser modelada como um processo probabilístico, que escolhe aleatoriamente uma string de alguma forma, de acordo com alguma distribuição. A entropia dessa distribuição indica a matematicamente a melhor compressão possível (até uma pequena constante aditiva).


Sobre a impossibilidade de compactação perfeita, você também pode estar interessado no seguinte.

DW
fonte
mas a compressão é uma das técnicas para estimar a entropia. A compressão e a entropia podem ser duas facetas da mesma coisa?
Paul Uszak
11
@PaulUszak, sim, eles estão muito relacionados: veja, por exemplo, o teorema de Shannon . Porém, observe: os comentários devem ser usados ​​apenas para sugerir melhorias / esclarecimentos ao post, não para fazer perguntas de acompanhamento. Para fazer uma nova pergunta, use o link "Fazer pergunta" na parte superior direita da página.
DW
35

Para qualquer string, existe um esquema de compactação que a comprime na string vazia. Portanto, não faz sentido perguntar quanto uma única string pode ser compactada, mas sim quanto uma coleção (ou distribuição ) de strings pode ser compactada, em média. Em geral, dada uma coleção de strings, qualquer esquema de compactação precisa de pelo menos bits ou mais para codificar uma string da coleção no pior caso.log 2 NNlog2N

Além disso, em muitos casos, não nos preocupamos com a reconstrução exata . Isso se chama compressão com perdas e é assim que as músicas e vídeos são compactados. Nesse caso, o limite inferior indicado acima não se mantém, mas você pode criar outros limites inferiores.

Yuval Filmus
fonte
11
@Eedrac Não, você me entendeu corretamente. Seu argumento (mais ou menos) mostra que qualquer esquema de codificação para strings requer bits para algumas strings. O canal lateral aqui é o procedimento de descompressão. log 2 NNlog2N
Yuval Filmus
27

Aqui está um esquema simples que pode comprimir seqüências de bits arbitrárias sem perdas, com o menor resultado sendo apenas um bit:

Se a string for uma correspondência idêntica para a gravação da 9ª sinfonia de Beethoven, quarto movimento, no formato AAC armazenado no disco rígido do meu computador, a saída será um único bit '0'.

Se a string for qualquer outra coisa, a saída será um único bit '1', seguida por uma cópia idêntica da string original.

Esse esquema reduz uma entrada possível para exatamente um bit e aumenta todas as outras entradas em comprimento. Existe um princípio geral: se um algoritmo de compactação pode mapear qualquer sequência de entrada para uma sequência compactada, e existe um algoritmo de descompressão correspondente que mapeia qualquer sequência compactada de volta para a sequência original e o algoritmo de compactação mapeia qualquer entrada para uma sequência mais curta, então ele deve mapear algumas cadeias de entrada para cadeias mais longas.

gnasher729
fonte
2
Bom trabalho de tornar a resposta clara e óbvia. Vale a pena notar que isso é semelhante ao que um bom algoritmo de compactação tenta fazer - para um determinado domínio de entrada, tente encurtar os tipos de entradas mais comumente esperados, em troca de entradas menos comuns serem aumentadas.
JBentley
6

Para cada esquema de compactação que você criar, é possível produzir dados que não serão compactados por ele. Portanto, mesmo que seu esquema de compactação seja muito eficiente com alguns tipos de dados, ele nunca será compactado consistentemente até uma determinada proporção.

A maneira de produzir um exemplo de dados não compactáveis ​​para um algoritmo de compactação específico é simples: pegue qualquer tipo de dados e execute-o repetidamente no algoritmo de compactação, até que o tamanho não diminua mais.

Portanto, a compressibilidade de uma sequência de bits não é realmente uma função do comprimento da sequência, mas de sua complexidade em relação ao algoritmo de compactação.

m69 '' sarcástico e hostil ''
fonte
Bem vinda! Observe que isso se aplica apenas à compactação sem perdas. A compactação com perdas pode compactar todas as strings (pelo menos, desde que você aceite o algoritmo "Retornar string vazia" como um algoritmo de compactação com perdas. ;-)).
David Richerby
@DavidRicherby Isso é verdade, é claro. Mas tive a impressão de que o OP estava perguntando sobre a compactação sem perdas, porque não faz muito sentido discutir a compactação máxima de um esquema com perdas; a idéia de que você pode levá-lo a extremos inutilizáveis ​​é inerente ao conceito de compactação com perdas.
m69 '' sarcástico e hostil ''
Sim, acho que é uma interpretação razoável.
David Richerby
-2

Existe um algoritmo interessante e completamente diferente que é usado pelos sistemas de backup corporativo. A idéia é que, se você tiver uma empresa com 10.000 computadores, muitos desses computadores conterão muitos arquivos idênticos. Por exemplo, um email enviado a todos na empresa pode acabar como um arquivo idêntico em cada disco rígido.

Portanto, um sistema de backup que tenta fazer backup de um arquivo deve obviamente tentar compactá-lo para economizar espaço, mas primeiro o sistema de backup verifica se um arquivo absolutamente idêntico já foi salvo! Portanto, em vez de fazer backup de qualquer coisa , tudo o que o sistema de backup faz é, por exemplo, lembrar que você tem o número de arquivo 1.487.578 no sistema de backup no disco rígido.

Isso é especialmente eficiente, por exemplo, quando 10.000 usuários têm sistemas operacionais e aplicativos idênticos instalados. Para usuários únicos, não é muito útil.

gnasher729
fonte
4
Isso é interessante, mas não vejo como ele responde à pergunta. A pergunta pede limites de compactação, não uma discussão geral sobre backups corporativos.
David Richerby
Isso é chamado de desduplicação e é feito usando hashes. É necessária muita RAM para armazenar um hash de 128 bits para cada bloco no disco. O ZFS pode fazer isso para oportunamente fazer com que alguns blocos compartilhem algum espaço de armazenamento de cópia na gravação. Mas esse tipo de problema de compactação (onde você está tentando compactar um conjunto de dados massivo ao qual precisa de acesso aleatório e está mudando muito rapidamente para a compactação normal de fluxo, mas possui redundância em nível de bloco) não é relevante como resposta a isso questão.
Peter Cordes