致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。尽管当前水平可能不及各位大佬,但我会尽我自己所能,做到最好☺。——天地有正气,杂然赋流形。下则为河岳,上则为日星。
假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频度分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}
为这7个字母设计哈夫曼编码
为这7个字母设计等长编码,至少需要几位二进制数?
哈夫曼编码比等长编码使电文总长压缩多少?
请画出哈夫曼树的构造过程
对于这个题目来说,要简单也真的简单,最重要的是我们要理解哈夫曼编码的本质。
确定权值
在这里我们先统计各个字符出现的权值,当然用0.31 是可以的,但是由于写博客的原因,我就暂时,假定有100个字符,也就是写成整数权值 31。
于是我们得到一个权重表(从小到大排序)
| 字符 | 权值 |
|---|---|
| g | 4 |
| d | 8 |
| c | 10 |
| e | 11 |
| b | 16 |
| f | 20 |
| a | 31 |
然后我们把权值对应的信息存储到一个 结点 中,并假定这些结点都存储到队列里面,这个队列都按照权值从小到大的顺序排序。
初始化结果:
建树
每次从队列中取出两个结点。然后构成一个结点,重新放回队列。
然后再次重复操作,直至,队列剩余一个结点为止。
编码
上面的树我已经编号码了。唔…失误失误
按照编码的规则,从根节点开始往左边的结点 编码 0 往右边的结点编码 1。
直到到达叶子结点,然后叶子结点对应的编码就是从根节点到叶子结点编码连起来。
等长编码
对于一个无记忆离散信源中每一个符号,若采用相同长度的不同码字代表相应的符号,就称为等长编码。一般来说,若要实现无失真的编码,这不但要求信源符号与码字是一一对应的,而且要求码符号序列的反变换也是唯一的。也就是说,一个码的任意一串有限长的码符号序列(码字)只能被唯一地翻译成所对应的信源符号序列。
说那么多干啥,一点用都没有。
所谓的等长编码:例如对字符串 “ac“ 来说,只要两个字符,所以我们可以使用 0 或者 1 来编码。
最常见的就是 ASSIC 编码,8位等长的二进制0-127来表示字符。
同样的道理,这个题目中一共有 7 不同个字符,所以我们应该如何表示呀,肯定就是找到最小的2^n大于7,显然这个就是3,类似的思想还有老鼠试毒药的问题。
关于压缩的计算,就更简单了。如图:
拓展与思考
为什么哈夫曼编码能够压缩或者加密呢?
个人认为是因为对于这样的存储方法,其实是有频数最多的字符,往靠近根结点的地方建树,而频数较低的,就往深处或者底部,建立结点。这样的话,对于 频数 较高的字符获得的编码长度比较小,而 频数 小的字符获得的编码长度长。
举个例子:
对于98个字符‘a’和1个字符’b‘和1个字符’c‘
如果用等长的二进制编码,至少需要两位,但是98个’a‘占用的空间就显得浪费了。
后记:博主终于码完了,如果觉得以上内容有帮助的话,能不能留下你的小心心呢?❤你的赞和支持,就是博主最大的动力!!????