首页 > 其他分享 >赫夫曼树

赫夫曼树

时间:2023-01-07 12:44:07浏览次数:24  
标签:编码 字符 路径 长度 节点 夫曼

前置知识

  • 路径长度和带权路径长度

 

 

 路径长度:两节点间路径的分支数量为路径长度。如二叉树a从根节点到D节点的路径长度为4,根节点到B节点的路径长度为2。

树的路径长度:从根节点到每一个结点的路径长度之和。如二叉树a的路径长度为:1+1+2+2+3+3+4+4=20。

带权路径长度:从该节点到树根节点的路径长度乘上节点的权值。

树的带权路径长度(WPL):树中每个叶子结点的带权路径长度之和。如二叉树a中的WPL=5×1+15×2+40×3+30×4+10×4=315。b中的WPL=5×3+15×3+40×2+30×2+10×2=220。(图中省略了%号)

带权路径长度最小的二叉树称为赫夫曼树。

假设节点的权值为一个文件中某个字符出现的概率,同时这个文件拥有1000个字符,则使用a树想要找到某个字符需要3150次查询,而b树只需要2200次。

 

  • 构造赫夫曼树

1.先把有权值的叶子结点按照从小到大的顺序排列成一个有序序列AEBDC。

2.取两个最小权值的结点作为一个新节点N1的两个子结点,注意相对较小的是左孩子,这里就是A 为N的左孩子,E为N1的右孩子,N1的权值变为两个孩子节点权值之和重新加入到序列中,

同时保持有序。

3.重复第一步操作直到只剩一个节点为止,这最后一个节点便是赫夫曼树的根节点。

结果

 

赫夫曼编码

 

 

 赫夫曼树不仅仅可以用来减少判断的次数还可以用来编码,减少编码的长度从而实现对文件压缩的效果。

例如正常情况下我们可以对字符这样编码

 

 现在要对含有这六个字符的字符串进行压缩。

假设六个字母的频率为A 27,B 8,C 15,D 15,E 30,F 5,合起来正好是100%。那就意味着,我们完全可以重新按照赫夫曼树来规划它们。

 

之后依照遍历时是向左走还是向右走对字符重新编码可得

 

 可以看到一些字符变短了,这样也就实现了压缩效果。需要注意的是,任意一个字符的编码不是另一个字符编码的前缀,例如一个字符的编码为1001,如果另一个字符的编码是100,在遍历

一个字符串10011001时,无法获知刚开头是字符1001的编码还是100的编码,从而造成错乱。

 

标签:编码,字符,路径,长度,节点,夫曼
From: https://www.cnblogs.com/redintoncforever/p/17032471.html

相关文章

  • 哈夫曼树哈夫曼编码
    输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。输入格式:第一行输入叶子结点个数,接着依次输入权值。输出格式:输出哈夫曼编码,输出带权路径长度。代......
  • 哈夫曼树哈夫曼编码
    输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。输入格式:第一行输入叶子结点个数,接着依次输入权值。输出格式:输出哈夫曼编码,输出带权路径长度。输......
  • 哈夫曼树课程实验报告--C++
    主要内容:  设计一个哈夫曼树,建立函数输入二叉树,并输出哈夫曼树。实现哈夫曼树的初始化并打印,进一步理解哈夫曼树的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际......
  • 通过权值建立构造哈夫曼树
    构造哈夫曼树步骤是,选择两个权值最小的点构造树,新树根权值为左右子树权值之和,新的权值放回到序列中,继续按照上述不走构造树,直到只有一颗树为止。权值排序一下:23568选......
  • 赫夫曼树的实现
    packageHuffmanTrere;importjavax.swing.plaf.nimbus.NimbusLookAndFeel;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Collections;......
  • hdu最佳编码(哈夫曼编码)
    ProblemDescription文本编码是计算机通信中的常见问题。以文本“AAAAABCD”为例,如果使用ASCII,则一共需要64位(因为每个字符的ASCII编码都是需要8位)。对应的,如果我们将......
  • 哈夫曼树
    typedefstructTreeNode*HuffmanTree;structTreeNode{intWeight;HuffmanTreeLeft,Right;};HuffmanTreeHuffman(MinHeapH){BulidMinHeap(H);......
  • 哈夫曼树
    哈夫曼树概念哈夫曼(Huffman)树又称最优二叉树。它是n个带权叶子结点构成的二叉树中,带权路径长度WPL最小的二叉树。因为构造这种树的算法是最早由哈夫曼于1952年提出的,所以......
  • 哈夫曼编码
    这是今天的第二篇博客,也是有关数据结构的实验题,实现哈夫曼编码题目要求:输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。输入格式:第一行输入叶子结点......
  • 赫夫曼树
    赫夫曼树定义:WPL最小的二叉树就是赫夫曼树,WPL全称weightpathlength,中文意思是树的带权路径长度,规定为所有叶子节点的带权路径长度之和,计算方法是权值*带权路径长度......