赫夫曼树及赫夫曼编码

作者&投稿:昌灵 (若有异议请与网页底部的电邮联系)
~



在1952年美国数学家发明了赫夫曼编码,当时是为了解决远距离通信(主要是电报)的数据传输最优化问题,节约存储和传送的成本。后人为纪念他的成就,就把他在编码中用到的二叉树称为赫夫曼树,别名最优二叉树。他的编码方法称为赫夫曼编码。我们平时所用的压缩和解压缩技术也是基于赫夫曼的研究之上而来。

路径长度: 从树中一个结点到另一个结点的分支构成两个节点之间的路径,路径上的分支长度称为路径长度。比如说在下图中的根节点到D结点的路径长度为2.

树的路径长度: 树根到每一结点的路径长度之和。比如说下图中树的路径长度为:1+1+2 4+3 2=16

带权路径长度: 结点的带权路径长度为从该结点到根结点之间的路径长度与结点上权的乘积。比如说D结点的带权路径长度为60.树的带权路径长度为树中所有叶子结点的带权路径长度之和。比如说下图中整棵树的带权路径长度WPL为:220. 其中树的带权路径长度(WPL)最小的二叉树称为赫夫曼树。 既然要使得树的路径长度最小,那么权值越大的节点理应离根节点越近

知道了赫夫曼树的定义后,那么如果给定一串权值,我们如何构建一颗赫夫曼树呢? 构造赫夫曼树的算法描述:
1.根据给定的n个权值{w1,w2,...,wn}构成n棵二叉树(只含一个节点)的集合F= {T1,T2,...,Tn}.,其中每颗二叉树Ti中只有一个带权为Wi的根节点,其左右子树为空。
2.在F中选取两颗根节点的权值最小的树作为左右子树构造一颗新的二叉树,并且新的二叉树的根节点的权值为左右子树根节点上的权值之和。
3.在F中删除这两棵树,将新的到的二叉树加入F中。
4.重复二三,直到F中只剩下一棵树为止,这就是赫夫曼树。

简单实现根据权值构建赫夫曼树案例如下:

测试:

输入权值集合{5,15,10,30,40}结果可得到下图所示的最优二叉树:

因为赫夫曼树中给定叶子节点数是可以知道赫夫曼树节点总数的,所以选择分配一段连续的空间来存储赫夫曼树。

赫夫曼编码: 假设有一段需要编码的字符集{c1,c2,c3,...,cn},求得各个字符在电报中出现的频率集合为{w1,w2,w3,...,wn},以c1,c2,c3,...,cn作为叶子节点,以w1,w2,w3,...,wn作为相应叶子节点的权值来构造一颗赫夫曼树。并且规定好赫夫曼树的左分支代表0,右分支代表1(即一个结点的左孩子为0,右孩子为1),则一个字符的编码就是从根节点到叶子节点所经过的路径分支组成的0和1的序列。这就是赫夫曼编码。比如说A字符的编码为01.这样就可以得到比原来编码更短的二进制串,压缩了数据,节约了存储成本。

通俗来说,就是给你一段字符,按照何种方式或者规则编码可以使得编码后所得的二进制串最短呢?赫夫曼就提出了赫夫曼编码规则。




