问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

哈夫曼树是什么?求解

发布网友 发布时间:2022-05-01 23:43

我来回答

1个回答

热心网友 时间:2022-06-25 05:13

哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。
  首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为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就只用哈夫曼编码就可以了,而是一幅图片经过多个步骤后得到它的一列数值,对这些数值进行哈夫曼编码,以便存储或传输。哈夫曼编码方法比较易懂,大家可以根据它的编码方法,自己编写哈夫曼编码和解码的程序。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八个月孕妇痔疮怎么办 怀孕痔疮严重怎么缓解 孕妇能割痔疮吗 孕37周痔疮严重怎么办 孕37周痔疮可以顺产吗 怀孕晚期痔疮严重怎么办 我打开网上邻居,里面变成空的了,以前打开就有“宽带连接”和“本地连 ... 单位有些电脑打开网上邻居没东西显示是为什么? 生产线称重 梦比优斯奥特曼第35集19:38秒时,希卡利站起来时的那个背景音乐是... 梦比优斯奥特曼中希卡利出现时的音乐 哈夫曼树的基本概念是什么? 到底什么是哈夫曼树啊,求例子 哈夫曼树!!与普通二叉树的区别是?? 用简单的语言概括什么是哈夫曼树 哈夫曼树是满二叉树吗?我就奇怪了,书上的图都不是满二叉树,怎么就有那么多人回答是满二叉树呢, 霍夫曼树一定是满二叉树吗? 哈夫曼树是二叉树吗? 自制宝宝辅食鸡肉松怎么做 婴儿无盐鸡肉松的做法步骤图,怎么做好吃 婴儿辅食鸡肉松怎么加 辅食肉松的做法 鸡肉松做法 鸡肉松(辅食版)的做法步骤图,怎么做好吃 宝宝辅食鸡肉松 宝宝辅食之鸡肉松的做法步骤图,怎么做好吃 声卡驱动精灵2011版的怎么用 声卡驱动精灵的介绍 如何用驱动精灵更新声卡驱动 如何用驱动精灵检查声卡 声卡驱动精灵是驱动精灵吗 哈夫曼树的介绍 为什么我抖音直播已经停了三个多月了,而信息显示才几天? 抖音直播被禁播10分钟,现在上不去抖音,显示被封号,怎么办? 豆角卤子怎么做好吃 豆角卤子怎么做如何做好吃 2个月大~长毛德国牧羊犬该如何训练! 翋阳城做的豆角卤大米怎么做的好吃 榨菜豆角卤怎么做好吃 德国牧羊犬怎么看长毛还是短毛 长毛德牧多钱一只 德牧是长毛平背好还是短毛弓背好? 东德DDR和西德长毛牧羊犬,哪个价格昂贵些! 我想买一只长毛德国牧羊犬3个月大要多少钱? 长毛德牧屁股太高可以人工校正吗 mysql查询我在各科考试中的名次 怎样分辨2个月德牧是长毛还是短毛或是中长毛,请详细说说 什么是二毛德牧? 招商银行“一网通”网上银行业务为企业带来哪些便利 电子这个词翻译成英文应该是什么用汉语应该怎么读请各位标注—下 Electronics缩写拜托了各位 请问电子英文的简写是什么呢?