Utilisation de la base 80 pour compresser des fichiers


8

Je veux compresser la taille du fichier en créant mon propre système de numérotation qui est un nombre basé sur 80, je veux vraiment savoir si cela est possible? J'ai appris que l'hexadécimal utilise des symboles comme A, B, C, D, E, F pour représenter 10,11,12,13,14,15 - et c'est ce que je veux faire avec mon propre système de numérotation mais à plus grande échelle . Veuillez me corriger si je manque quelque chose.

C'est possible ?


2
Voir aussi ici .
Raphael

5
La réponse de Frank explique pourquoi cela ne fonctionne pas. Mais voici quelque chose que vous auriez pu vous demander avant de commencer: quelle propriété spéciale du nombre 80 pensez-vous utiliser? À moins qu'il y ait quelque chose de spécial à propos de 80, si votre idée a fonctionné pour 80, cela ne fonctionnerait-il pas mieux pour 81? Ou 801?
David Richerby

3
@DavidRicherby: Je ne peux pas penser à beaucoup de valeur pour la base 80, mais il y a en fait une vraie valeur à utiliser la base-85: il peut convertir des groupes de quatre octets en cinq caractères imprimables. Bien que l'efficacité du stockage ne soit pas une énorme amélioration par rapport à la base-64 (vingt caractères représenteront quinze octets en base-64 et seize en base-85), le fait que le "bloc" de données de base soit de 32 bits plutôt que de 24 peut parfois être très utile.
supercat

Je veux dire si je pouvais trouver des motifs et les représenter en symboles?
Kinani

