二元最佳前缀码_信息与编码系列(二)最优码——Huffman码
目录序
最优性(Optimality)
二元Huffman码
Huffman平均码长和最优性证明
元Huffman码与源的扩展
序
这篇文章主要是对教材第二个chapter的讨论。
对于Huffman码来说,其实很熟悉了,只要涉及到编码的问题多少会涉及到这个算法。一般来讲都是
元码的特殊情形。像离散数学、计算机网络、计算机图像处理等课程都有所涉及。
当初在学习的时候,一直有个疑问——单独来论最短平均码长,Huffman码并不是最优的。但是经过上文的讨论,可以明确——Huffman码是在及时性的约束下的最短平均码长。所以,这至少能得出:Huffman码得到的结果至多为一个集合。
纵观这篇文章来看,其实Huffman码并不是具体的一种编码方式,而是一种通过合并的方式来找最优解的思想。在某一个特定序的排列下,通过合并后几个来构造一个序列,从而每一列都是该情形下的最优解,从而最终结果是最优的。最后的内容会结合一点信息熵的内容,算是原书中的承上启下吧。
总的来说,本文会涉及:最优性的定义、二元Huffman码、Huffman码的平均码长计算与最优性证明、
元Huffman码及源扩展。
其中出Huffman算法的python 代码。
ps:其实要想掌握内容,书上的example和exercise还是自己动手算一算吧,其实都挺基础的。。。还有,我后面打算从动机的角度来说书,说动机呢,我都会拿一些数学的例子来打比方,较为适合数学系且有兴趣的童鞋来看。。。
最优性(Optimality)
之前对源关于概率的描述,有
其中
对于源为
的码
,其码长分别为
,则其平均码长为
一般为了经济和效率,我们希望这个平均码长越小越好。所以在给定的
和概率分布
,尝试找出
元立即码使平均码长最小。这种码叫做最优码,抑或为紧致码(compact)。
这就相当于给出特定的约束,找到某个线性泛函极值的向量。譬如说,给出一个正定的
次型,问你,它的最大值或最小值。可以考虑找到某一个基底,将其化为标准型,在相应基底下的可行范围内找到最优解。而对于这个最优码来说,首先它已经帮你化成标准型了,而且还是正定的,约束条件就是即时码的条件。
AB是椭圆上到原点距离最短的线段
至于怎么个找法,还是初步看来还是要通过构造树的方式来做。不过为了能够有的放矢,可以先进一步讨论下最优性到底有哪些特点。(实际上,直接翻译过来的几何模型是在
维空间下的
维超平面的格点中,选择第
维中最小的格点,不过,这样就很难想象了。)
按照解析几何的做法来看,就让权重最小的尽可能拉满,权重最大的尽可能最小。为验证这种想法是否正确,可以考虑有一个最优码,任取其中
,其中对应的字长为
和
,所以计算
从而能推出
(为什么是要考虑对换的方式呢?因为这个构造的过程是要满足即时性,所以可选的编码就那么几个了。)所以,按照这种想法来编码是正确的!
由上一篇文章的最后一个推论得到引理 给定一个源
和整数
,关于
的唯一可解
元码的全部平均码长
的集合等于相应的即时码。
回顾之前的推论:存在一个字长分别为
的
元立即码iff存在那样的一个唯一可解码。
它之解释了存在性,譬如对于
元码,字长分别为
,姑且用
来表示。于是商去对称的部分,只需要考虑如下六种便能得出立即吗与唯一可解码的比例,如下
是
的关系所以说,数量上是无法。
所以上面的那个引理是想说,按照平均码长求商集,然后考虑唯一可解码的商集是和即时码的商集相等的。举个例子,在某个条件要求下(源
,
元码),只考虑唯一可解码的情况,对于所有的编码情况有平均字长集合
,则即时码的集合也应该与之相等。这就意味着,考虑唯一可解码的最优性并不影响它是否是即时码与否。从而对于同样的问题,可以从更弱的条件入手,放宽了所考虑的约束。
在实数公里中,有那么一条原理(确界原理):即有界必有确界。已知,平均码长有下界——
是其中一个,那么肯定有下确界。但问题是,对于平均码长集合,有无数个。能不能取的到这个最小下界呢?那么问题来了,都能列举出来,那还不能取到么?譬如,
有下界且下确界为
,但是
。
其实,有一个证明思路,就是对于无限集中某一个元素作为上界,该集合小于这个上界的子集是有限集,那么就能确定最小下界。考虑
时的编码,对于任意的源
都存在编码
,不妨考虑等码长的编码,其中有
根据上一篇文章的Kraft不等式,能确定,它是即时的。这样,就相当于找到了那么一个子集的上界
,然后下面探讨编码
且
时平均码长的情形有限。这时,需要一点分析上(微积分\数学分析中)的技巧——用局部最值估计整体最值。所以,考虑源码中概率最小值记为
,然后
的码长,姑且记为
,必须满足如下关系
(这里说说
是怎么来的,就是将源中码的概率从大到小排列,第
之后时,后面全部概率为
,从而平均码长可以将后面的忽略不计~)。如果上面不等式不成立的话,则有
矛盾。
这样就有有限多种码字
满足
,即有限多种组合
,而无限多种组合对于平均码长并没有任何影响。该子集是个有限集合,可以去得到最小值。即有定理 任意源码
都有最优的
源码,其中
(这一小节在书上最后有一道题,用几何的语言来证明刚刚的那个定理。几何化的语言参考本文该小节一开始的部分即可。在描述时,将码长当做
维空间的点,而概率可视为该空间上的线性泛函。)
二元Huffman码
该方法是Huffman在1952年引入,用于获得最优码的一个方法。这一小节为了方便讨论,只考虑
元码的情形,即
。对于一个给定的源,将其中的源码按照概率从大到小排列,即得到
对应的概率有
然后我们考虑通过“融合(amalgamate)”倒数后两个符号的方式,临时地得到一个缩减源(reduce sorce),记为
。就是得到
,表示“析取”的意思(就是把新得到的源码当成两个源码的)。对应的,概率则变为
。最终
将有
个元素。
那么编码如何处理呢?对于
来说,如果将
编码为
,其中
,此外,将
编码为
那么
中倒数后两个编码分别将
和
编为
和
我们从前一篇文章知道,即时码iff前缀码。于是有如下引理,引理 如果
是立即码,那么
也是。
于是,按照这一方法,能够归纳地得到如下序列
对应地,集合中元素分别为
。
对于
是所有源码的并集,其概率为
,编码时用空字
来为其编码,即
。然后,
于是乎,就有
所以
就是Huffman码。显然,
满足及时性。
一般来说,Huffman的编码得到的结果并不唯一(尤其上面的链有一个节点出现多个概率相同的源码)。而且对于特定的最优码,概率方差越大,平均码长通常会变小(这一点需要引进熵来进行描述)。
给出该算法的python代码(可以用来做
元码):
def reduce_S(k,v,r=2):
if len(k)>1:
for i in range(len(k)):
for j in range(len(k))[i+1:]:
if v[i]
a,b = v[i],k[i]
v[i],k[i] = v[j],k[j]
v[j],k[j] = a,b
k = k[:-r]+[k[-r:]]
v = v[:-r]+[sum(v[-r:])]
return reduce_S(k,v,r)
return k,v
def code(s0,r=2,cd='',):
for i in range(len(s0)):
t = cd+str(i)
if type(s0[i])==list:
code(s0[i],r,t)
elif type(s0[i])==str:
s0[i]=(s0[i],t[1:])
return s0
def Huffman(k,v,r=2):
while True:
if r==2:
break
if len(k)%(r-1)==1and r>2:
break
k.append('none')
v.append(0)
S = reduce_S(k,v,r)
c = code(S[0],r)
return c
if __name__=='__main__':
k = ['s1', 's2', 's3', 's4', 's5','s6']
v = [0.4, 0.3, 0.1, 0.1, 0.06,0.04]
print(Huffman(k,v,2))
Huffman平均码长和最优性证明
从前面可以知道,对于编码
称为
,前
的字都没有变化,唯独
倒数后两个字缩为
中最后一个字,且概率是前两者的和,且合并后的字长减
。于是,这两个编码的平均码长求差,可以得到
又因为
所以
于是有相应算法
def cal_avglen(v,r=2):
e = []
while True:
if r==2:
break
if len(v )%(r-1)==1and r>2:
break
v.append(0)
while True:
v.sort(reverse=True)
k = sum(v[-r:])
v = v[:-r]+[k]
e.append(k )
if len(v)==1:
break
print(v,e)
return sum(e)
(同样可适应
元码。)
对于最优性前面已经证明它的存在性了。但是对于Huffman码是否是最优的,目前还不能下定论(只是直觉上最优)。和分析中的方法类似,证明xxx满足最优,可以先假设一个已经得到最优的码,观察其特点,然后将它和Huffman码进行比较,判断Huffman码是否也有可以被判定为最优码的条件。
所以下面需要介绍一个概念,叫做码的sibiling。这个单词我不太知道如何翻译,它是指在
元码的前提下,对于某两个字
,存在一个字
,可以有如下表示
于是有如下引理:引理对于每一个源
的最优
元码
其最长的两个最长的两个码字是sibling的。
证明:
前面已经证明最优码的存在性,所以可以先选一个
最小的一个最优码(因为字长求和肯定是个正整数,所以一定可以取到最小值)。
然后可以假设,对于最长的链可写作
。那么必然有
(这样命题就成立了)。若不然,以
为前缀的码只有
。因为最优码保证前缀码,所以
也可以作为
的编码,那么将其替换,从而得到一个新的编码
,从而
而且
。与
的最小假设相矛盾。从而命题得证~
下面证明定理:定理 如果源
的二元Huffman码,则为源
的最优码。
证明:
及时性在前面已经得证,这就证明平均码长最小即可。
不妨可以用归纳法来证明,
是显然成立的。下面可以假设任意
时的Huffman码是最优的,来证明
时的Huffman最优。
对于最优码,有
,所以,他有两个吹长的字为
,其码分别为
。于是就有
。
如果
,那么可以考虑
,将原先对他们的编码进行调换,得到新的编码
。仅这两个源字的字进行调换后,其平均码产的差为
这是因为
。因为前面假设了
的最优性,从而可以得到
,从而
最优。因此,
是可以的。
对于
来说,可以有
,这一点类似于从
到
一样。那么由前面关于这种情况下的平均码长的变化则有
从而有
到这一步,我们应该知道,
是最优的,
是Huffman的,所以LHS至少应该不大于
,。又因为根据假设,
是最优的,所以RHS应该不小于
.于是上式等于
。也就是说Huffman码的平均码长等于最优码的平均码长。定理得证。
元Huffman码与源的扩展
对于
元的情形,需要知道
元码在做Huffman过程时都发生什么事情。对于一个给定的源
,如果里面一共有
个源码,那么每迭代一步
元码下的步骤,都会少
个。对于
元码,则应该少
的情况。此外,最重要的是,到了最后一步,必须智能剩下一个空字
。所以,这就不得不在进行多元算法之前,新区判断
是否成立,如果不成立,就需要往里面补充一些概率为
的占位符。
至于Huffman编码程序和平均字长的计算程序,都已经给出,这里就不多赘述了。
对于扩展,书中是在做“再编码”。怎么说呢?原来就好比只有源码
,对着三个符号进行编码。而扩展,就是对
进行再编码,因为
所以得到的“新”的
个编码概率和同样为
。
管上面的步骤叫做源
的
次扩展,记为
。可以想象投色子,(扔好几次时,朝上面值的组合的概率。)
前面提到过,如果方差越大,则编码的效率越高。对于非等概率的源来将,分别取最大和最小两个概率
,能够发现
所以扩展的次数越多,效率越高。
严格来说,这种扩展式的码已经不算是
的码(code)。因为它的码显然已经有了。但是呢,这种多次编码的方式,可以让我们对
的信息(information)进行编码,所以就叫做
的编码(coding)。所以从这里开始,要区分code和coding的区别了,一个是单纯从符号上的转换,一个是从内容上的转换。
就好比说,电脑中,每一个指令都是一大串二进制。不论怎么编码,它的复杂性肯定是不变的。但是经过长期使用发现,某种指令集合很少有改动,甚至从来没哟变过。那么下次再使用这个指令的时候,可以把它编码成一个短的指令,得到一个新的编码集。这就完成了从机器语言到汇编语言到高级语言的飞跃~
这是,能够发现,进行扩展后的码不在具有即时性了,因为每次翻译需要多往后读几个字。
最后,可以引出一个问题,为下一章的开始做铺垫。那就是,通过计算可以发现
(就是对源
进行
次扩展后的码)它的平均码长,即
是单调减少的(从特定的几个例子算出来并观察到的)。那么,如果
趋于无穷会怎样?
二元最佳前缀码_信息与编码系列(二)最优码——Huffman码相关推荐
- 信息论与编码_信息与编码系列(五)不可靠信道——决策法则、Hamming距离与信息论基本定理...
目录 序 决策法则(decision rules) Hamming距离 信息论基本定理--Shannon 定理 Shannon定理的逆命题 序 这个算是正本书中关于信息论的最后内容了,后面就是关于编码 ...
- 二元最佳前缀码_最优前缀编码
前缀编码 在电文传输中,需要将电文中出现的每个字符进行二进制编码.在设计编码时需要遵守两个原则:(1)发送方传输的二进制编码,到接收方解码后必须具有唯一性,即解码结果与发送方发送的电文完全一样:(2) ...
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...
- java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动
在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...
- java 默认字符集 iso_第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及......
1.函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为: 1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetNam ...
- python networkx进行最短路径分析_【Python学习系列二十六】networkx库图最短路径求解...
场景:基于python库networkx来求解图最短路径,相关算法基础参考 http://blog.csdn.net/fjssharpsword/article/details/52931373 ht ...
- 利用wojilu框架仿一个网站的全过程(Step by Step利用wojilu框架开发网站系列二 附源码)...
被仿的网站和仿照后的网站 被仿的网站-易读 仿照后的网站-我读 仿这个网站的目的:为了实践一下新学习的轻量级asp.net web开发框架[我记录] ,该网站比较简单,适合入门. 实现章节 章节部分, ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- unix系统编码 java_JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
最新文章
- 2018半年总结:走过的路
- SFrame中的apple函数
- java动画闪烁_优化Java动画编程中的显示效果
- Shield——开源的移动端页面模块化开发框架
- 【Java】GUI界面切换的解决方案
- Sketch UX套件,用于线框图和原型制作
- 【二分法】计蒜客:对数方程
- Linux container_of用法
- C++ 如何释放std::function中绑定的对象
- 华为OLT(MA5680T)修改系统时间
- 做企业管理软件的,怎能不读这本1965年的书呢?
- gitHub报错10054、443解决办法
- 固态硬盘用软件测试掉速严重,固态硬盘为什么会“掉速”?
- php怎么在表格里插图片大小,如何批量插入图片到Word文档表格中并自动排版调整尺寸...
- [转]禅修程序员十诫
- 我们什么都没有,只有爱
- ajax证书问题,网站上有错误的SSL证书的Jquery Ajax
- 每一题-101(患某种疾病的患者)
- setoolkit进行钓鱼攻击
- Win10电脑怎么更改UEFI固件设置
热门文章
- element表格设置fixed后滚动条滚动时右下角空白块
- 卡塔尔能源每年将向中石化供应400万吨液化天然气;哪吒汽车发布技术品牌浩智 | 美通企业日报...
- springboot+nodejs+vue公寓客房预订网站
- ARM学习day6-->看门狗定时器
- VR全景制作教程|VR全景拍摄和制作竟如此简单
- Mind+实例5——打地鼠游戏
- 算法设计与分析: 3-4 多重幂计数问题
- 后天淘宝客cms系统源码
- 一个伪作家谈如何让孩子爱上写作文
- win10没有indexed文件_不止用来切程序,Win10任务栏还能这么玩