【数据结构】哈夫曼编码

本文详细介绍了哈夫曼编码的概念,它是一种根据字符出现频率构建的最优编码方式,旨在实现数据的最小冗余编码。通过示例展示了如何构建哈夫曼树并进行编码,以及如何计算压缩比。对于给定的字符频率,构建了哈夫曼树并为字符'cade'生成了编码,同时计算出文档的压缩比为27%。
摘要由CSDN通过智能技术生成

哈夫曼编码

1. 概述

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

哈夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就称Huffman编码。

2. 举例

已知某文档包含5个字符,每个字符出现的频率如下表所示。采用哈夫曼编码对文档进行压缩:

字符abcde
频率(%)4010201614

构建哈夫曼树:
原则,每次取剩余元素中最小的两个构成一棵新树,并将权值(频率)之和作为新权值放入。重复此过程,直至只剩一棵树,即为哈夫曼树
哈夫曼树
译码的惟一性问题:

要求任一字符的编码都不能是另一字符编码的前缀,这种编码称为前缀编码(其实是非前缀码)。 在编码过程要考虑两个问题,数据的最小冗余编码问题,译码的惟一性问题,利用哈夫曼树可以很好地解决上述两个问题

用哈夫曼树设计二进制前缀编码:

以电文中的字符作为叶子结点构造二叉树。然后将二叉树中结点引向其左孩子的分支标 ‘0’,引向其右孩子的分支标 ‘1’; 每个字符的编码即为从根到每个叶子的路径上得到的 0, 1 序列。如此得到的即为二进制前缀编码。哈夫曼树

字符abcde
频率(%)4010201614
前缀编码0100101110111

3. 例题

使用上述哈夫曼树编码:


① 单词"cade"的编码为?

对应c的编码为111,a的编码为0,d的编码为110,e的编码为101

所以,单词"cade"的编码:1110110101


② 文档的压缩比是多少?

  • 压缩前,表示5个不同的字符,用二进制编码至少需要3位二进制,即每位字符占据空间3bit,平均编码长度为:3×40%+3×10%+3×20%+3×16%+3×14%=3
  • 压缩后,表示5个不同的字符,编码长度分别为1、3、3、3、3,平均编码长度为:1×40%+3×10%+3×20%+3×16%+3×14%=2.2

压 缩 比 = 3 − 2.2 3 × 100 % = 27 % 压缩比 = {3 - 2.2 \over 3} × 100\% = 27\% =332.2×100%=27%

哈夫曼编码是一种用于数据压缩的方法,它基于字符出现频率来构建最优的编码表。下面是哈夫曼编码的译码和编码过程: 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知道 编程是很有趣的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值