Usando a base 80 para compactar arquivos


8

Quero compactar o tamanho do arquivo criando meu próprio sistema de numeração, que é um número baseado em 80. Eu realmente quero saber se isso é possível? Aprendi que o hexadecimal usa símbolos como A, B, C, D, E, F para representar 10,11,12,13,14,15 - e é isso que eu quero fazer no meu próprio sistema de numeração, mas em uma escala maior . Por favor, corrija-me se estiver faltando alguma coisa.

É possível ?


2
Veja também aqui .
Raphael

5
A resposta de Frank explica por que isso não funciona. Mas aqui está algo que você poderia se perguntar antes de começar: que propriedade especial do número 80 você acha que está usando? A menos que haja algo especial em 80, se sua ideia funcionasse para 80, não funcionaria melhor para 81? Ou 801?
precisa saber é o seguinte

3
@ DavidRicherby: Não consigo pensar em muito valor para a base 80, mas na verdade existe algum valor real no uso da base 85: ele pode converter grupos de quatro octetos em cinco caracteres imprimíveis. Embora a eficiência do armazenamento não seja uma grande melhoria em relação à base 64 (vinte caracteres representarão quinze octetos na base 64 e dezesseis na base 85), o fato de o "bloco" de dados básico ser de 32 bits em vez de 24 pode às vezes seja muito prestativo.
Supercat

Quero dizer, e se eu pudesse encontrar alguns padrões e representá-los em símbolos?
precisa saber é o seguinte

2
Se você encontrar padrões e representá-los em símbolos, criou um algoritmo de compactação funcional (desde que a representação seja mais curta que o padrão original). É assim que todos os algoritmos de compactação funcionam.
Tanner Swett

Respostas:


30

Embora você precise de menos números com base em 80 do que números com base em 2 (bits) para codificar o mesmo arquivo, a única maneira de armazenar esses números com base em 80 em um computador é codificá-los como bits. Então você não ganha nada.

Na verdade, você perde espaço, já que 80 não é uma potência de 2: você precisará de 7 bits para cada número baseado em 80, mas nesses 7 bits você pode obter 128 estados diferentes, se os usar diretamente.


10

Existem várias maneiras de interpretar a pergunta. O que eu acho que você deve estar se perguntando é que você tem uma sequência de letras em um alfabeto onde . Você deseja armazenar isso no menor número possível de bits. Assumiremos que as letras do alfabeto são distribuídas uniformemente.nΣ|Σ|=80

A quantidade de espaço teórico da informação necessária para armazenar isso ébits. Usando codificação aritmética, você pode fazer isso em tempo linear, usando bits de espaço intermediário. (Lembre-se, esse é o logaritmo do número de símbolos, em bits! Se o tamanho da sequência se encaixar em uma palavra-máquina, o armazenamento intermediário necessário é no máximo um número constante de palavras-máquina.)nlog2|Σ|O(logn)

Então isso é muito bom. Mas e se quisermos acesso aleatório?

Acontece que isso pode ser feito. A primeira técnica a fazer isso foi descoberta apenas cerca de quatro anos atrás. Podemos armazenar a sequência embits, de modo que a leitura ou gravação de qualquer entrada leve . Se você pensar bem, esse é um resultado notável, porque significa que um computador que funciona com qualquer raiz é, em certo sentido, equivalente a um computador binário.nlog2|Σ|O(1)

Aqui está o artigo: Yevgeniy Dodis, Mihai Pătraşcu e Mikkel Thorup, uma alternativa à codificação aritmética com decodibilidade local , STOC 2010.

A propósito, lembre-se do nome Mihai Pătraşcu. Ele era e é a coisa mais próxima que temos de Évariste Galois dos dias modernos. Ele morreu muito jovem, com um tumor no cérebro aos 29 anos. Mas em sua curta carreira como cientista da computação, seu trabalho revolucionou o campo de análise de algoritmos de maneiras que levarão décadas para entender completamente.


3

Se você tiver um número (por exemplo, 123456789⏨) como texto, poderá escrevê-lo em uma base diferente (como 21i3v9 na base 36), para compactá- lo como texto (de 9 caracteres a 6).

Se você for mais longe, acaba armazenando-o em binário (4 bytes¹).

Agora, isso funciona porque você começou com um conjunto reduzido [0-9] e mudou para um maior [0-9a-z] e muitos bits de dados não foram utilizados na representação inicial.

Da mesma forma, se sabemos que um arquivo contém apenas letras, podemos compactá-lo facilmente alterando a base. No entanto, se você compactar com conteúdo arbitrário, isso não funcionará (sempre). Você pode compactar (obter saídas menores) para alguns arquivos, mas outros se tornarão maiores, assim como qualquer método de compactação sem perdas , isso é inevitável.

No entanto, ele ainda pode ser útil, por exemplo, um método que comprime bem os textos em inglês, mas aumenta os textos em chinês, pode ser bom o suficiente se você escrever muito mais inglês do que chinês.

¹ Na verdade, você só precisa de 2²⁷ bits, embora atualmente o armazenamento do computador use múltiplos de 8 bits (mas talvez você queira armazenar uma série de números de 2²⁷ bits? ☺).


2

Base 80 ?? Por que 80? Não faz sentido, por mais que a base 85 faça. É bastante conveniente, pois você pode representar 4 bytes usando 5 caracteres (porque 85 ^ 5 = 4.437.053.125, que é um pouco mais que 2 ^ 32 = 4.294.967.296)

Aqui está o meu código para escrever um único 32 bits word:

for (i=0; i<5; i++)
{
    c = (word % 85) + 37;
    word /= 85;
    fwrite(&c, sizeof(uint8_t), 1, file);
}

e aqui está para ler de volta:

    word = 0;
    for (i=4; i>=0; i--)
        fread(&c[i], sizeof(uint8_t), 1, file);

    for (i=0; i<5; i++)
        word = word*85 + c[i]-37;

Se você realmente deseja usar a base 80, pode usar a mesma abordagem e substituir as instâncias de 85 por 80 e precisará de 6 caracteres para cada 4 bytes em vez de 5.

Como isso vai comprimir alguma coisa? Você percebe que os arquivos são gravados na base 256, certo? Dito isto, se você compactar um arquivo gravado na base 85, ele terá o mesmo tamanho do arquivo base 256 original compactado, o que torna a base 85 (ou base 64) uma boa opção se você deseja representar dados binários usando caracteres imprimíveis.



0

Bases diferentes são usadas para diferentes propósitos, embora, como as outras respostas explicam, você não ganhe nada em termos de compactação.

Consulte a Wikipedia para obter uma explicação da codificação base64 . A base 64 é frequentemente usada, não para compactação, mas para codificar dados binários que normalmente resultariam em caracteres não imprimíveis e códigos de controle em um espaço de caracteres ASCII imprimível. Isso resultará em um tamanho de arquivo maior , mas é útil para transferir dados binários que podem ser incorporados em outros arquivos ASCII, por exemplo, dentro de XML, emails, CSS, páginas da web etc.


O que você diz é verdade, mas não responde à pergunta.
precisa saber é o seguinte

@DavidRicherby Eu discordo. Ele responde à pergunta a partir do ponto em que é possível usar bases numéricas diferentes daquelas com as quais o OP está familiarizado e que elas têm um objetivo, mas esse objetivo não é a compactação.
Luke Mills

A questão é: é possível compactar arquivos gravando-os na base 80? A resposta para isso é "não", como você mencionou na sua primeira frase e como todas as outras respostas já cobrem. Seu segundo parágrafo é um comentário sobre a pergunta. Comentários vão nos comentários.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.