Pour un si petit nombre de bits, il est impossible d'enregistrer de nombreux bits comme l' a souligné Glorfindel . Cependant, si le domaine que vous utilisez a quelques bits de plus, vous pouvez réaliser des économies importantes pour le cas moyen en encodant des plages avec la valeur de départ et un delta.
Supposons que le domaine soit les entiers, donc 32 bits. Avec l'approche naïve, vous avez besoin de 64 bits (début, fin) pour stocker une plage.
Si nous passons à un codage de (début, delta), nous pouvons construire la fin de la plage à partir de cela. Nous savons que dans le pire des cas, le début est 0 et le delta a 32 bits.
2 ^ 5 est 32, donc nous codons la longueur du delta en cinq bits (pas de longueur nulle, ajoutez toujours 1), et l'encodage devient (début, longueur, delta). Dans le pire des cas, cela coûte 32 * 2 + 5 bits, donc 69 bits. Donc dans le pire des cas, si toutes les plages sont longues, c'est pire que l'encodage naïf.
Dans le meilleur des cas, cela coûte 32 + 5 + 1 = 38 bits.
Cela signifie que si vous devez encoder un grand nombre de plages, et que ces plages ne couvrent chacune qu'une petite partie de votre domaine, vous finissez par utiliser moins d'espace en moyenne en utilisant cet encodage. Peu importe la façon dont les départs sont distribués, car le début prendra toujours 32 bits, mais la façon dont les longueurs des plages sont distribuées importe. Si plus vous avez de petites longueurs, meilleure est la compression, plus vous avez de plages couvrant toute la longueur du domaine, pire sera l'encodage.
Cependant, si vous disposez de nombreuses plages regroupées autour de points de départ similaires (par exemple, parce que vous obtenez des valeurs d'un capteur), vous pouvez réaliser des économies encore plus importantes. Vous pouvez appliquer la même technique à la valeur de départ et utiliser un biais pour compenser la valeur de départ.
Disons que vous avez 10000 plages. Les plages sont regroupées autour d'une certaine valeur. Vous encodez le biais avec 32 bits.
En utilisant l'approche naïve, vous auriez besoin de 32 * 2 * 10 000 = 640 000 bits pour stocker toutes ces plages.
L'encodage de la polarisation prend 32 bits, et l'encodage de chaque plage prend alors dans le meilleur des cas 5 + 1 + 5 + 1 = 12 bits, pour un total de 120 000 + 32 = 120 032 bits. Dans le pire des cas, vous avez besoin de 5 + 32 + 5 + 32 bits, donc 74 bits, pour un total de 740 032 bits.
Cela signifie que, pour 10 000 valeurs sur un domaine qui prend 32 bits à coder, nous obtenons
- 120 032 bits avec le codage delta intelligent dans le meilleur des cas
- 640 000 bits avec le début naïf, le codage final, toujours (pas le meilleur ou le pire des cas)
- 740 032 bits avec le codage delta intelligent dans le pire des cas
Si vous prenez l'encodage naïf comme référence, cela signifie soit des économies allant jusqu'à 81,25%, soit jusqu'à 15,625% de coûts supplémentaires.
Selon la façon dont vos valeurs sont réparties, ces économies sont importantes. Connaissez votre domaine d'activité! Sachez ce que vous voulez encoder.
En tant qu'extension, vous pouvez également modifier le biais. Si vous analysez les données et identifiez des groupes de valeurs, vous pouvez trier les données dans des compartiments et encoder chacun de ces compartiments séparément, avec son propre biais. Cela signifie que vous pouvez appliquer cette technique non seulement aux plages regroupées autour d'une seule valeur de départ, mais également aux plages regroupées autour de plusieurs valeurs.
Si vos points de départ sont répartis également, cet encodage ne fonctionne pas vraiment bien.
Cet encodage est évidemment extrêmement mauvais à indexer. Vous ne pouvez pas simplement lire la valeur x-ème. Il ne peut quasiment être lu que séquentiellement. Ce qui est approprié dans certaines situations, par exemple le streaming sur le réseau ou le stockage en vrac (par exemple sur bande ou disque dur).
Évaluer les données, les regrouper et choisir le biais correct peut être un travail considérable et peut nécessiter un réglage fin pour des résultats optimaux.