Здравствуйте, дорогие пользователи. Сегодня я хотел бы начать цикл статей, посвященных алгоритмам сжатия. Я планирую рассмотреть три основных алгоритма сжатия, а именно алгоритм rle, алгоритм хаффмана и lzw.
Сегодня я начну рассказывать о простейшем из них: алгоритме rle. Его суть заключается в кодировании повторов. То есть мы берем, например последовательность “CCCCCCCCDDDDEEE” и преобразовываем ее к виду “8C4D3E”.
Алгоритм RLE или алгоритм сжатия
1. Считываем символы последовательности до тех пор, пока символы повторяются.
2.Считаем количество повторяющихся символов.
3. Записываем в выходной файл количество повторяющихся символов.
4.Затем записываем символ, который повторялся.
Пример реализации функции кодирования последовательности алгоритмом rle на с++ :
void kod_rle(ifstream& inpf, ofstream& outf)
{
char sym;//символ, который мы будем считывать
int kol=1;// количество повторяющихся символов
while(!inpf.eof())
{
inpf.get(sym);//считываем символ
if(sym!=inpf.peek())// если символ не совпадает со слеующим
// символом в файле
{
outf<<kol<<sym;// записываем результаты в выходной файл
kol=0;
}
kol++;
}
}
Функция декодирования rle:
void de_kod_rle(ifstream& inpf, ofstream& outf)
{
char sym1,sym2;// предыдущий и последующий символы
while(inpf.peek()!=EOF)
{
inpf>>sym1>>sym2;// считываем символы
for(int i=0;i<sym1-48;i++)outf<<sym2;
}
}
Таким образом видно, что данный алгоритм будет эффективным в применении только в том случае если исходный файл будет иметь большое количество повторяющихся последовательностей байт.
И напоследок приведу пример, где можно применять алгоритм rle для сжатия это простые графические изображения(иконки,графические рисунки)