Data Compression学习笔记一:Golomb编码

本文深入探讨了Golomb编码的原理与应用,这是一种基于游程编码的无损数据压缩方式,尤其适用于几何分布的数据集。文章详细介绍了编码过程,包括参数m的选择,商q与余数r的计算,以及如何利用一元编码和二进制编码实现高效压缩。

Data Compression学习笔记一:Golomb编码

前置知识:一元编码(Unary Coding)

一元编码(Unary coding)是一种简单的只能对非负整数进行编码的方法,对于任意非负整数num,它的一元编码就是num个1后面紧跟着一个0,或者num个0后面紧跟着一个1,具体哪种情况需要协议的约定,如无特殊约定,一般默认使用第一种。
numunary coding001102110311104111105111110\begin{array}{c|c} \text{num} & \text{unary coding} \\ \hline 0 & 0\\ 1 & 10\\ 2 & 110\\ 3 & 1110\\ 4 & 11110\\ 5 & 111110\\ \end{array}num012345unary coding010110111011110111110

Golomb编码基本原理

Golomb编码是一种基于游程编码(run-length encoding,RLE)的无损的数据编码方式,当待压缩的数据符合几何分布(Geometric Distribution)时,Golomb编码取得最优效果。
举个游程编码的例子,如以下的待编码的二进制串,

00000100110001010000001110100010000010001001000110100001001

该串含有18个游程,5, 2, 0, 3, 1, 6, 0, 0, 1, 3, 5, 3, 2, 3, 0, 1, 4, 和2。其平均值是(5+2+0+3+1+6+0+0+1+3+5+3+2+3+0+1+4+2)/18 ≈ 2.28;对游程长度进行排序,获得其中位数2。

0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6

我们用p来表示二进制串中0出现的概率,那么1出现的概率就是1-p;显然,较大的p表明有更高的概率出现长游程,较小的p暗示长游程数量较少。
对于待编码的非负整数n,Golomb码会选择一个参数m来对整数n进行编码。参数m的选择取决于概率p和游程长度的中位数。
为了获得非负整数n的Golomb编码,我们需要根据选择的m计算三个数据:商q(quotient),余数r(remainder),和c。
q=⌊nm⌋,r=n−qm,c=⌈log2m⌉ q = \biggl\lfloor\frac{n}{m}\biggr\rfloor,\quad r = n - qm,\quad c = \lceil log_2m\rceil q=mn,r=nqm,c=log2m
Golomb编码由两部分构成,第一部分是使用一元编码(Unary)表示的商q;第二部分是使用特殊方式编码的二进制值余数r。余数r的取值可能是

0, 1, 2, 3,…,m-2,m-1

对于待编码的非负整数n而言,其拥有的余数个数不大于m;我们注意到2c−m≤2c−12^c-m \leq 2^{c-1}2cm2c1显然成立,所以对于其前2c−m2^c-m2cm个余数,它们以无符号整数的方式进行编码,并可以存储在c-1个比特位中。剩下的余数以无符号整数的方式编码,并存储在c个比特位中(以最大的c比特整数结束)。当m等于2的整数次幂(m=2cm=2^cm=2c)时比较特殊,此时不需要任何(c-1)位的编码(由Robert F.Rice发展,因此也被称为Rice码)。
我们知道n=r+qmn=r+qmn=r+qm;所以对于任何已知参数m的Golomb编码,我们可以使用商q和余数r轻易地重构出n。

Golomb编码示例

选择m=3m=3m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值