Nadesłany przez Tomasz Lubiński, 08 lutego 2012 16:49
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
ByteRun_2.c:
//Algorytm ByteRun
//wersja pakujaca sekwencje powtarzajacych sie conajmniej 2 bajtow
//Tomasz Lubinski
//www.algorytm.org
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//Kompresuje dane uzywajac algorytmu ByteRun
void ByteRunCompress(signed char a[], int length)
{
int i = 0;
//dopoki wszystkie bajty nie sa skompresowane
while (i < length)
{
//sekwencja powtarzajacych sie bajtow
if ((i < length-1) &&
(a[i] == a[i+1]))
{
//zmierz dlugosc sekwencji
int j = 0;
while ((i+j < length-1) &&
(a[i+j] == a[i+j+1]) &&
(j < 127))
{
j++;
}
//wypisz spakowana sekwencje
cout << -j << ", " << (int)a[i+j] << ", ";
//przesun wskaznik o dlugosc sekwencji
i += (j+1);
}
//sekwencja roznych bajtow
else
{
//zmierz dlugosc sekwencji
int j=0;
while ((i+j < length-1) &&
(a[i+j] != a[j+i+1]) &&
(j < 128))
{
j++;
}
//dodaj jeszcze koncowke
if ((i+j == length-1) &&
(j < 128))
{
j++;
}
//wypisz spakowana sekwencje
cout << (j-1) << ", ";
for (int k=0; k<j; k++)
{
cout << (int)a[i+k] << ", ";
}
//przesun wskaznik o dlugosc sekwencji
i += j;
}
}
}
//Rozpakowywuje dane uzywajac algorytmu ByteRun
void ByteRunDecompress(signed char a[], int length)
{
int i = 0;
//dopoki wszystkie bajty nie sa zdekompresowane
while (i < length)
{
//kod pusty
if (a[i] == -128)
{
i++;
}
//sekwencja powtarzajacych sie bajtow
else if (a[i] < 0)
{
for (int j=0; j<-(a[i]-1); j++)
{
cout << (int)a[i+1] << ", ";
}
i += 2;
}
//sekwencja roznych bajtow
else
{
for (int j=0; j<(a[i]+1); j++)
{
cout << (int)a[i+1+j] << ", ";
}
i += a[i]+2;
}
}
}
//Przyklad wywolania
int main()
{
//przykladowe dane do spakowania
signed char a[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 2, 1, 3};
ByteRunCompress(a, 23);
cout<<"\n";
//przykladowe dane do rozpakowania
signed char b[] = {-4, 0, 5, 1, 2, 3, 4, 5, 6, -2, 7, -5, 8, 2, 2, 1, 3};
ByteRunDecompress(b, 17);
cout<<"\n";
system("PAUSE");
}