赫夫曼树及赫夫曼编码
赫夫曼编码: 假设有一段需要编码的字符集{c1,c2,c3,...,cn},求得各个字符在电报中出现的频率集合为{w1,w2,w3,...,wn},以c1,c2,c3,...,cn作为叶子节点,以w1,w2,w3,...,wn作为相应叶子节点的权值来构造一颗赫夫曼树。并且规定好赫夫曼树的左分支代表0,右分支代表1(即一个结点的左...

哈夫曼哈夫曼编码
在上世纪五十年代初期,哈夫曼提出了他的编码理论,其核心理念是根据字符出现的频率来构建具有最短平均长度的编码系统。哈夫曼编码的独特之处在于它的变长特性:每个符号的编码长度与其在文本中出现的概率成反比,这意味着更频繁出现的字符通常会有较短的编码,反之亦然。编码过程遵循一个独特的构建规则,...

哈夫曼树和哈夫曼编码
哈夫曼静态编码:它对需要编码的数据进行两遍扫描:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,即把字符0-255(2^8=256)的频率值以2-4BYTES的长度顺序存储起来,(用4Bytes的长度存储频率值,频率值的表示范围为0--2^32-1,这已足够表示大文件...

数据结构(14)-哈夫曼树&哈夫曼编码
传输后的编码就是 001 000 011 010 000 011 101 100 100 011 。这种等长的编码虽然使用起来方便,但是编码结果太长,会占用过多的内存资源。如果我们对上述字母进制做一些修改:此时,新生成的编码 001 01 00 101 01 00 1001 11 11 00 就比等长编码短了,节约了存储和传输成本。但是这种方式也有...

可变长编码(赫夫曼编码,UTF-8编码)
赫夫曼编码(Huffman Coding),又称哈夫曼编码、霍夫曼编码,是可变字长编码(VLC)的一种。在说赫夫曼编码前,需要先引入另一个概念: 赫夫曼 。赫夫曼树又称最优树,是一类带权路径长度最短的树,有着广泛的应用。赫夫曼树的定义:假设有 n 个权值{w1 ,w2 ,... ,w n },试构造一颗有 n...

什么是哈夫曼树,如何用它来编码?
步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树 哈夫曼树编码 在树中令所有左分支取编码为 0 ,令所有右分支取编码为1。将从根结点起到某个叶子结点路径上的各左、右分支的编码顺序排列,就得这个叶子结点所代表的字符的二进制编码 A10 B1111 C110 D11101 E0 F11100 ...

哈夫曼树与哈夫曼编码、集合
前缀码(prefix code):任何字符的编码都不是另一字符编码的前缀,可以无二义地解码 用二叉树进行编码:(1)左右分支:0、1 (2)字符只在叶结点上 只要待编字符在叶结点上,其二叉树编码都不是另一字符编码的前缀 由哈夫曼树构造一棵编码代价最小的树 例:集合运算:交集、并集...

哈夫曼树和二进制编码有什么不同点?
1、码字不同。哈夫曼所构造的码字不是唯一的,对于同一个信息源,无论上述的前后顺序如何排列,它的平均码长是不会改变的,所以他的优点是编码效率唯一性。而二进制编码所构造的码字是唯一。2、长度不同 哈夫曼编码是依据字符出现概率来构造异字头的平均长度最短的码字,比较精准,二进制编码是用预先...

数据结构哈弗曼树,哈弗曼编码?
带权路径长度:79 编码:A:00 B:1110 C:1111 D:110 E:01 F:10 思路: 每次提出最小的两个节点(或二叉树),结合为一个新的二叉树,新二叉树的权值为两个节点(或二叉树)的权值的和。重复该步骤直到全部节点都在树上。

哈夫曼树和编码
A出现的概率是1\/2,B出现的概率是1\/18,C出现的概率是5\/18,D出现的概率是3\/18。编码步骤:1.初始化,根据符号概率的大小按由大到小顺序对符号进行排序。2.把概率最小的两个符号组成一个节点。3.重复步骤2,得到得到另外的节点,形成一棵“树”,其中的最后一个节点称为根节点。4.从根节点...

汝阳县18697217038: Huffman编码C语言实现 -
黎许参芪: 说明:本程序是依据严蔚敏的数据结构(C语言版)上的代码实现的.#pragmaonce#include<stdio.h>#include<tchar.h>#include<stdlib.h>#define MAX 100 typedefstruct{ //节点 int weight; int parent, lchild, rchild; }HTNode, *HuffmanTree; ...

汝阳县18697217038: 什么是哈夫曼编码? -
黎许参芪: 哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种. Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作...

汝阳县18697217038: Huffman编码 -
黎许参芪: 先分析个字符的权值: a=3,b=7,c=2,d=3,e=5 生成一棵霍夫曼树,得到各字符的编码: a=110,b=0,c=1111,d=1110,e=10 平均码长为46/15

汝阳县18697217038: 数据结构(C语言版)中,树和二叉树中的Huffman树编码的大体框架是什么 -
黎许参芪: 树和二叉树: 二叉树是树的一种,还可以有三叉树、四叉树、……,以及混合叉树. 不过一般只讨论二叉树,这是最典型、最有用的数据结构.Huffman树是一类带权路径长度最短的二叉树,在哈夫曼树中,权值越大的结点离根结...

汝阳县18697217038: Huffman树的应用 -
黎许参芪: 哈夫曼树 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码.首先介绍什么是哈夫曼树.哈夫曼...

汝阳县18697217038: 哈夫曼树和哈夫曼编码 -
黎许参芪: 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 哈夫曼树(霍夫曼树)又称为最...

汝阳县18697217038: 怎么样用c语言程序编码哈夫曼树? -
黎许参芪: #include<stdio.h>#include<stdlib.h>#include<string.h>#include <ctype.h>#include<limits.h> int function1(char ch,char *s) { int i; for(i=0; s[i]!='\0'; i++) { if(ch==s[i])return 0; } return 1; } typedef struct { unsigned int weight; unsigned int parent,lchild,rchild;...

汝阳县18697217038: 什么赫夫曼编码,我想知道下它的原理 -
黎许参芪: 赫夫曼编码赫夫曼(Huffman)在1952年提出了另一种编码方法,即从下到上的编码方法.现仍以一个具体的例子说明它的编码步骤:(1) 初始化,根据符号概率的大小按由大到小顺序对符号进行排序,如表4-03和图4-02所示.(2) 把概率...

汝阳县18697217038: 霍夫曼树和霍夫曼编码trcpy怎么定义 -
黎许参芪: 一、哈夫曼树的概念和定义什么是哈夫曼树?让我们先举一个例子.判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率.例如,编制一个程序,将百分制转换成五个等级输出....

汝阳县18697217038: 哈夫曼树怎样构造编码? -
黎许参芪: 先编造哈夫曼树,哈夫曼树构造规则: 假设有n个权值,则构造出的哈夫曼树有n个叶子结点. n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); (2) ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网