stringtranslate.com

Код переменной длины

В теории кодирования код переменной длины — это код , который отображает исходные символы в переменное число битов . Эквивалентное понятие в информатикебитовая строка .

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

Примерами известных стратегий кодирования переменной длины являются кодирование Хаффмана , кодирование Лемпеля–Зива , арифметическое кодирование и контекстно-адаптивное кодирование переменной длины .

Коды и их расширения

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

Используя термины формальной теории языка , точное математическое определение выглядит следующим образом: Пусть и будут двумя конечными множествами, называемыми исходным и целевым алфавитами соответственно. Код — это общая функция [1], отображающая каждый символ из в последовательность символов над , а расширение в гомоморфизм из в , который естественным образом отображает каждую последовательность исходных символов в последовательность целевых символов, называется его расширением .

Классы кодов переменной длины

Коды переменной длины могут быть строго вложены в порядке убывания общности как неединственные коды, уникально декодируемые коды и префиксные коды. Префиксные коды всегда уникально декодируемы, а они в свою очередь всегда неединственны:

Несингулярные коды

Код является невырожденным , если каждый исходный символ отображается в отдельную непустую битовую строку, т.е. отображение исходных символов в битовые строки является инъективным .

Уникально декодируемые коды

Код однозначно декодируется, если его расширение § не является единичным. Является ли данный код однозначно декодируемым, можно определить с помощью алгоритма Сардинаса–Паттерсона .

Префиксные коды

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

Пример кодирования и декодирования:
aabacdab → 00100110111010 → |0|0|10|0|110|111|0|10| → аабакдаб

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

Другим особым случаем префиксных кодов являются коды LEB128 и коды переменной длины (VLQ), которые кодируют произвольно большие целые числа как последовательность октетов, т. е. каждое кодовое слово кратно 8 битам.

Преимущества

Преимущество кода переменной длины заключается в том, что маловероятным исходным символам можно назначить более длинные кодовые слова, а вероятным исходным символам можно назначить более короткие кодовые слова, что дает низкую ожидаемую длину кодового слова. Для приведенного выше примера, если вероятности (a, b, c, d) были , ожидаемое количество бит, используемых для представления исходного символа с использованием приведенного выше кода, будет:

.

Поскольку энтропия этого источника составляет 1,75 бита на символ, этот код сжимает источник настолько, насколько это возможно, чтобы его можно было восстановить с нулевой ошибкой.

Смотрите также

Ссылки

  1. ^ ab Этот код основан на примере, найденном в Berstel et al. (2009), Пример 2.3.1, стр. 63.

Дальнейшее чтение