【开卷数据结构 】哈夫曼编码

在上文中,我们了解了哈夫曼树的基本概念和构造算法,那么哈夫曼树究竟有什么用呢?接下来讲的哈夫曼编码就是哈夫曼树的应用。

目录

🌺哈夫曼编码

🍁固定长度编码

🍁哈夫曼编码

🍁前缀编码

🌺文件的编码与译码

🍁编码

🍁译码


94536690f848438fab30aa17191a6ea2.png

🌺哈夫曼编码

如果有一段文字【ABCDEF】要网络传输给别人,在进行数据压缩时,最简单的编码方法就是固定长度编码。

🍁固定长度编码


Q:什么是固定长度编码

A:在数据通信中,若对每个字符用相同的二进制位表示,称这种编码方式为固定长度编码。


有一段文字BADCADFEED ,我们可以用相应的二进制的数据表示,如图所示

字母ABCDEF
二进制字符000001010011100101

这样真正传输的数据就是编码后的 【001000011010000011101100100011三十个字符),对方接收时可以按照3位一分来译码。如果一篇文章很长,这样的二进制串也将长的非常的可怕,那么有没有什么方法可以对其进行压缩的吗?


🍁哈夫曼编码

我们假设各字母出现的频率如下

假设六个字母的频率为 A:27  B:8  C:15  D:15  E:30  F:5 ,合起来正好是 100 ,那就意味着,我们完全可以重新按照赫夫曼树来规划它们。

 我们将左分支权值改为0,右分支权值改为1,那么该哈夫曼树就变成了

这时,我们对着六个字母用其从树根到叶所经过路径的 0 与 1 来编码,按照新的字母对应的二进制字符对BADCADFEED 进行编码,通过对比可以很明显的发现,字符数量减少了。

  • 固定长度编码:001000011010000011101100100011(共30个字符)
  • 哈夫曼编码:    1001010010101001000111100         (共25个字符)

哈夫曼编码的特点:

  1. 对频率高的字符赋以短编码。
  2. 对频率较低的字符则赋予较长一些的代码。
  3. 从而使得字符的平均编码长度减短,起到压缩数据的效果。
  4. 哈夫曼编码是一种被广泛应用而且非常有效的数据压缩编码。

🍁前缀编码

Q:什么是前缀编码

A:前缀编码是指对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀。

仔细观察,哈夫曼编码其实就是一种前缀编码

Q:前缀编码有什么优点

A:通过观察前缀编码(哈夫曼编码)【1001010010101001000111100】,以及其对应的哈夫曼树,我们发现不会出现容易混淆的编码,比如不会出现与1000,1001混淆的10,100编码。

对前缀编码的解析很简单,因为没有一个编码是其他编码的前缀。所以识别出第一个编码,将它翻译成原码,再对余下的编码文件重复同样的解码操作即可。例如,码串 00101100 可被唯一的翻译成 0,0,101,100 .

🌺文件的编码与译码

🍁编码

有了字符集的哈夫曼编码表之后,对数据文件的编码过程是:依次读人文件中的字符c,在哈夫曼编码表HC中找到此字符,将字符c转换为编码表中存放的编码串

🍁译码

对编码后的文件进行译码的过程必须借助于哈夫曼树。具体过程是:依次读入文件的二码,从哈夫曼树的根结点(即HT[m])出发,若当前读入0,则走向左孩子,否则走向右孩子。一旦到达某一叶子HT[i]时便译出相应的字符编码HT[i]。然后重新从根出发继续译码,直至文件结束。

  • 90
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 116
    评论
哈夫曼编码是一种用于数据压缩的方法,它基于字符出现频率来构建最优的编码表。下面是哈夫曼编码的译码和编码过程: 1. 哈夫曼编码: - 统计字符出现频率,并根据频率构建哈夫曼。频率较高的字符位于的较低层。 - 通过从根到叶子节点的路径上的0和1来表示字符,构建编码表。 - 使用编码表将输入文本中的字符替换为对应的哈夫曼编码。 2. 哈夫曼译码: - 使用相同的哈夫曼编码表,读取编码后的二进制数据。 - 从根节点开始,按照读取到的0或1依次向左或向右移动,直到达到叶子节点。每次到达叶子节点后,输出对应的字符,并重新回到根节点继续读取。 下面是一个示例,展示如何使用哈夫曼编码和译码来进行数据压缩和解压缩: 假设我们有以下文本:C知道 编程是很有趣的! 1. 统计字符频率并构建哈夫曼: 字符频率:{空格: 4, C: 2, 知: 2, !: 1, 程: 1, 译: 1, 是: 1, 有: 1, 趣: 1, 的: 1, 编: 1, 码: 1} 构建的哈夫曼如下: [11] / \ / \ / \ / \ / \ / \ / \ C 知 ␣ ! 程 译 \ \ / \ 是 有 \ \ \ / \ 趣 的 构建的编码表如下: C: 00 知: 01 ␣: 100 !: 1010 程: 1011 译: 1100 是: 11010 有: 11011 趣: 11100 的: 11110 编: 111110 码: 111111 2. 编码: 将输入文本中的字符替换为对应的哈夫曼编码,得到编码后的二进制数据:00 01 100 111110 1011 1100 11010 11011 11100! 3. 解码: 根据相同的哈夫曼编码表,读取编码后的二进制数据进行译码,得到原始文本:C知道 编程是很有趣的!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锡兰_CC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值