Utilizzo della base 80 per la compressione dei file


8

Voglio comprimere le dimensioni del file creando il mio sistema di numerazione che è un numero basato su 80, voglio davvero sapere se questo è possibile? Ho imparato che Hexadecimal utilizza simboli come A, B, C, D, E, F per rappresentare 10,11,12,13,14,15 - ed è quello che voglio fare al mio sistema di numerazione, ma su scala più ampia . Per favore, correggimi se mi manca qualcosa.

È possibile ?


2
Vedi anche qui .
Raffaello

5
La risposta di Frank spiega perché questo non funziona. Ma ecco qualcosa che ti potresti chiedere prima di iniziare: quale proprietà speciale del numero 80 pensi di usare? A meno che non ci sia qualcosa di speciale in 80, se la tua idea funzionasse per 80, non funzionerebbe meglio per 81? O 801?
David Richerby,

3
@DavidRicherby: non riesco a pensare a molto valore in base 80, ma in realtà c'è un valore reale nell'uso di base-85: può convertire gruppi di quattro ottetti in cinque caratteri stampabili. Mentre l'efficienza di archiviazione non è un enorme miglioramento rispetto alla base 64 (venti caratteri rappresenteranno quindici ottetti nella base 64 e sedici nella base 85), il fatto che il "blocco" di dati di base sia di 32 bit anziché 24 può talvolta essere molto utile.
Supercat,

Voglio dire, se potessi trovare alcuni schemi e rappresentarli in simboli?
Kinani,

2
Se trovi motivi e li rappresenti in simboli, hai creato un algoritmo di compressione funzionante (purché la rappresentazione sia più corta del motivo originale). Ecco come funzionano tutti gli algoritmi di compressione.
Tanner Swett,

Risposte:


30

Sebbene per codificare lo stesso file siano necessari meno numeri basati su 80 rispetto a numeri basati su 2 (bit), l'unico modo per memorizzare questi numeri basati su 80 su un computer è codificarli come bit. Quindi non guadagni nulla.

In realtà perdi spazio, poiché 80 non è una potenza di 2: avrai bisogno di 7 bit per ogni numero basato su 80, ma in questi 7 bit potresti invece incontrare 128 stati diversi, se li utilizzassi direttamente.


10

Esistono diversi modi per interpretare la domanda. Quello che penso che potresti chiederti è che hai una sequenza di lettere in un alfabeto dove . Si desidera memorizzare questo nel minor numero possibile di bit. Supponiamo che le lettere dell'alfabeto siano distribuite uniformemente.nΣ|Σ|=80

La quantità teorica di spazio richiesta per memorizzare questo èbit. Usando la codifica aritmetica, puoi farlo in tempo lineare, usando bit di spazio intermedio. (Ricorda, questo è il logaritmo del numero di simboli, in bit! Se la dimensione della sequenza si adatta a una parola macchina, la memoria intermedia richiesta è al massimo un numero costante di parole macchina.)nlog2|Σ|O(logn)

Quindi va abbastanza bene. E se vogliamo un accesso casuale?

Si scopre che può essere fatto. La prima tecnica per farlo è stata scoperta circa quattro anni fa. Possiamo memorizzare la sequenza inbit, in modo tale che leggere o scrivere qualsiasi voce richieda tempo. Se ci pensate, questo è un risultato notevole, perché significa che un computer che funziona con qualsiasi radix è, in un certo senso, equivalente a un binario.nlog2|Σ|O(1)

Ecco l'articolo: Yevgeniy Dodis, Mihai Pătraşcu e Mikkel Thorup, un'alternativa alla codifica aritmetica con decodificabilità locale , STOC 2010.

A proposito, ricorda il nome Mihai Pătraşcu. Era ed è la cosa più vicina a un moderno Évariste Galois. Morì molto giovane, di un tumore al cervello all'età di 29 anni. Ma nella sua breve carriera di informatico, il suo lavoro ha rivoluzionato il campo dell'analisi degli algoritmi in modi che impiegheranno decenni a comprendere appieno.


3

Se si dispone di un numero (ad es. 123456789⏨) come testo si può scrivere in una base diversa (come ad esempio 21i3v9 in base 36), in modo da comprimere è scritto come testo (da 9 caratteri a 6).

Se vai oltre, finisci per memorizzarlo in binario (4 byte¹).

Ora, questo funziona perché hai iniziato con un set ridotto [0-9] e sei passato a un set più grande [0-9a-z] e molti bit di dati non sono stati utilizzati nella rappresentazione iniziale.

Allo stesso modo, se sappiamo che un file contiene solo lettere, possiamo comprimerlo facilmente cambiando la base. Tuttavia, se dovessi comprimere da contenuti arbitrari, ciò non funzionerà (sempre). È possibile comprimere (ottenere output più piccoli) per alcuni file, ma altri diventeranno più grandi proprio come qualsiasi metodo di compressione senza perdita , questo è inevitabile.

Può comunque essere utile, ad esempio, un metodo che comprime bene i testi inglesi ma che ingrandisce i testi cinesi può essere abbastanza buono se scrivi molto più inglese che cinese.

¹ In realtà hai bisogno solo di 2²⁷ bit, anche se al giorno d'oggi la memoria del computer utilizza multipli di 8 bit (ma forse volevi memorizzare una serie di numeri di 2²⁷ bit? ☺).


2

Base 80 ?? Perché 80 Non ha senso, tuttavia la base 85 lo fa. È abbastanza conveniente in quanto puoi rappresentare 4 byte usando 5 caratteri (perché 85 ^ 5 = 4.437.053.125 che è leggermente più di 2 ^ 32 = 4.294.967.296)

Ecco il mio codice per scrivere un singolo 32 bit word:

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

ed ecco per rileggerlo:

    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 vuoi davvero usare la base 80 puoi usare lo stesso approccio e sostituire le istanze di 85 con 80 e avrai bisogno di 6 caratteri per ogni 4 byte anziché 5.

Ma come comprimerà qualcosa? Ti rendi conto che i file sono scritti nella base 256, giusto? Detto questo, se si comprime un file scritto nella base 85 avrà circa le stesse dimensioni del file 256 base originale compresso, il che rende la base 85 (o base 64) una buona scelta se si desidera rappresentare i dati binari usando caratteri stampabili.



0

Basi diverse sono utilizzate per scopi diversi, anche se come le altre risposte spiegano che non otterrai nulla in termini di compressione.

Vedi Wikipedia per una spiegazione della codifica base64 . Base 64 viene spesso utilizzato, non per la compressione, ma per codificare dati binari che normalmente comporterebbero caratteri non stampabili e codici di controllo in uno spazio di caratteri ASCII stampabile. Ciò comporterà dimensioni di file maggiori , ma è utile per il trasferimento di dati binari che possono essere incorporati in altri file ASCII, ad esempio XML, e-mail, CSS, pagine Web, ecc.


Quello che dici è vero ma non risponde alla domanda.
David Richerby,

@DavidRicherby Non sono d'accordo. Risponde alla domanda dal punto in cui è possibile utilizzare basi numeriche diverse da quelle a cui l'OP ha familiarità e che hanno uno scopo, ma tale scopo non è la compressione.
Luke Mills,

La domanda è: è possibile comprimere i file scrivendoli in base-80? La risposta è "no", come menzionate nella prima frase e poiché tutte le altre risposte già coprono. Il tuo secondo paragrafo è un commento sulla domanda. I commenti vanno nei commenti.
David Richerby,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.