Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТИ_2006_ВСЕ.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
4.19 Mб
Скачать

5.2. Методы сжатия без потерь

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

Кодирование длин серий (rle - кодирование)

Методы RLE – кодирования (Run Length Encoding) являются одними из наиболее старых методов сжатия. Однако благодаря своей простоте и эффективности они до сих пор используются либо непосредственно либо в составе других методов.

При использовании простейшего метода RLE последовательность одинаковых символов заменяется на один символ и число его повторений.

Пример 5.1. Применить метод RLE для сжатия последовательности символов

aaaaaaaaabbbbaaaaabbaaaaaabbbbaaaaaabbaaaacccccddd.

В результате сжатия получается следующая последовательность кодов:

<a, 9>, <b, 4>, <a, 5>, <b, 2>, <a, 6>, <b, 4>, <a, 6>, <b, 2>, <a, 4>, <c, 5>, <d, 3>.

Если считать, что на каждый символ приходится 2 бита (используется четырехсимвольный алфавит), а на длину – 4 бита (длина не превышает 16), то входная и выходная последовательности имеют размеры:

Lвх = 50  2 бита = 100 бит и Lвых = 11  (2 бита + 4 бита) = 66 бит.

Коэффициент сжатия Kсж при этом равен

Kсж = Lвых / Lвх = 66 бит / 100 бит = 0.66.

Недостатком данного метода является увеличение размеров информации (вместо сокращения) в том случае, если сжимаемая последовательность содержит большое число одиночных символов. Поэтому на практике используют различные модификации RLE – кодирования для устранения указанного недостатка.

Пример 5.2. Применить метод RLE для сжатия последовательности символов

aaaaaaaaabbbbabababaaaacccccdaaaaa.

В простейшем случае на выходе будет образована последовательность кодов <a, 9>, <b, 4>, <a, 1>, <b, 1>, <a, 1>, <b, 1>, <a, 1>, <b, 1>, <a, 4>, <c, 5>, <d, 1> <a, 5>, которая имеет размер 12  (2 бита + 4 бита) = 72 бита, тогда как исходная последовательность символов имеет размер 34  2 бита = 68 бит. Однако можно ввести бинарный флаг (размером в 1 бит), нулевое значение которого показывает, что далее следует одиночный символ, а единичное значение – символ и число его повторений. Тогда на выходе появится следующая последовательность кодов: <1, a, 9>, <1, b, 4>, <0, a>, <0, b>, <0, a>, <0, b>, <0, a>, <0, b>, <1, a, 4>, <1, c, 5>, <0, d>, <1, a, 5>, которая имеет размер 5  (1 бит + 2 бита + 4 бита) + 7  (1 бит + 2 бита) = 35 бит + 21 бит = 56 бит. Очевидно, что во втором случае сжатие более эффективно.

Коды Фибоначчи

Методы, основанные на использовании кодов Фибоначчи, относятся к группе методов кодирования представлением целых чисел.

Применение кодов Фибоначчи основано на том, что любое натуральное число можно представить в виде двоичного числа, в котором вес каждой единицы соответствует некоторому числу Фибоначчи. При этом, во – первых, две подряд единицы в таком двоичном числе появиться не могут, а, во – вторых, номер разряда в числе соответствует только одному числу Фибоначчи.

Значения от 1 до 256 (размером в 1 байт) можно закодировать с помощью следующих чисел Фибоначчи: F1 = 1, F2 = 2, F3 = 3, F4 = 5, F5 = 8, F6 = 13, F7 = 21, F8 = 34, F9 = 55, F10 = 89, F11 = 144, F12 = 233.

Пример 5.3. Представить с помощью кодов Фибоначчи числа 1, 20, 150 и 255.

1. Число 1 можно представить как число F1. Тогда оно имеет код Фибоначчи 11.

2. Число 20 можно представить как сумму чисел Фибоначчи:

20 = F6 + F4 + F2 = 13 + 5 + 2.

Это значит, что число 20 имеет код Фибоначчи 1101010.

3. Число 150 можно представить как сумму чисел Фибоначчи:

150 = F11 + F4 + F1.

Это значит, что число 150 имеет код Фибоначчи 110000001001.

4. Число 255 можно представить как сумму чисел Фибоначчи:

255 = F12 + F7 + F1.

Это значит, что число 255 имеет код Фибоначчи 1100001000001.

Сжать данные с помощью кодов Фибоначчи можно следующим образом:

  1. определить частоты каждого символа последовательности;

  2. отсортировать символы в порядке убывания частот;

  3. присвоить номерам символов соответствующие коды Фибоначчи.

В результате данного алгоритма чаще встречающимся символам будут присвоены более коротки коды, чем символам, встречающимся реже.

Пример 5.4. Выполнить сжатие с помощью кодов Фибоначчи последовательности символов

ccccaaccccabcccbbcabcabcacccccdacc.

  1. Определим частоты каждого символа в последовательности:

    Символ

    a

    b

    c

    d

    Частота

    7

    5

    21

    1

  2. Отсортируем символы в порядке убывания частот:

    Символ

    c

    a

    b

    d

    Частота

    21

    7

    5

    1

  3. Присвоим номерам символов соответствующие коды Фибоначчи:

Символ

c

a

b

d

Код

11

110

1100

11000

Если каждый символ исходной последовательности имеет длину 1 байт (8 бит), то длина исходной последовательности равна 272 бита, тогда как после сжатия длина последовательности кодов Фибоначчи равна 21  2 бита + 7  3 бита + 5  4 бита + 1  5 бит = 88 бит. Коэффициент сжатия при этом равен 88 бит / 272 бита  0.32, т. е. на один бит исходной последовательности приходится в среднем 0.32 бита последовательности сжатых данных.