目录序

最优性(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码相关推荐

  1. 信息论与编码_信息与编码系列(五)不可靠信道——决策法则、Hamming距离与信息论基本定理...

    目录 序 决策法则(decision rules) Hamming距离 信息论基本定理--Shannon 定理 Shannon定理的逆命题 序 这个算是正本书中关于信息论的最后内容了,后面就是关于编码 ...

  2. 二元最佳前缀码_最优前缀编码

    前缀编码 在电文传输中,需要将电文中出现的每个字符进行二进制编码.在设计编码时需要遵守两个原则:(1)发送方传输的二进制编码,到接收方解码后必须具有唯一性,即解码结果与发送方发送的电文完全一样:(2) ...

  3. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  4. java tomcat源码_详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  5. java 默认字符集 iso_第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及......

    1.函数介绍 在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为: 1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetNam ...

  6. python networkx进行最短路径分析_【Python学习系列二十六】networkx库图最短路径求解...

    场景:基于python库networkx来求解图最短路径,相关算法基础参考 http://blog.csdn.net/fjssharpsword/article/details/52931373 ht ...

  7. 利用wojilu框架仿一个网站的全过程(Step by Step利用wojilu框架开发网站系列二 附源码)...

    被仿的网站和仿照后的网站 被仿的网站-易读 仿照后的网站-我读 仿这个网站的目的:为了实践一下新学习的轻量级asp.net web开发框架[我记录] ,该网站比较简单,适合入门. 实现章节 章节部分, ...

  8. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  9. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  10. unix系统编码 java_JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

最新文章

  1. 2018半年总结:走过的路
  2. SFrame中的apple函数
  3. java动画闪烁_优化Java动画编程中的显示效果
  4. Shield——开源的移动端页面模块化开发框架
  5. 【Java】GUI界面切换的解决方案
  6. Sketch UX套件,用于线框图和原型制作
  7. 【二分法】计蒜客:对数方程
  8. Linux container_of用法
  9. C++ 如何释放std::function中绑定的对象
  10. 华为OLT(MA5680T)修改系统时间
  11. 做企业管理软件的,怎能不读这本1965年的书呢?
  12. gitHub报错10054、443解决办法
  13. 固态硬盘用软件测试掉速严重,固态硬盘为什么会“掉速”?
  14. php怎么在表格里插图片大小,如何批量插入图片到Word文档表格中并自动排版调整尺寸...
  15. [转]禅修程序员十诫
  16. 我们什么都没有,只有爱
  17. ajax证书问题,网站上有错误的SSL证书的Jquery Ajax
  18. 每一题-101(患某种疾病的患者)
  19. setoolkit进行钓鱼攻击
  20. Win10电脑怎么更改UEFI固件设置

热门文章

  1. element表格设置fixed后滚动条滚动时右下角空白块
  2. 卡塔尔能源每年将向中石化供应400万吨液化天然气;哪吒汽车发布技术品牌浩智 | 美通企业日报...
  3. springboot+nodejs+vue公寓客房预订网站
  4. ARM学习day6-->看门狗定时器
  5. VR全景制作教程|VR全景拍摄和制作竟如此简单
  6. Mind+实例5——打地鼠游戏
  7. 算法设计与分析: 3-4 多重幂计数问题
  8. 后天淘宝客cms系统源码
  9. 一个伪作家谈如何让孩子爱上写作文
  10. win10没有indexed文件_不止用来切程序,Win10任务栏还能这么玩