哈夫曼树

哈夫曼树

别等时光非礼了梦想. 提交于 2019-11-30 14:31:42
1. 哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 1.1 路径和路径长度 定义 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子 :100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。 1.2 结点的权及带权路径长度 定义 :若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 例子 :节点20的路径长度是3,它的带权路径长度= 路径长度 权 = 3 20 = 60。 1.3 树的带权路径长度 定义 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 例子 :示例中,树的WPL= 1 100 + 2 80 + 3 20 + 3 10 = 100 + 160 + 60 + 30 = 350。 比较下面两棵树 上面的两棵树都是以{10, 20, 50, 100}为叶子节点的树。 左边的树WPL=2 10 +

哈夫曼树

杀马特。学长 韩版系。学妹 提交于 2019-11-30 02:40:08
哈夫曼树是最优二叉树。 给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 结点的权及带权路径长度 若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 树的带权路径长度 树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,哈夫曼树的构造规则为: 1. 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); 2. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和; 3. 从森林中删除选取的两棵树,并将新树加入森林; 4. 重复(02)、(03)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。 来源: CSDN 作者: 情愫, 链接: https://blog.csdn.net/qq_43627167/article/details/103246218

再续哈夫曼树实现

对着背影说爱祢 提交于 2019-11-29 14:58:55
今天看了趣学算法中的有关哈夫曼树的一个问题,就蛮有兴致再写一次哈夫曼树,但这个算法的实现和我之前的哈夫曼的实现方法略有不同。 声明一下,这个实现我是采纳书上的,觉得还不错,就写了。 回顾 这个问题是这样描述的: 在远距离的信息通信过程和大容量数据存储方面运用比较广泛的数据压缩就是采用哈夫曼编码进行的。如果让我们尝试一次,哈夫曼树应该如何实现呢? 回忆一下:哈夫曼树的几个性质,我们要知道,哈夫曼树没有度为一的结点,而且N个叶子结点的哈夫曼树具有 2 * N - 1个结点 。然后呢,利用类似二叉树的分为左右两个孩子节点起关系连接作用。最后呢,我们所求得到的编码要是从叶子节点到根节点路径。了解这一些,我们就开始吧。 实现过程 我们采用的struct的存储方式,其中struct的结构体内容有 int lchild ; //左孩子 int rchild ; //右孩子 double weight ; //权值 char value ; //该节点所代表的字符 然后呢,与之前的不一样的地方来了,我们将每个叶子节点到 根节点的路径都分别用数组存起来,而不是直接建立二叉树然后遍历求权重,就如同 直接利用数字 0 和 1来区分该节点的左右孩子; 首先固定数组的最大长度,例如:bit[Maxsize],将 Maxsize 赋值为至少为 2 * N - 1; 然后呢就会这样:0 1 0 1 1 0

数据结构--哈夫曼树

◇◆丶佛笑我妖孽 提交于 2019-11-28 22:27:45
Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 (01) 路径和路径长度 定义 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子 :100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。 (02) 结点的权及带权路径长度 定义 :若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 例子 :节点20的路径长度是3,它的带权路径长度= 路径长度 * 权 = 3 * 20 = 60。 (03) 树的带权路径长度 定义 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 例子 :示例中,树的WPL= 1* 100 + 2*5 0 + 3* 20 + 3* 10 = 100 + 100 + 60 + 30 =290。 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。 ② 路径长度

转:哈夫曼树详解

故事扮演 提交于 2019-11-28 03:41:01
转载至: https://blog.csdn.net/guoweimelon/article/details/50904321 一、哈夫曼树的定义   (1)简单路径长度   所谓树的简单路径长度,是指从树的根结点到每个结点的路径长度之和。   完全二叉树是简单路径长度最小的二叉树   (2)加权路径长度     所谓树的加权路径长度,是指树中所有带权(非0)叶节点的加权路径长度之和。     如下图所示,不同的树结构,加权路径长度也不一样。          1:WPL=1* 4 +2* 4 +3* 3 +4* 2 +5* 1 =34 (加粗为路径长度)     2:WPL=5* 4 +4* 4 +3* 3 +2* 2 +1* 1 =50     3:WPL=1* 3 +2* 3 +3* 2 +4* 2 +5* 2 =33   (3)哈夫曼树的定义     哈夫曼树又称最优二叉树。哈夫曼树是指 具有相同结点的树中,加权路径长度最小 的二叉树。 二、哈夫曼树的构造过程   哈夫曼树的构造过程需要借助最小堆算法。   如下图所示,首先将原始数据构造出一个最小堆,然后每次从堆中选取值最小两个节点,计算他们的权重之和,作为一个新结点的值,然后插入到最小堆中,直到所有数据结点都构造完毕,成为一个最大堆。    三、哈夫曼树的作用(哈夫曼编码)     哈夫曼编码是一种编码方式

Huffman树

