Методы эффективного кодирования числовых последовательностей

Различают два метода – разностное кодирование и кодирование повторений.

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

2 14 18 27 34

первый способ даст последовательность:

2 12 4 9 7.

Этот метод эффективен для медленно меняющихся последовательностей. Его недостаток состоит в том, что для получения значения n-го члена последовательности надо декодировать все предыдущие (n-1) членов.

Второй способ порождает последовательность:

-17 -5 -1 8 15,

поскольку среднее значение для исходной последовательности - 19.

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

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

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

Кодирование повторений заключается в замене цепочки одинаковых цифровых символов самим символом и числом повторений (возможно включение разделителей). Например, для последовательности:

применение этого способа даст последовательность:

5(4)6(4)8(6),

где круглые скобки играют роль разделителей.

Данный метод может быть использован для эффективного кодирования растровых форматов изображений. Растровыми называются форматы изображений, которые получаются во время ввода изображения путем кодирования каждой точки – пиксела (pixel – PI сture EL ement) – двумерного пространства, на котором расположено исходное изображение, даже если эта точка не содержит самого изображения. Например, на рисунке

пространство изображения – воображаемый прямоугольник, включающий само изображение функции вместе с осями координат и введенными обозначениями. Очевидно, изображение занимает не все пространство. Тем не менее, кодированию подлежат и «пустоты», при этом те точки, которые содержат изображение, в простейшем случае кодируются двоичной 1, точки без изображения кодируются двоичным 0 (подробнее о восприятии изображений см. далее). В результате получаются числовые последовательности, подобные следующей:

00000000000000000000000000000000000000000000000010000000000000000000.

Переведем эту двоичную последовательность в набор шестнадцатеричных цифр, используя тетрады. Получим последовательность шестнадцатеричных цифр:

00000000000080000.

Очевидно, к таким последовательностям можно применить метод кодирования повторений. В результате для нашего случая получим (круглые скобки используем как разделители):

0(С)8000,

что означает: 0 повторяется 12 раз (С16 = 12), для остальных символов число повторений не вводится.

Поскольку результирующая последовательность должна также быть шестнадцатеричной, полученное выражение преобразуем следующим образом: заменим круглые скобки соответствующими ASCII-кодами. Тогда открывающей скобке соответствует код 2816, закрывающей – 2916. Получим:

028С2980000.

Длина результата меньше исходной последовательности (11 символов против 17), поэтому получен эффект в 6 символов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: