Voorbij Huffman: perfecte compressie met Asymmetric Numeral Systems
Voorbij Huffman: Hoe Asymmetric Numeral Systems perfecte compressie halen
Bij webdiensten met miljoenen verzoeken telt elk byte verkeer. Kosten voor CDN, opslag en API-snelheid hangen af van slimme compressie. Veel developers grijpen naar gzip of brotli. Maar ze vergeten de wiskunde erachter. Er bestaat een methode die de theoretische grenzen van informatieleer raakt.
Het probleem uit informatieleer
Niet elk symbool komt even vaak voor in data. Shannon's broncoderingstheorema zegt: de 'kost' van een symbool hangt af van zijn frequentie.
Stel je voor:
- Symbool met 50% kans kost 1 bit.
- Bij 25% kans kost het 2 bits.
- Bij 37,5% kans rond de 1,415 bits.
Huffman-coding faalt hier. Het deelt bits uit in hele eenheden. Geen halve bits mogelijk. Alles wordt afgerond, en je verliest efficiëntie.
Arithmetic Coding als oplossing
Geen vaste bitpatronen meer. Arithmetic coding verandert een hele reeks symbolen in één getal. Een omkeerbare wiskundige truc die data dichter pakt dan Huffman ooit kan.
rANS (range Asymmetric Numeral Systems) is een slimme variant. Je ziet het steeds meer in compressielibraries en streaming-tools.
Zo werkt rANS in de praktijk
Houd één getal bij, de 'state' (zeg x). Bij elk symbool pas je een formule toe. Die moet omkeerbaar zijn: de decoder haalt symbool en oude state eruit.
De formule:
x′ = ⌊x/f_s⌋ × M + c_s + (x mod f_s)
f_s: frequentie van symbools.c_s: cumulatieve frequentie ervoor.M: totale frequentie.
Voorbeeld met symbolen A, B, C:
| Symbool | Frequentie | Cumulatief | |---------|------------|------------| | A | 4 | 0 | | B | 3 | 4 | | C | 1 | 7 |
M = 8. Start met state 13. Reeks "ABC".
A encoderen (f=4, c=0):
x′ = ⌊13/4⌋ × 8 + 0 + (13 mod 4) = 3 × 8 + 1 = 25
B encoderen (f=3, c=4):
x′ = ⌊25/3⌋ × 8 + 4 + (25 mod 3) = 8 × 8 + 4 + 1 = 69
Eindstate 69 bevat de hele reeks. Decoder keert het om en krijgt "ABC" terug. Geen verlies.
Waarom dit telt voor je systemen
Grote voordelen:
Hogere compressie: rANS haalt Shannons limiet. 5-15% beter dan Huffman bij gewone data.
Streaming: Werkt met lopende state. Geen wacht op het hele bestand.
CPU-vriendelijk: Simpele integer-operaties. Past perfect op moderne processors.
In productie: Zstandard van Facebook gebruikt ANS-varianten. Apple in beeldformaten. Steeds meer de standaard.
Het omkeerbaarheids-issue opgelost
Hoe weet je wanneer alles encoded is? Houd de state in een geldig bereik. Wordt hij te groot? Output bits en ga door. Bij decoderen: bits erin voor het juiste bereik.
Die zelf-synchronisatie maakt rANS zo geliefd.
Tips voor developers
Bij NameOcean-hosting telt compressie. API-responses kleiner, backups sneller, minder kosten in Vibe Hosting met AI. Huffman versus rANS scheelt meetbare performance.
Bibliotheken zijn klaar: zstandard in Python, opties in JavaScript. Code is getest en snel.
De les erachter
rANS toont aan: doorbraken komen vaak uit slimme implementatie van oude ideeën. Arithmetic coding met minimale rekenkracht.
Shannon gaf in 1948 de limiet. Jaren later praktische tools zoals rANS. Theorie plus engineering.
Volgende keer dat je compressie wint op snelheid of ruimte, zit er vaak ANS achter.