Групповое кодирование или алгоритм сжатия RLE

rle, метод сжатия rle, алгоритм rle

 

Здравствуйте, дорогие пользователи. Сегодня я хотел бы  начать цикл статей, посвященных алгоритмам сжатия данных. Я планирую рассмотреть три основных алгоритма сжатия, а именно алгоритм сжатия rle, алгоритм хаффмана и lzw.

Сегодня я начну рассказывать о простейшем из них: алгоритме rle. Его суть заключается в кодировании повторов. То есть мы берем, например последовательность “CCCCCCCCDDDDEEE” и преобразовываем ее к виду “8C4D3E”.

Простейший алгоритм сжатия RLE:

1. Считываем символы последовательности до тех пор, пока символы повторяются.

2.Считаем количество повторяющихся символов.

3. Записываем в выходной файл количество повторяющихся символов.

4.Затем записываем символ, который повторялся.

Пример реализации функции кодирования последовательности алгоритмом rle на с++  :

 

Функция декодирования rle:

Таким образом видно, что данный алгоритм будет эффективным в применении только в том случае если исходный файл будет иметь большое количество повторяющихся последовательностей байт.

И напоследок приведу пример, где можно применять алгоритм rle для сжатия это простые графические изображения(иконки,графические рисунки)

алгоритм rle, сжатие методом rle, сжатие данных



6 комментариев

  1. А там в функции void de_kod_rle(ifstream& inpf, ofstream& outf) все строки есть?
    Работает некорректно

    Ответить
    • только что проверил. Работает корректно… Может быть вы неправильно передаете аргументы в функцию?

      Ответить
      • А как прописать не функцией, а просто в int main()?
        Содержание ф-ции void kod_rle(ifstream& inpf, ofstream& outf) легко переставить в мейн, а вот void de_kod_rle(ifstream& inpf, ofstream& outf) не получается

        Ответить
  2. std::ifstream f1(“COMPRESSED_TEXT.txt”);

    char sym1,sym2;// предыдущий и последующий символы
    while(f1.peek()!=EOF)
    {
    f1>>sym1>>sym2;// считываем символы
    for(int i=0;i<sym1-48;i++)
    file_decompr<<sym2;
    }
    вот просто в мейне

    Ответить
    • Обнаружил баг
      если в исходном файле прописано AVAVAVAVAVAVAV…, то прога разархивирует сжатый файл, но если AAAAAAAAAAAAAAAAA, то нет)))

      Ответить
      • И еще вопрос
        зачем тут for(int i=0;i<sym1-48;i++) вычитать -48?
        и если эта величина для каждого случая разная, м.б. ее нужно пересчитывать?

        Ответить

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *