信息论基础:字典编码

文章探讨了在信源编码中,针对具有相关性的符号序列,静态字典和自适应字典(如LZ77和LZW)的使用。静态字典适用于常见模式,而自适应字典如LZ77和LZW能更好地处理动态变化的序列,尤其是当重复模式的周期大于搜索缓存时。LZW是对LZ78的优化,编码过程中无需编码最后一个符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

霍夫曼编码和算术编码,假定信源是独立同分布。实际信源输出的符号序列中,相邻符号具有相关性(例如马尔可夫过程),直接使用前述编码方法,效果不好。下面的编码方法考虑许多信源具有的一种相关性。

信源的输出包含许多重复出现的模式。例如,英文文本中的单词。而其他模式不可能出现,或者概率很低。对于这种信源,一种非常合理的编码方式是建立一个字典(常见模式的列表)。对字典中模式,用索引编码;对其他模式,使用效率较低的方法编码。该方法有效的前提:常见模式数量≪所有可能模式的数量。

假设某文本由4字母单词组成,字母表包括26个小写字母加6个标点符号。基本的编码方法:每个字符需要5 bits,每个单词需20 bits。
建立包含256个最常见单词的字典。

编码方法:如果单词在字典中,编为0加上索引(8 bits);否则,编为1加上20 bits原始编码。

假设字典中模式的概率为𝑝,单词平均比特数为
𝑅=9𝑝+21(1−𝑝)=21−12𝑝
当𝑝>1/12时,𝑅<20 ,优于基本编码方法;当所有模式等概时, 𝑅≈21,差于基本编码方法。

一种静态字典使用双字母组
字典包含所有单字母,此外在字典容量允许范围内,尽可能多包含常见的字母对
例如,为可打印ASCII字符的双字母组编码构造一个大小为256的字典。
字典的前95项是95个可打印ASCII字符,剩下的161项是最常见的字符对(字典空间有限)。
编码方法:
读取两个字符,在字典中检查是否存在。
如果存在,则将相应的索引进行编码;
如果不存在,则对第一个字符编码,第二个字符作为下一个双字母组的第一个字符。
编码器读入另一个字符,组成双字母组,重复以上操作。

某信源的符号集为𝒜={𝑎,𝑏,𝑐,𝑑,𝑟},字典如下表
对以下序列进行编码:𝑎𝑏𝑟𝑎𝑐𝑎𝑑𝑎𝑏𝑟𝑎
结果:101100110111101100000

在这里插入图片描述
由于不同信源的概率分布不同,静态字典的普适性不好。下面对比了Latex文档和C程序中常见的2字母。

自适应字典

自适应字典是为了克服静态字典的不足。多数自适应字典的技术都源于Jacob Ziv和Abraham Lempel在1977和1978年发表的两篇论文。这两篇论文提出了两种自适应构建字典的方法(简称LZ77和LZ78)。

字典是已编码序列的一部分,滑动窗口在输入序列从左到右进行扫描,窗口包括搜索缓存(已编码)和前行缓存(待编码)
为便于解释,下图的滑动窗口较小
为编码前行缓存中的序列,指针在搜索缓存从右往左找与前行缓存第一个符号相同处,再检查后面的符号是否也相同,匹配符号数目为匹配长度。
查找所有位置,找到最长的匹配长度,记录下指针偏移。编码为三元组⟨𝑜,𝑙,𝑐⟩,表示偏移、匹配长度、下一个符号。
例如,下图为⟨7,4,𝑟⟩。如果没有匹配,记⟨0,0,𝑐⟩, 𝑐为当前符号
使用定长编码,三元组bit数为⌈log⁡𝑆 ⌉+⌈log⁡𝑊 ⌉+⌈log⁡𝐴 ⌉, 𝑆搜索缓存大小、𝑊滑动窗口大小(为什么?)、𝐴符号集大小

序列. . . 𝑐𝑎𝑏𝑟𝑎𝑐𝑎𝑑𝑎𝑏𝑟𝑎𝑟𝑟𝑎𝑟𝑟𝑎𝑑 . . .
滑动窗口大小为13,搜索缓存大小为7

原始序列. . . 𝑐𝑎𝑏𝑟𝑎𝑐𝑎𝑑𝑎𝑏𝑟𝑎𝑟𝑟𝑎𝑟𝑟𝑎𝑑 . . .
解码从𝑐𝑎𝑏𝑟𝑎𝑐𝑎开始
三元组为⟨0, 0,𝐶(𝑑)⟩⟨7, 4,𝐶(𝑟)⟩⟨3, 5,𝐶(𝑑)⟩

霍夫曼编码、算术编码均明确利用符号/符号序列的概率分布
对于序列的概率分布, LZ77几乎没有做任何假设
唯一的假设是:相邻的符号容易重复出现
LZ77的软肋:当重复周期大于搜索缓存时,性能恶化(用三元组⟨0,0,𝑐⟩编码每个字符!)

LZ77将刚编码的一段序列(即搜索缓冲区)作为字典;并没有一个独立的字典
LZ78利用所有已编码序列,构建一个字典(编码和解码时,都要构造同一个字典)
输入被编为二元组⟨𝑖,𝑐⟩,𝑖索引,𝑐下一个符号
没有匹配项时,𝑖=0,该二元组加入词典

LZ78

对该序列进行编码

最初字典为空
前3个符号𝑤𝑎𝑏,字典中没有,分别编码为⟨0,𝐶(𝑤)⟩、⟨0,𝐶(𝑎)⟩、⟨0,𝐶(𝑏)⟩,字典中依次加入这三项

第4个符号𝑏,为词典第3项;
如果加上第5个符号𝑎(总是试图找到最长项),词典中没有
因此将𝑏𝑎编为⟨3,𝐶(𝑎)⟩,并将𝑏𝑎加入词典
第6个符号blank,词典中没有,编为⟨0,𝐶(blank)⟩, blank加入词典
依次执行

LZW

Terry Welch对LZ78进行了改进(LZW)
编码器不对二元组⟨𝑖,𝑐⟩中的𝑐进行编码,只记录索引号
最初需要所有单字符的字典,而不能像LZ78那样,随着编码的过程,从头建字典(字典中,有的单字符出现在双字符后)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值