孤人 提交于 2019-11-28 03:03:40
什么是哈夫曼树呢? 结点的带权路径长度:在一棵树中,如果其结点上附带有一个权值,通常把该结点到根的路径长度与该结点上的权值之积称为该结点的带权路径长度 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为: 图a: 5*2+7*2+2*2+13*2=54 图b: 5*3+2*3+7*2+13*1=48 可见,图b的带权路径长度较小,我们可以证明图b就是哈夫曼树(也称为最优二叉树)。 如何构建哈夫曼树? 一般可以按下面步骤构建: 1,将每个点看成一棵树 2,在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。 3,从森林中删除这两棵树,同时把新树加入到森林中。 4,重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。 下面是构建哈夫曼树的图解过程: 哈夫曼编码 在电文传输中,需要将电文中出现的每个字符进行二进制编码。在设计编码时需要遵守两个原则: (1)发送方传输的二进制编码,到接收方解码后必须具有唯一性,即每个字符的编码不能是其它字符的前缀。 (2)发送的二进制编码尽可能地短。 利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子节点都有一条路径,对路径上的各分支约定指向左子树的分支表示”0”码

数据结构慕课PTA 05-树9 Huffman Codes

核能气质少年 提交于 2019-11-27 20:49:53
题目内容 In 1953, David A. Huffman published his paper "A Method for the Construction of Minimum-Redundancy Codes", and hence printed his name in the history of computer science. As a professor who gives the final exam problem on Huffman codes, I am encountering a big problem: the Huffman codes are NOT unique. For example, given a string "aaaxuaxz", we can observe that the frequencies of the characters 'a', 'x', 'u' and 'z' are 4, 2, 1 and 1, respectively. We may either encode the symbols as {'a'=0, 'x'=10, 'u'=110, 'z'=111}, or in another way as {'a'=1, 'x'=01, 'u'=001, 'z'=000}, both compress

acwing 149. 荷马史诗 [哈夫曼树]

半城伤御伤魂 提交于 2019-11-27 16:09:44
追逐影子的人,自己就是影子。 ——荷马 达达最近迷上了文学。 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。 但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,达达想通过一种编码方式使得它变得短一些。 一部《荷马史诗》中有 n 种不同的单词,从 1 到 n 进行编号。其中第 i 种单词出现的总次数为 wi。 达达想要用 k 进制串 si 来替换第 i 种单词,使得其满足如下要求: 对于任意的 1≤i,j≤n,i≠j,都有:si 不是 sj 的前缀。 现在达达想要知道,如何选择 si,才能使替换以后得到的新的《荷马史诗》长度最小。 确保总长度最小的情况下,达达还想知道最长的 si 的最短长度是多少? 一个字符串被称为 k 进制字符串,当且仅当它的每个字符是 0 到 k−1 之间(包括 0 和 k−1)的整数。 字符串 Str1 被称为字符串 Str2 的前缀,当且仅当:存在 1≤t≤m,使得 Str1=Str2[1…t]。 其中,m 是字符串 Str2 的长度,Str2[1…t] 表示 Str2 的前 t 个字符组成的字符串。 输入格式 输入文件的第 1 行包含 2 个正整数 n,k,中间用单个空格隔开,表示共有 n 种单词,需要使用 k 进制字符串进行替换。 第2~n+1 行:第 i+1 行包含 1 个非负整数 wi,表示第

树3-2、哈夫曼树(利用最小堆生成的最优二叉树)与哈夫曼编码

你。 提交于 2019-11-27 08:36:13
一、哈夫曼树(最优二叉树) 1、问题引出: 那么,如何根据结点不同的查找频率构造更有效的搜索树? 2、哈夫曼树的构造 ——> ——> ——> ——> 算法:先选取两个权值最小的——用最小堆 二、哈夫曼编码 a:00  u:01  x:10  z:11 可以发现,如果他们都在叶结点上,那么任意一个字母的编码都不可能是其他字母的前缀码 当有一个不在叶结点上时,它就是它下面的结点的前缀码 如a是s的前缀码 接下来考虑的是代价最小: 只要我们用哈夫曼树来构造就可以了! 来源: https://www.cnblogs.com/maider/p/11354903.html

树-哈夫曼树(Huffman Tree)

你离开我真会死。 提交于 2019-11-26 14:57:14
概述 哈夫曼树:树的带权路径长度达到最小。 构造规则 1 . 将w 1 、w 2 、…,w n 看成是有n 棵树的森林(每棵树仅有一个结点); 2 . 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和; 3 . 从森林中删除选取的两棵树,并将新树加入森林; 4 . 重复(02)、(03)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。 基本操作 定义 1 权值 2 左孩子 3 右孩子 4 父节点 构造哈夫曼树(使用最小堆) 1 构造最小堆; 2 进入for循环: (01) 首先,将最小堆中的最小节点拷贝一份并赋值给left,然后重塑最小堆(将最小节点和后面的节点交换位置,接着将"交换位置后的最小节点"之前的全部元素重新构造成最小堆); (02) 接着,再将最小堆中的最小节点拷贝一份并将其赋值right,然后再次重塑最小堆; (03) 然后,新建节点parent,并将它作为left和right的父节点; (04) 接着,将parent的数据复制给最小堆中的指定节点。 转载于:https://www.cnblogs.com/lucas-hsueh/p/3736772.html 来源: https://blog.csdn.net/weixin_30635053/article/details/98904046