霍夫曼编码

前言

忽然因为一些问题想研究下编码方式,就观察下这个东西。发现有些东西还是挺有意思的。如果没研究过通讯,确实不用一理解,比如异前置编码之类的东西,并且信息熵确实很高。记录下这次的思路。

正文

霍夫曼编码是一种可变长编码方式(就是编码的长度是可变的),是相对于我们的定长编码方式来的(比如ascii编码方式,每一个字符占据一个八位的字符)。这里可变长编码方式种类也比较多,一种是异前置编码方式(霍夫曼编码是其中的一种,嗯嗯这里一会在解释,我理论上没搞懂。)
首先我们来说下定长编码方式,很容易我们会发现他容易效验,因为定长。我们可以动过奇偶效验位等等来处理在还原时候比较容易处理,不过可变长也能这样干啊。)这里自己思考,其实最大的传输与保存效率,明显可变长的保存效率更高。
这里理论都显得空洞,我们进入我们的正文。到底霍夫曼编码是如何编码的。效率如何搞了。
这里假如我们要传输只有5中状态分别是u1、u2、u3、u4、u5,他们在传输中的概率分别为p1、p2、p3、p4、p5。这里我们为了便于我们说,明情况,我们假如p1、p2、p3、p4、p5的值为0.4、0.2、0.2、0.1、0.1
这里写图片描述
这里我们很容易发现概率发生高的数据u1只用了一位。最终平均比特率是2.72 bit你我们通过定长的3bit要好一些。
这里我们也许会问解析的问题,如何解析呢。我们这里要说下 这里是前前异置码子。任意码子不会是前一码子的前半部分,那么我们来分析下为什呢么。和空洞是不是,那么我们假如对 abc三个字符编码,
如果a:0;b:1;c:01;
那么传输的结果是 0101,解析有可能是 abab,这里必须假如分割码,其实浪费了很多东西,
如果我们用a : 1; b:01; c: 00;那么我们都可以传输正确了
为啥会产生异前置码,我们来构建一个二叉树。这个树是自下而上的构造。如图
这里写图片描述
这里我们构成了一个这样一个二叉树,我们加入当中有n个叶子节点,也就是有n个消息,那么会有n-1个父节点,这里我们思考为什是前异置码。每个叶子节点永远不可能与其中的任何一个父节点相等(如果相等他们必然拥有相同的父节点,并且他们本身的编号相等,这不是自己本身(这里应该是父节点,)与是叶子节点矛盾),
在我们解析的时候,在遇到认一字符串的时时候,我们都可以唯一的找到与之相对应的父节点(这里是逐个寻找)。最终会找到我们的叶子节点,这里要思考清楚,

总是就是通过概率的分配我们把概率高的,分配更短的字符。概率高的分配更少的字符。最终让信息熵更大,需要更短的平均码子,

这里本来想给大家写一个小代码,用来解析这个问题,后来想了下,这种东西基本用不上,就不浪费时间了,原理很简单,构造一个二叉树,实现对消息队列的查询,

后记

这里我们了解了一些编码的方法,对于信息的存储知道不仅仅是那种纯粹的按照更加简单的存储方式,我们知道我们对于一个照片的存储不仅仅是按照像素点单纯的乘以*2^16/2^8b个字符(这是通过三色+透明度一共4位四位的存储的格式)来的。其实这中思想很重要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值