数据结构-哈夫曼编码例题

致读者: 博主是一名数据科学与大数据专业大二的学生,真正的一个互联网萌新,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于困惑的读者。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!之后会写大数据专业的文章哦。尽管当前水平可能不及各位大佬,但我会尽我自己所能,做到最好☺。——天地有正气,杂然赋流形。下则为河岳,上则为日星。

假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字母构成。它们在电文中出现的频度分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}

为这7个字母设计哈夫曼编码

为这7个字母设计等长编码,至少需要几位二进制数?

哈夫曼编码比等长编码使电文总长压缩多少?

请画出哈夫曼树的构造过程

对于这个题目来说,要简单也真的简单,最重要的是我们要理解哈夫曼编码的本质

数据结构-哈夫曼编码例题_第1张图片

确定权值

在这里我们先统计各个字符出现的权值,当然用0.31 是可以的,但是由于写博客的原因,我就暂时,假定有100个字符,也就是写成整数权值 31

于是我们得到一个权重表(从小到大排序)

字符 权值
g 4
d 8
c 10
e 11
b 16
f 20
a 31

然后我们把权值对应的信息存储到一个 结点 中,并假定这些结点都存储到队列里面,这个队列都按照权值从小到大的顺序排序。

初始化结果:

数据结构-哈夫曼编码例题_第2张图片

建树

每次从队列中取出两个结点。然后构成一个结点,重新放回队列。

数据结构-哈夫曼编码例题_第3张图片

然后再次重复操作,直至,队列剩余一个结点为止。

数据结构-哈夫曼编码例题_第4张图片

数据结构-哈夫曼编码例题_第5张图片

数据结构-哈夫曼编码例题_第6张图片

数据结构-哈夫曼编码例题_第7张图片

数据结构-哈夫曼编码例题_第8张图片

数据结构-哈夫曼编码例题_第9张图片

编码

上面的树我已经编号码了。唔…失误失误

按照编码的规则,从根节点开始往左边的结点 编码 0 往右边的结点编码 1

直到到达叶子结点,然后叶子结点对应的编码就是从根节点到叶子结点编码连起来。

等长编码

对于一个无记忆离散信源中每一个符号,若采用相同长度的不同码字代表相应的符号,就称为等长编码。一般来说,若要实现无失真的编码,这不但要求信源符号与码字是一一对应的,而且要求码符号序列的反变换也是唯一的。也就是说,一个码的任意一串有限长的码符号序列(码字)只能被唯一地翻译成所对应的信源符号序列。

说那么多干啥,一点用都没有。

所谓的等长编码:例如对字符串 “ac“ 来说,只要两个字符,所以我们可以使用 0 或者 1 来编码。

最常见的就是 ASSIC 编码,8位等长的二进制0-127来表示字符。

同样的道理,这个题目中一共有 7 不同个字符,所以我们应该如何表示呀,肯定就是找到最小的2^n大于7,显然这个就是3,类似的思想还有老鼠试毒药的问题。

关于压缩的计算,就更简单了。如图:

数据结构-哈夫曼编码例题_第10张图片

拓展与思考

为什么哈夫曼编码能够压缩或者加密呢?

个人认为是因为对于这样的存储方法,其实是有频数最多的字符,往靠近根结点的地方建树,而频数较低的,就往深处或者底部,建立结点。这样的话,对于 频数 较高的字符获得的编码长度比较小,而 频数 小的字符获得的编码长度长。

举个例子:

对于98个字符‘a’和1个字符’b‘和1个字符’c‘

如果用等长的二进制编码,至少需要两位,但是98个’a‘占用的空间就显得浪费了。

后记:博主终于码完了,如果觉得以上内容有帮助的话,能不能留下你的小心心呢?❤你的赞和支持,就是博主最大的动力!!

你可能感兴趣的:(数据结构-哈夫曼编码例题)