Коды Голомба: различия между версиями

Материал из in.wiki
Перейти к навигации Перейти к поиску
(Первый блин, сделан на основе статьи "Унарный код")
 
м (58 версий импортировано: Импорт из Википедии)
 
(не показано 57 промежуточных версий 37 участников)
Строка 1: Строка 1:
'''Коды Голомба''' — это семейство[[энтропийное кодирование|энтропийных кодеров]], которое представляет число в виде двоичного слова, состоящего из бинарного и [[Унарное кодирование|унарного кода]]. Для кодирования числа ''n'' производится деление ''n'' на ''m'', где ''m'' основной параметр кода Голомба. Частное от деления записывается в унарной форме, остаток в бинарной.
+
'''Коды [[Голомб, Соломон Вольф|Голомба]]''' — семейство [[энтропийное кодирование|энтропийных кодов]]. Под кодом Голомба может подразумеваться также один из представителей этого семейства.  
  
Пример:
+
Рассмотрим источник, независимым образом порождающий целые неотрицательные числа <math>i</math> с вероятностями <math>P(i) = (1-p)p^{i}</math>, где <math>p</math> — произвольное положительное число, не превосходящее 1, то есть источник, описываемый [[Геометрическое распределение|геометрическим распределением]]. Если при этом целое положительное число <math>m</math> таково, что
основной параметр кода
 
:m =
 
кодируемое число  
 
:n = 13
 
  
частное 
+
: <math>p^m = \frac 1 2 </math>,
:q = <math>[\frac{n}{m}]</math> = <math>[\frac{13}{4}]</math> = 3
 
унарный код
 
:1110
 
  
остаток
+
то оптимальным посимвольным кодом (то есть кодом, ставящим в соответствие каждому кодируемому символу определённое кодовое слово) для такого источника будет код, построенный в соответствии с предложенной [[Голомб, Соломон Вольф|Соломоном Голомбом]] процедурой, согласно которой для любого кодируемого числа <math>n</math> при известном <math>m</math> кодовое слово образуют [[Унарное кодирование|унарная запись]] числа <math>q = \left[ \frac{n}{m}\right]</math> и кодированный в соответствии с описанной ниже процедурой остаток <math>r</math> от деления <math>\frac{n}{m}</math>:
:r = <math>\{\frac{n}{m}\}</math> = <math>\{\frac{n}{m}\}</math> = 1
 
бинарный код
 
:01
 
  
результирующее кодовое слово
+
# Если <math>m</math> является степенью числа 2, то код остатка представляет собой двоичную запись числа <math>r</math>, размещённую в <math>\log_2(m)</math> битах.
:1110|01
+
# Если <math>m</math> не является степенью 2, вычисляется число <math>b = \lceil\log_2(m)\rceil</math>. Далее:
  
Код Голомба оптимален для [[распределение вероятности|распределения вероятности]]:
+
:: Если <math>r < 2^b-m </math>, код остатка представляет собой двоичную запись числа <math>r</math>, размещённую в <math>b-1</math> битах,
 +
:: иначе остаток <math>r</math> кодируется двоичной записью числа <math>r+2^b-m</math>, размещённой в <math>b</math> битах.
  
: <math>P(i) = (1-p)p^{i}</math>
+
Позже [[Галлагер, Роберт|Р. Галлагером]] и Д. Ван Вурхисом было показано, что предложенный Голомбом код оптимален не только для дискретного набора значений <math>p</math>, удовлетворяющих приведённому выше критерию, но и для любых <math>p</math>, для которых справедливо двойное неравенство
  
 +
: <math>p^{m} + p^{m+1} \le 1 < p^{m} + p^{m-1}</math>,
 +
 +
где <math>m</math> — целое положительное число. Поскольку для любого <math>p</math> всегда найдётся не более одного значения <math>m</math>, удовлетворяющего приведённому выше неравенству, предложенная С. Голомбом процедура кодирования геометрического источника оказывается оптимальной для любого значения <math>p</math>.
 +
 +
Чрезвычайно простая в реализации, но не всегда оптимальная разновидность кода Голомба в случае, когда <math>m</math> является степенью 2, называется кодом Райса.
 +
 +
== Пример ==
 +
 +
Пусть <math>p = 0.85</math>, требуется закодировать число <math>n = 13</math>.
 +
 +
Удовлетворяющее двойному неравенству Галлагера — Ван Вурхиса значение <math>m = 4</math>.
 +
 +
В соответствии с описанной выше процедурой кодирования кодовое слово, соответствующее кодируемому числу 13, строится как унарная запись частного от деления n/m:
 +
: <math> q = \left[ \frac{n}{m} \right] = \left[\frac{13}{4} \right] = 3 </math>,
 +
 +
(унарный код <math> 0001 </math>, то есть q нулей с завершающей единицей),
 +
 +
и кодированного остатка
 +
 +
: <math>r = 1</math>,
 +
 +
(код <math> 01 </math>, то есть собственно остаток, записанный в <math>\lceil\log_2(m)\rceil</math> битах).
 +
 +
