7
votes

Encodage de longueur d'exécution binaire

J'ai un formulaire Web, pour le contenu dont je voudrais générer une brève représentation dans la base64. La forme, entre autres choses, contient une liste de 264 valeurs binaires, dont la plus grande partie va être 0 à tout moment. (Ils représentent des régions sur une carte géographique). Même en base64, ce nombre de 264 bits génère une longue chaîne intimidante. Je souhaite mettre en œuvre le codage de la longueur d'exécution, aussi efficacement que possible. Peux-tu m'aider avec ceci? J'ai googlé binaire rle, mais n'ai rien trouvé d'usage.

Ce que j'ai essayé loin fort> - exécutant rle sur la chaîne binaire à l'aide de comptes décimaux et "A" comme séparateur indiquant un séparateur indiquant un Changement entre 0 et 1, puis convertir le résultat de la base 11 à la base 64. Par exemple: P>

ILHHASCAASBYwwccDASYgAEgWDI=


0 commentaires

3 Réponses :


0
votes

Une alternative que je pense est plus ce que vous voulez est une matrice rare: http://en.wikipedia.org/wiki/sparse_matrix


0 commentaires

1
votes

264 bit, qui ne sont que de 33 octets, et qui sont en base64 à seulement 44 octets. Je pense que cette quantité d'informations (très petite) n'est guère compressable. La représentation clairsemée Nulvinçage désigne également uniquement les éléments non nuls et leurs valeurs (comme vous l'avez juste 0/1), c'est-à-dire que vous avez simplement l'index des bits non nuls. Mais comme vous avez 264 bits possibles - vous avez besoin de 9 bits pour l'indice, ce qui signifie que, au cas où vous auriez plus de 29 entrées non nuls, vous avez déjà besoin de plus que d'origine.

Peut-être que votre question est formulée de tort, mais je ne vois pas comment 264 bits peuvent conduire à une chaîne intimidante de base64 (comment le génèverez-vous - peut-être que vous traduisez non les 264 bits, mais 264 caractères asciis (avec la valeur 0 et 1 ) - Cela expliquerait votre longue chaîne de résultats?).


2 commentaires

@Egasimus: Vous avez raison, j'ai calculé avec la taille des mots. Mais la déclaration générale tient même pour 44 octets: trop petit pour bien la compresser.


Eh bien, j'ai réussi à raser quelques lettres, voir ci-dessus. Le nombre binaire ci-dessus est en réalité un élément improbable de données d'entrée. Il serait plus court dans des cas plus réalistes. Je ne suis pas sûr de l'utiliser "A" si.



9
votes

Depuis que vous codez des bits, vous souhaitez probablement utiliser une rle à base de bit au lieu d'un octet basé sur des octets. Dans ce contexte, vous devriez considérer Codage elias gamma (ou une variante de celle-ci) pour encoder efficacement votre course. longueurs.

Une première approximation raisonnable pour votre format de codage pourrait être:

  • premier bit = identique au premier bit de la chaîne non compressée (pour définir la polarité initiale)
  • BITS restants: ELIAS Les longueurs codées de bits successifs (alternant 1 et 0)

    Depuis que vous savez combien de bits sont dans votre chaîne non compressée, vous n'avez pas besoin d'un code de résiliation; Vous pouvez simplement ajouter tout rembourrage binaire nécessaire sous forme de bits arbitraires.

    Notez qu'il est toujours possible pour la "compression" de la longueur d'exécution d'étendre votre chaîne de bits; Si vous vous inquiétez de cela, vous pouvez ajouter un autre bit initial pour indiquer si vos données sont sous forme compressée ou non compressée, limitant ainsi votre surcharge de compression à 1 bit.


0 commentaires