Ik ben momenteel bezig een klein compressie algoritme voor plaatjes te implementeren. Het werkt op regel/rij-basis, en het compressen van elke individuele rij heb ik al grotendeels optimaal klaar.
In het formaat dat ik probeer op te slaan (wat overigens geen publiekelijk formaat is) komt na de header voor elke rij een DWORD, welke aangeeft op welke offset de rij begint. De lengte van de rij is variabel, maar bekend (e.g. het programma zal nooit verder lezen dan de lengte van de betreffende rij).
Op dit moment gooi ik alle rijen nog simpelweg achter elkaar, en bereken de offset simpelweg door optellen.
Echter bedacht ik me net dat identieke rijen (bijvoorbeeld zwarte rijen) op zich maar 1 keer opgeslagen hoeven te worden, en ik op deze manier ruimte kan besparen. Dit is op zich al een hele ruimte besparing, maar ik geloof dat het nog compacter kan: sommige rijen zullen vrijwel hetzelfde eindigen als anderen beginnen, in principe zou dit dus "in elkaar gepast" kunnen worden.
Nu is mijn probleem: hoe doe ik dit zo efficient mogelijk?
Om een kort voorbeeld te geven met woorden: stel ik wil de volgende woorden opslaan:
tom
noot
aap
pa
ma
de simpele manier zou zijn: (14 karakters)
0 3 7 10 12
tomnootaappama
een ietwat efficientere zou bijvoorbeeld zijn: (13 karakters)
0 3 7 9 11 (de p in aap en pa wordt bij elkaar gevoegd).
tomnootaapama
Een (in mijn ogen vrij) optimale oplossing: (10 karakters)
3 0 6 8 5
nootomaapa
Ik zat zelf al te denken om vanaf het langste woord te beginnen en er telkens kortere woorden in te plakken (het zij in, voor, of na de huidige reeks).
Wat het een en ander eventueel nog ietsje uitdagender kan maken, maar wat waarschijnlijk vrij triviaal in te meten is in een simpelere oplossing, is dat in het laatste karakter van elke rij meestal slechts maar enkele bits worden gebruikt, en die andere dus kunnen worden aangepast.
In het formaat dat ik probeer op te slaan (wat overigens geen publiekelijk formaat is) komt na de header voor elke rij een DWORD, welke aangeeft op welke offset de rij begint. De lengte van de rij is variabel, maar bekend (e.g. het programma zal nooit verder lezen dan de lengte van de betreffende rij).
Op dit moment gooi ik alle rijen nog simpelweg achter elkaar, en bereken de offset simpelweg door optellen.
Echter bedacht ik me net dat identieke rijen (bijvoorbeeld zwarte rijen) op zich maar 1 keer opgeslagen hoeven te worden, en ik op deze manier ruimte kan besparen. Dit is op zich al een hele ruimte besparing, maar ik geloof dat het nog compacter kan: sommige rijen zullen vrijwel hetzelfde eindigen als anderen beginnen, in principe zou dit dus "in elkaar gepast" kunnen worden.
Nu is mijn probleem: hoe doe ik dit zo efficient mogelijk?
Om een kort voorbeeld te geven met woorden: stel ik wil de volgende woorden opslaan:
tom
noot
aap
pa
ma
de simpele manier zou zijn: (14 karakters)
0 3 7 10 12
tomnootaappama
een ietwat efficientere zou bijvoorbeeld zijn: (13 karakters)
0 3 7 9 11 (de p in aap en pa wordt bij elkaar gevoegd).
tomnootaapama
Een (in mijn ogen vrij) optimale oplossing: (10 karakters)
3 0 6 8 5
nootomaapa
Ik zat zelf al te denken om vanaf het langste woord te beginnen en er telkens kortere woorden in te plakken (het zij in, voor, of na de huidige reeks).
Wat het een en ander eventueel nog ietsje uitdagender kan maken, maar wat waarschijnlijk vrij triviaal in te meten is in een simpelere oplossing, is dat in het laatste karakter van elke rij meestal slechts maar enkele bits worden gebruikt, en die andere dus kunnen worden aangepast.
[img=http://www.web2messenger.com/smallstatus/w2m/theblasp.png]