Comprimarea fisierelor este la momentul actual o matematica foarte evoluata. Exista niste algoritmi care lucrand cu seturi informationale elimina tot ceea ce este redundant pastrand dintr-un set de date cantitatea minima de informatie ce il poate descrie. Cuvantul minim este cu siguranta exagerat dar se poate spune ca tind spre acest punct absolut. Totusi se poate si altfel...
Sa presupunem ca avem un fisier cu foarte multi octeti alaturati identici(de exemplu o imagine bmp ,fundalul uniform ocupa de cele mai multe ori majoritatea memoriei). Daca in loc sa scriem de 100 de ori caracterul 'a' scriem '100a' obtinem o economie de 96 octeti. Bineinteles scriind '100a' in locul unde erau cele 100 de caractere nimic nu ne poate arata ca '100a' inseamna de 100 de ori 'a' si nu pur si simplu '100a'. Aceasta problema o rezolvam separand fisierul in doua zone. Vom avea o prima zona unde scriem blocurile mari de octeti identici in forma prescurtata, iar a doua zona are octetii ce nu au putut fi adusi la aceasta forma. Locul unde incepe a doua zona il vom scrie pe primii 4 octeti ai fisierului(suficient pentru fisiere de 4G). Forma prescurtata trebuie sa aiba codul octetului intalnit in blocul uniform (caracter ASCII = 1 octet), numarul de caractere din bloc(4 octeti : marime maxima bloc = 24*8 = 4G) si pozitia acestuia in fisierul initial(4 octeti) , toate aceste informatii insemnand in total 9 octeti/bloc. Daca mai adaugam faptul ca blocurile aduse la forma prescurtata trebuie sa fie mai mari de 9 octeti am terminat modelul nostru de compresie!
Un program ce implementeaza acest model are media compresiei pe fisiere diverse sub a programelor standard de compresie, dar un fisier de cel putin 14 bytes cu octeti identici este redus intotdeauna la 13 bytes ,chiar daca are 10 MB ! Se poate folosi pentru compresia fisierelor ".doc" de mici dimensiuni cu eficienta unui compresor standard(!bineinteles nu avem nici un motiv practic sa compresam separat fisiere de mici dimensiuni... ,eventual din curiozitate!).
Mai jos programul si sursele(11K):