Je kunt natuurlijk ook het aantal opeenvolgende spaties beschouwen als te comprimeren tekst, die je dan gaat analyseren.
Bijvoorbeeld je hebt de volgende verdeling:
1x 10 spaties
3x 5 spaties
4x 14 spaties
2x 1 spaties
Dan codeer je de meest voorkomende reeks met het kortste teken.
Kijk bijvoorbeeld eens naar de morse-code. De 'e' heeft de kortste codering en de minder gebruikte tekens zoals cijfers en een aantal letters heb je de langste code voor nodig.

Je kunt dan besluiten de gegenereerde codering mee op te slaan (kost ruimte), maar je kunt het jezelf ook heel makkelijk maken door die morse-code te gebruiken.
Bijvoorbeeld als resultaat je letters zonder spaties, gevolgd door 1 spatie en dan elke reeks van spaties opslaan als cijfers in morse opgeslagen.
Dus 123045067089 = 123 spaties, 45 spaties, 67 spaties. 89 spaties.
Dat is in dit voorbeeld 12 "tekens" in Morse die elk 5 bits innemen.
Oftewel 60 bits voor dit stukje.
Die codeer je dan met 6 tekens per 32-bit word, zodat je altijd mooi netjes uitkomt en dus ook in constante tijd kunt berekenen hoeveel spaties er tussen de n
e en (n+1)
e letter stond. Je kunt dus een hele simpele functie maken die 6x int accepteert en een string van 4 bytes oplevert.
Of nog leuker, je maakt een type met union waarin je de boel gewoon opslaat en uitleest. Dan heb je je compressie en decompressie in no-time klaar.
code:
1
2
3
4
5
6
7
8
9
10
11
| union morseToString {
struct {
uint_8 digit1:5;
uint_8 digit2:5;
uint_8 digit3:5;
uint_8 digit4:5;
uint_8 digit5:5;
uint_8 digit6:5;
} digits;
char c[4];
} mix; |
Dit even uit het hoofd, maar het gaat om het idee.
Een goedkope voeding is als een lot in de loterij, je maakt kans op een paar tientjes korting, maar meestal betaal je de hoofdprijs. mijn posts (nodig wegens nieuwe layout)