哈夫曼树的原理证明
首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。
哈夫曼在上世纪五十年代初就提出这种编码时,根据字符出现的概率来构造平均长度最短的编码。它是一种变长的编码。在编码中,若各码字长度严格按照码字所对应符号出现概率的大小的逆序排列,则编码的平均长度是最小的。(注:码字即为符号经哈夫曼编码后得到的编码,其长度是因符号出现的概率而不同,所以说哈夫曼编码是变长的编码。)
然而怎样构造一棵哈夫曼树呢?最具有一般规律的构造方法就是哈夫曼算法。一般的数据结构的书中都可以找到其描述:
一、对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。)
二、在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
三、从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
四、重复二和三两步,直到集合F中只有一棵二叉树为止。
用C语言实现上述算法,可用静态的二叉树或动态的二叉树。若用动态的二叉树可用以下数据结构: struct tree{
float weight; /*权值*/
union{
char leaf; /*叶结点信息字符*/
struct tree *left; /*树的左结点*/
};
struct tree *right; /*树的右结点*/
};
struct forest{ /*F集合,以链表形式表示*/
struct tree *ti; /* F中的树*/
struct forest *next; /* 下一个结点*/
};
例:若字母A,B,Z,C出现的概率为:0.75,0.54,0.28,0.43;则相应的权值为:75,54,28,43。
构造好哈夫曼树后,就可根据哈夫曼树进行编码。例如:上面的字符根据其出现的概率作为权值构造一棵哈夫曼树后,经哈夫曼编码得到的对应的码值。只要使用同一棵哈夫曼树,就可把编码还原成原来那组字符。显然哈夫曼编码是前缀编码,即任一个字符的编码都不是另一个字符的编码的前缀,否则,编码就不能进行翻译。例如:a,b,c,d的编码为:0,10,101,11,对于编码串:1010就可翻译为bb或ca,因为b的编码是c的编码的前缀。刚才进行哈夫曼编码的规则是从根结点到叶结点(包含原信息)的路径,向左孩子前进编码为0,向右孩子前进编码为1,当然你也可以反过来规定。
这种编码方法是静态的哈夫曼编码,它对需要编码的数据进行两遍扫描:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,即把字符0-255(2^8=256)的频率值以2-4BYTES的长度顺序存储起来,(用4Bytes的长度存储频率值,频率值的表示范围为0--2^32-1,这已足够表示大文件中字符出现的频率了)以便解压时创建同样的哈夫曼树进行解压;第二遍则根据第一遍扫描得到的哈夫曼树进行编码,并把编码后得到的码字存储起来。 静态哈夫曼编码方法有一些缺点:一、对于过短的文件进行编码的意义不大,因为光以4BYTES的长度存储哈夫曼树的信息就需1024Bytes的存储空间;二、进行哈夫曼编码,存储编码信息时,若用与通讯网络,就会引起较大的延时;三、对较大的文件进行编码时,频繁的磁盘读写访问会降低数据编码的速度。
因此,后来有人提出了一种动态的哈夫曼编码方法。动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。动态哈夫曼编码比静态哈夫曼编码复杂的多,有兴趣的读者可参考有关数据结构与算法的书籍。
前面提到的JPEG中用到了哈夫曼编码,并不是说JPEG就只用哈夫曼编码就可以了,而是一幅图片经过多个步骤后得到它的一列数值,对这些数值进行哈夫曼编码,以便存储或传输。哈夫曼编码方法比较易懂,大家可以根据它的编码方法,自己编写哈夫曼编码和解码的程序。
给定权值〔3,9,13,5,7〕,构造相应的哈夫曼树,并计算其大带权路径长度...
具体回答如图:给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
证明:N个叶子结点的哈弗满树, 那么需要2n-1的一维数组来存储_百度知 ...
二叉树的性质中有n0=n2+1这条,记得吧。哈夫曼树中没有n1结点,知道吧 N个叶子结点,所以n0=N,n2=n0-1=N-1,总共2N-1个结点。
为什么99个结点的哈夫曼树,用二叉链表,它的空指针域会是51个?_百度知...
二叉链表构造方法是左孩子右兄弟,根节点无兄弟、存在一个空指针域。50个叶子结点,51个空指针。因为是二叉链表,就是孩子兄弟表示法,不是一般的二叉树那样画,要转化一下。在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号...
数据结构,设哈夫曼树的叶子结点总数为m,则结点总数为多少,这个题目怎么...
哈夫曼树是二叉树,且结点的度只有两种,一种是度为0的叶子节点,另一种则是度为2的内部结点,不存在度为1 的结点。根据二叉树的性质,度为0的结点和度为2 的结点的关系:n0=n2+1很容易算出;叶子结点总数为m的哈夫曼树的总结点数为:2m-1。在一棵树中,从一个结点往下可以达到的孩子或孙子...
离散数学求解答过程(求证后加分)
证明:(1) ┐Q P(附加前提)(2)PvQ P (3) ┐Q→P T(2)E (4)P T(1)(3)I (5)R→┐P P (6) P→┐R T(5)E (7) ┐R T(4)(6)I (8) ┐Q→┐R CP 4 用哈夫曼树编码 把出现频率化为权重形式,得 【0】0.27,【1】0.26,【2】0.16,【3...
哈夫曼树怎么画?
比较剩下的数字和这个和的大小,再取出两个最小的数字进行排序。5、若两个数的和正好是下一步两个最小数其中一个,那么这个树直接往上生长。若两个数的和比较大,不是下一步两个最小数其中一个,那么就并列生长。6、继续用倒V型的树杈,向上延伸,算出最后一个结果,就证明哈夫曼树构建成功。
有N个结点的哈夫曼树中,叶子结点个数是5个,那么度为2的结点个数是多少...
若根结点为0层,叶结点到根结点的路径长度为叶结点的层数,树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln)。N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n),可以证明哈夫曼树的WPL是...
由五个带权值为9,2,3,5,14的叶子结点构成哈夫曼树,带权路径长度为...
叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。
用huffman算法求带权为2,3,5,7,8的最优2元树,要求画出中间过程?_百度...
7\/8应该一起作为同一父的叶这样才是最优,权为55 把最小的两个数2、3放在最下面作为左右叶子节点,得出他们的父节点权值5,然后它和剩余里最小的数5做成左右兄弟节点,得出父节点10,以此类推啊,10和7得出17,17和8,得到跟节点25完成。例如:先将所有的权值选出最小的两个值,为1,4,这两...
由8个权值构造一棵哈夫曼树,该树有几个结点
权值点是哈夫曼树的叶子节点,8个叶子节点需要4个度为二的结点,然后依次需要2个结点为上面4个结点的根结点,以及1个根结点,总共需要15个。其实画出8个叶子节点的完全二叉树即可,总共有15个结点。给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最...
撒峰保儿: 哈夫曼树 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码.首先介绍什么是哈夫曼树.哈夫曼...
泰安市15324307305: 哈夫曼编码的最优子结构性质怎么证明 - ?
撒峰保儿: 哈夫曼编码一般我们理解为将字符用01表示,由于不同字符出现的次数不一样,我们将出现次数多的字符编码短一些,次数少的编码长一些.哈夫曼编码的设计原理是先构造哈夫曼树,哈夫曼树构造规则是选择两个权值最小的结点构造为树,递归这一过程直到一棵树位置,所有信源对应的结点都是叶子结点.然后根据哈夫曼树,构造编码的时候,为每一个叶子结点设计编码.往左默认为0,往右默认为1,所以每个叶子结点都有一个编码,当然信源都有哈夫曼编码.这个证明题不知道要考什么.
泰安市15324307305: 请描述哈夫曼算法,并用图描述构造哈夫曼树的过程. - ?
撒峰保儿: 这个讲的相当清楚.首先介绍什么是哈夫曼树.哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其...
泰安市15324307305: 哈夫曼树的构成原理? - ?
撒峰保儿: #include#include #define MAXSIZE 30/*自定义哈夫曼的最大个数*/ typedef struct { int weight;/*结点的权值*/ int parent;/*结点的双亲*/ int lchild;/*结点的左孩子*/ int rchild;/*结点的右孩子*/ int flag;/*是否用过的标志*/ }HufmTree; int p1,p2;/*...
泰安市15324307305: 简述哈夫曼树的性质.?
撒峰保儿: 哈 夫 曼 树 2.9 二叉树的应用2.9.1 哈夫曼树及应用 哈夫曼树又称最优树(二叉树),是一类带权路径最短的树.构造这种树的算法最早是由哈夫曼(Huffman)1952年提出,这种树在信息检索中很有用.结点之间的路径长度:从一个结点到另一...
泰安市15324307305: 到底什么是哈夫曼树啊,求例子 - ?
撒峰保儿: 哈夫曼树是给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 例子: 1、将w...
泰安市15324307305: 什么是哈夫曼树呢? - ?
撒峰保儿: 夫曼树是带权路径长度最小的二叉树,用途是平均查找信息的代价最小. 普通二叉树的用途也普通,比较通用,就是信息存储和查找. 普通二叉树可能有的只有一个子节点,而哈夫曼树一定有两个.
泰安市15324307305: 哈夫曼编码原理 - ?
撒峰保儿: 原发布者:a2420092945 Huffman树及其应用一、最优二叉树(霍夫曼树)预备知识:若干术语路d径:由一结点到另一结点间的分支所构成a→e的路径长度=2beacfg路径长度:路径上的分支数目树长度=10树的路径长度:从树根到每一结点的...
泰安市15324307305: 哈夫曼树的构建过程 - ?
撒峰保儿: 哈夫曼树: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 哈夫曼树的构造: 假...
泰安市15324307305: 哈夫曼树的建立?
撒峰保儿: 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最...