2
Si vous trouvez des motifs et les représentez dans des symboles, vous avez créé un algorithme de compression fonctionnel (tant que la représentation est plus courte que le motif d'origine). C'est ainsi que fonctionnent tous les algorithmes de compression.
Tanner Swett

Réponses:


30

Bien que vous ayez besoin de moins de nombres à 80 que de nombres à 2 (bits) pour encoder le même fichier, la seule façon de stocker ces nombres à 80 sur un ordinateur est de les encoder en bits. Vous ne gagnez donc rien.

En fait, vous perdez de l'espace, car 80 n'est pas une puissance de 2: vous aurez besoin de 7 bits pour chaque nombre basé sur 80, mais dans ces 7 bits, vous pourriez à la place encoder 128 états différents, si vous les utilisiez directement.


10

Il existe plusieurs façons d'interpréter la question. Je pense que vous demandez peut-être que vous avez une séquence den lettres dans un alphabet Σ|Σ|=80. Vous souhaitez stocker cela dans le moins de bits possible. Nous supposerons que les lettres de l'alphabet sont uniformément réparties.

La quantité d'espace théorique nécessaire pour stocker ceci est nlog2|Σ|morceaux. En utilisant le codage arithmétique, vous pouvez le faire en temps linéaire, en utilisantO(logn)bits d'espace intermédiaire. (N'oubliez pas, c'est le logarithme du nombre de symboles, en bits! Si la taille de la séquence tient dans un mot machine, le stockage intermédiaire requis est au maximum un nombre constant de mots machine.)

C'est donc plutôt bien. Mais qu'en est-il si nous voulons un accès aléatoire?

Il s'avère que cela peut être fait. La première technique à le faire n'a été découverte qu'il y a environ quatre ans. Nous pouvons stocker la séquence dansnlog2|Σ|bits, de sorte que la lecture ou l'écriture d' une entréeO(1)temps. Si vous y réfléchissez, c'est un résultat remarquable, car cela signifie qu'un ordinateur qui fonctionne avec n'importe quel radix est, dans un sens, équivalent à un binaire.

Voici l'article: Yevgeniy Dodis, Mihai Pătraşcu et Mikkel Thorup, An Alternative to Arithmetic Coding with Local Decodability , STOC 2010.

Soit dit en passant, rappelez-vous le nom de Mihai Pătraşcu. Il était et est la chose la plus proche que nous ayons d'un Évariste Galois moderne. Il est décédé très jeune, d'une tumeur au cerveau à l'âge de 29 ans. Mais au cours de sa courte carrière d'informaticien, son travail a révolutionné le domaine de l'analyse des algorithmes d'une manière qui prendra des décennies à comprendre pleinement.


3

Si vous avez un certain nombre (par exemple. 123456789⏨) sous forme de texte , vous pouvez l' écrire dans une autre base (comme 21i3v9 dans la base 36), de sorte que vous compressez il écrit sous forme de texte (de 9 caractères à 6).

Si vous allez plus loin, vous finissez par le stocker en binaire (4 octets¹).

Maintenant, cela fonctionne parce que vous avez commencé avec un ensemble réduit [0-9] et que vous êtes passé à un plus grand [0-9a-z] et que de nombreux bits de données n'étaient pas utilisés dans la représentation initiale.

De même, si nous savons qu'un fichier ne contient que des lettres, nous pouvons facilement le compresser en changeant la base. Cependant, si vous compressez à partir d'un contenu arbitraire, cela ne fonctionnera pas (toujours). Vous pouvez compresser (obtenir des sorties plus petites) pour certains fichiers, mais d'autres deviendront plus grands comme toute méthode de compression sans perte , cela est inévitable.

Cela peut néanmoins être utile, par exemple une méthode qui comprime bien les textes anglais mais qui agrandit les textes chinois peut être assez bonne si vous écrivez beaucoup plus d'anglais que de chinois.

¹ En fait, vous n'avez besoin que de 2²⁷ bits, bien que de nos jours le stockage informatique utilise des multiples de 8 bits (mais peut-être que vous vouliez stocker une série de nombres de 2²⁷ bits? ☺).


2

Base 80 ?? Pourquoi 80? Cela n'a pas de sens, contrairement à la base 85. C'est assez pratique car vous pouvez représenter 4 octets en utilisant 5 caractères (car 85 ^ 5 = 4 437 053 125, ce qui est légèrement supérieur à 2 ^ 32 = 4 294 967 296)

Voici mon code pour écrire un seul 32 bits word:

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

et voici pour le relire:

    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;

Si vous voulez vraiment utiliser la base 80, vous pouvez utiliser la même approche et remplacer les instances de 85 par 80 et vous aurez besoin de 6 caractères pour 4 octets au lieu de 5.

Comment va-t-il compresser quoi que ce soit? Vous vous rendez compte que les fichiers sont écrits en base 256, non? Cela étant dit, si vous zippez un fichier écrit en base 85, il aura à peu près la même taille que le fichier d'origine zippé en base 256, ce qui fait de la base 85 (ou de la base 64) un bon choix si vous souhaitez représenter des données binaires à l'aide de caractères imprimables.



0

Différentes bases sont utilisées à des fins différentes, bien que comme les autres réponses l'expliquent, vous ne gagnerez rien en termes de compression.

Voir wikipedia pour une explication du codage base64 . La base 64 est souvent utilisée, non pour la compression, mais pour coder des données binaires qui entraîneraient normalement des caractères non imprimables et des codes de contrôle dans un espace de caractères ASCII imprimable. Cela se traduira par une taille de fichier plus grande, mais est utile pour transférer des données binaires qui peuvent être incorporées dans d'autres fichiers ASCII, par exemple à l'intérieur de XML, d'e-mails, de CSS, de pages Web, etc.


Ce que vous dites est vrai, mais cela ne répond pas à la question.
David Richerby

@DavidRicherby Je ne suis pas d'accord. Cela répond à la question à partir du moment où il est possible d'utiliser des bases numériques autres que celles que l'OP connaît, et qu'elles ont un but, mais ce but n'est pas la compression.
Luke Mills

La question est, est-il possible de compresser des fichiers en les écrivant en base-80? La réponse est "non", comme vous le mentionnez dans votre première phrase et comme toutes les autres réponses le couvrent déjà. Votre deuxième paragraphe est un commentaire sur la question. Les commentaires vont dans les commentaires.
David Richerby
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.