Huffman树与Huffman编码

转载请注明出处:http://blog.csdn.net/ns_code/article/details/19174553

Huffman Tree简介
赫夫曼树(Huffman Tree),又称最优二叉树,是一类带权路径长度最短的树。假设有n个权值{w1,w2,…,wn},如果构造一棵有n个叶子节点的二叉树,而这n个叶子节点的权值是{w1,w2,…,wn},则所构造出的带权路径长度最小的二叉树就被称为赫夫曼树。

这里补充下树的带权路径长度的概念。树的带权路径长度指树中所有叶子节点到根节点的路径长度与该叶子节点权值的乘积之和,如果在一棵二叉树中共有n个叶子节点,用Wi表示第i个叶子节点的权值,Li表示第i个也叶子节点到根节点的路径长度,则该二叉树的带权路径长度 WPL=W1*L1 + W2*L2 + ... Wn*Ln。

根据节点的个数以及权值的不同,赫夫曼树的形状也各不相同,赫夫曼树具有如下特性:

对于同一组权值,所能得到的赫夫曼树不一定是唯一的。
赫夫曼树的左右子树可以互换,因为这并不影响树的带权路径长度。
带权值的节点都是叶子节点,不带权值的节点都是某棵子二叉树的根节点。
权值越大的节点越靠近赫夫曼树的根节点,权值越小的节点越远离赫夫曼树的根节点。
赫夫曼树中只有叶子节点和度为2的节点,没有度为1的节点。
一棵有n个叶子节点的赫夫曼树共有2n-1个节点。

Huffman Tree的构建
赫夫曼树的构建步骤如下:
1、将给定的n个权值看做n棵只有根节点(无左右孩子)的二叉树,组成一个集合HT,每棵树的权值为该节点的权值。
2、从集合HT中选出2棵权值最小的二叉树,组成一棵新的二叉树,其权值为这2棵二叉树的权值之和。
3、将步骤2中选出的2棵二叉树从集合HT中删去,同时将步骤2中新得到的二叉树加入到集合HT中。
4、重复步骤2和步骤3,直到集合HT中只含一棵树,这棵树便是赫夫曼树。
假如给定如下5个权值:
权值
则按照以上步骤,可以构造出如下面左图所示的赫夫曼树,当然也可能构造出如下面右图所示的赫夫曼树,这并不是唯一的。
树1
树2
Huffman编码
赫夫曼树的应用十分广泛,比如众所周知的在通信电文中的应用。在等传送电文时,我们希望电文的总长尽可能短,因此可以对每个字符设计长度不等的编码,让电文中出现较多的字符采用尽可能短的编码。为了保证在译码时不出现歧义,我们可以采取如下图所示的编码方式:
这里写图片描述
这里写图片描述
即左分支编码为字符0,右分支编码为字符1,将从根节点到叶子节点的路径上分支字符组成的字符串作为叶子节点字符的编码,这便是赫夫曼编码。我们根据上面左图可以得到各叶子节点的赫夫曼编码如下:
权值为5的也自己节点的赫夫曼编码为:11
权值为4的也自己节点的赫夫曼编码为:10
权值为3的也自己节点的赫夫曼编码为:00
权值为2的也自己节点的赫夫曼编码为:011
权值为1的也自己节点的赫夫曼编码为:010

而对于上面右图,则可以得到各叶子节点的赫夫曼编码如下:
权值为5的也自己节点的赫夫曼编码为:00
权值为4的也自己节点的赫夫曼编码为:01
权值为3的也自己节点的赫夫曼编码为:10
权值为2的也自己节点的赫夫曼编码为:110
权值为1的也自己节点的赫夫曼编码为:111
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Huffman是一种用于数据压缩的形结构,Huffman编码是一种将数据压缩为最小位数的编码方式。在Huffman中,出现次数越多的字符离根节点越近,编码的位数也越短,从而实现了压缩。Huffman编码是一种无损编码方式,编码后可以还原为原始数据。 ### 回答2: Huffman Huffman 编码是一种压缩算法,它通过对文本中出现频率高的字符进行编码来减少文件的存储空间。在 Huffman 中,每个字符都被映射到上的一个叶子节点,其权重由该字符在文本中出现的频率确定。该的生成过程是通过合并权重最小的两个节点来进行的,知道整棵被构建完成。 由于 Huffman 的输入是字符出现的频率,因此需要预处理文本来计算文本中每个字符的出现次数。生成的 Huffman 可以用来生成 Huffman 编码,也就是用来表示字符的二进制编码编码过程是根据该字符在 Huffman 上在枝蔓向下到达该节点时的二进制码来得到的。 Huffman 编码具有前缀码性质,即每个字符的编码码字都不是其他字符的编码码字的前缀。这意味着可以通过在编码序列的开头处添加一个特殊的位来标识编码序列的结束位置,而无需考虑编码序列中的位数。与其他压缩算法相比,Huffman 编码的主要优势在于其简单性和高效性,以及数据压缩后的保真性,即压缩后的数据与原始数据的完全相等。 虽然 Huffman 编码是一种有效的压缩算法,但它也存在一些缺点。首先,生成 Huffman 需要读取文本的全部内容,并对每个字符的出现次数进行计数,这增加了编码的时间和空间消耗。其次,文件中出现字符的种类较多时,Huffman 编码的效率会降低,因为编码长度将随着字符数量的增加而增加。此外,Huffman 编码还可能受到噪声等随机因素的影响,导致数据压缩效果下降。 ### 回答3: HuffmanHuffman编码是数据压缩中非常重要的两个概念。Huffman是由David A. Huffman在1952年发明的一种基于贪心算法的最佳二叉,它主要用于编码压缩,将文本中频率较高的字符用较短的编码替代,而频率较低的字符则用较长的编码替代,从而实现文件压缩。 Huffman编码基于Huffman生成,它是一种可变长度编码,用于将字符压缩成二进制数据。在Huffman编码中,每个字符对应一个唯一的二进制编码,这个编码是根据该字符在文本中出现的频率来确定的。频率越高的字符用越短的编码,频率越低的用越长的编码。这样,压缩后的文件大小就能够减小,因为较高频率的字符用较短的编码表示,而较低频率的字符用较长的编码表示,整个文件的编码长度就变得更短了。 Huffman编码跟ASCII编码是不同的,因为ASCII编码是固定长度的编码方式。在某些情况下,Huffman编码可以将文件大小压缩至原文件大小的60-70%甚至更少,这对于特定的数据类型如文本和图片等是非常有效的。 总的来说,HuffmanHuffman编码是在信息压缩算法中非常重要的两个概念。它们的出现有效地减少了数据的存储空间,提高了数据传输的效率。在实际的生产和应用工作中,我们可以多用一些数据压缩技术来满足我们日益增长的数据存储和处理需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值