Pierwsza sprawa chyba cos procenty sie popiepszyly, bo 70+15+10+6=101, a chyba powinno wyjsc 100 :) zalozylem wiec, ze jest 70+15+10+5.
Dalej: Budujemy drzewo huffmana i wychodzi nam cos takiego:
100
/ |
/ 30
/ / \
| | 15
| | | \
70 15 10 5
Oznaczmy kodowane znaki przez A(70%), B(15%), C(10%), D(5%). Przyporzadkowanie ciagow prefiksowych moze byc nastepujace:
A: 1
B: 01
C: 001
D: 000
Dalej mozemy zostosowac RLE wypelniajac do pelnych nibli, gdzie wypelnienie to ilosc powtorzen danego znaku. Jako ze kombinacji jest tylko szesnascie, to wszystkie je tu wypisze:
1000 : A
1001 : AA
1010 : AAA
1011 : AAAA
1100 : AAAAA
1101 : AAAAAA
1110 : AAAAAAA
1111 : AAAAAAAA
0100 : B
0101 : BB
0110 : BBB
0111 : BBBB
0010 : C
0011 : CC
0000 : D
0001 : DD
Kompresja banalna. (szukamy podanego tu wzorca i zastepujemy go odpowiednim kodem). Dekompresja banalna (Mozemy nawet stablicowac i to po dwa kody na raz bo ładnie mieszcza sie w bajcie: wystarczy pamietac 256 adresow rozkompresowanych ciagow terminowanych jakims 5. znakiem). Stopien kompresji bliski optymalnemu. (Huffman jest optymalny. sa nawet dowody. O RLE trudno mi tak z palca cos powiedziec). Jezeli komus sie chce optymalizowac, mozna sprobowac innego wypelnienia RLE np 3,5,6,7,8 bitow. Mozna napisac program, ktory kompresuje na dana dlugosc przykladowe/reprezentatywne dane i sprawdzic, ktora metoda daje najlepsza kompresje, z tym, ze procedury nie beda juz tak trywialne.
Recznie sie pobawilem kompresujac kodami 3,4 i 5 bitowymi oraz czystym huffmanem (czyli same kody prefiksowe bez RLE) Twoje przyklady i wyszly mi skompresowane dane o dlugosci (w bajtach):
bity przyklad1 przyklad2
huff 32 28
3 27 30
4 22 34
5 19 38
Pierwszy przyklad zawieral duzo powtorzen, a wiec idealnie dla RLE i czym wiecej bitow tym byl bardziej zadowolony. Drugi przyklad mial mniej powtorzen i RLE na niewiele sie zdalo i najefektywniejszy okazal sie sam huffman.
Jak widac metoda jest bardzo uzaleazniona od konkretnego przykladu (chociaz 4 bity to taka chyba srednia i chyba najlepszy wybor), wiec przy odrobinie fanatyzmu kompresowac mozna wszystkimi i wybierac dla kazdego przykladu osobno metode najlepsza. Kod troche puchnie, ale stopien kompresji bedzie dobry.