Результирующее кодовое слово
 +
: <math> 0001|01 </math>
 +
 +
== См. также ==
 +
* [[Экспоненциальный код Голомба]]
 +
 +
== Ссылки ==
 +
* {{статья|ссылка=http://urchin.earth.li/~twic/Golombs_Original_Paper/|автор=S. W. Golomb.|заглавие=Run-length encodings|издание=IEEE Trans. Inf. Theor|год=1966|номер=3, IT-12|pages=399—401}}
 +
* {{статья|ссылка=http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?reload=true&arnumber=1055357|автор=R. G. Gallager, D. C. Van Voorhis.|заглавие=Optimal source codes for geometrically distributed integer alphabets|издание=IEEE Trans. Inf. Theor|год=1975|номер=2, IT-21|pages=228—230}}
 +
* {{статья|ссылка=http://dx.doi.org/10.1109/TCOM.1971.1090789|автор=R. F. Rice, J. R. Plaunt.|заглавие=Adaptive Variable-Length Coding for Efficient Compression of Spacecraft Television Data|издание=IEEE Trans. on Commun|год=1971|volume=16(9)|pages=889—897}}
 +
* [http://www.hpl.hp.com/techreports/2006/HPL-2006-74.pdf#page=18 2.3 Golomb Codes] / Amir Said, On the Determination of Optimal Parameterized Prefix Codes for Adaptive Entropy Coding. HPL-2006-74
 +
 +
{{методы сжатия}}
 +
 +
[[Категория:Теория кодирования]]
 
[[Категория:Алгоритмы сжатия без потерь]]
 
[[Категория:Алгоритмы сжатия без потерь]]
 
[[en:Golomb coding]]
 

Текущая версия от 00:56, 20 августа 2025

Коды Голомба — семейство энтропийных кодов. Под кодом Голомба может подразумеваться также один из представителей этого семейства.

Рассмотрим источник, независимым образом порождающий целые неотрицательные числа i i с вероятностями P ( i ) = ( 1 p ) p i P(i) = (1-p)p^{i} , где p p  — произвольное положительное число, не превосходящее 1, то есть источник, описываемый геометрическим распределением. Если при этом целое положительное число m m таково, что p m = 1 2 , p^m = \frac 1 2 ,

то оптимальным посимвольным кодом (то есть кодом, ставящим в соответствие каждому кодируемому символу определённое кодовое слово) для такого источника будет код, построенный в соответствии с предложенной Соломоном Голомбом процедурой, согласно которой для любого кодируемого числа n n при известном m m кодовое слово образуют унарная запись числа q = [ n m ] q = \left[ \frac{n}{m}\right] и кодированный в соответствии с описанной ниже процедурой остаток r r от деления n m \frac{n}{m} :

  1. Если m m является степенью числа 2, то код остатка представляет собой двоичную запись числа r r , размещённую в log 2 ( m ) \log_2(m) битах.
  2. Если m m не является степенью 2, вычисляется число b = log 2 ( m ) b = \lceil\log_2(m)\rceil . Далее:
Если r < 2 b m r < 2^b-m , код остатка представляет собой двоичную запись числа r r , размещённую в b 1 b-1 битах,
иначе остаток r r кодируется двоичной записью числа r + 2 b m r+2^b-m , размещённой в b b битах.

Позже Р. Галлагером и Д. Ван Вурхисом было показано, что предложенный Голомбом код оптимален не только для дискретного набора значений p p , удовлетворяющих приведённому выше критерию, но и для любых p p , для которых справедливо двойное неравенство p m + p m + 1 1 < p m + p m 1 , p^{m} + p^{m+1} \le 1 < p^{m} + p^{m-1},

где m m  — целое положительное число. Поскольку для любого p p всегда найдётся не более одного значения m m , удовлетворяющего приведённому выше неравенству, предложенная С. Голомбом процедура кодирования геометрического источника оказывается оптимальной для любого значения p p .

Чрезвычайно простая в реализации, но не всегда оптимальная разновидность кода Голомба в случае, когда m m является степенью 2, называется кодом Райса.

Пример[править | править код]

Пусть p = 0.85 p = 0.85 , требуется закодировать число n = 13 n = 13 .

Удовлетворяющее двойному неравенству Галлагера — Ван Вурхиса значение m = 4 m = 4 .

В соответствии с описанной выше процедурой кодирования кодовое слово, соответствующее кодируемому числу 13, строится как унарная запись частного от деления n/m: q = [ n m ] = [ 13 4 ] = 3 , q = \left[ \frac{n}{m} \right] = \left[\frac{13}{4} \right] = 3 ,

(унарный код 0001 0001 , то есть q нулей с завершающей единицей),

и кодированного остатка r = 1 , r = 1,

(код 01 01 , то есть собственно остаток, записанный в log 2 ( m ) \lceil\log_2(m)\rceil битах).

Результирующее кодовое слово 0001 | 01 0001|01

См. также[править | править код]

Ссылки[править | править код]

Ошибка Lua в Модуль:Navbox на строке 353: attempt to index local 'listText' (a nil value).