当前位置: 首页 > article >正文

哈夫曼树(HuffmanTree)

目录

哈夫曼树(HuffmanTree)

事例

基本概念 

路径

结点的路径长度

例1:计算路径长度

 例2:计算路径长度

树的路径长度

例:计算树的路径长度

权(weight)

结点的带权路径长度

例:计算结点的带权路径长度 

树的带权路径长度(Weighted Path Length,WPL) 

 例:求WPL

哈夫曼树定义

例:哈夫曼树

哈夫曼算法(构造哈夫曼树的方法)

例:构造哈夫曼树

例:构造哈夫曼树 

哈夫曼树的结点特点

哈夫曼编码

例:哈夫曼编码传输文字内容了解 

前缀编码 

哈夫曼编码性质

进行哈夫曼编码


哈夫曼树(HuffmanTree)

事例

基本概念 

路径

  • 从树中一个结点到另一个结点之间的分支构成这两个结点间的路径

结点的路径长度

  • 两结点间路径上的分支数 

例1:计算路径长度

 

  • A 到 B 的路径长度:1 
  • A 到 D 的路径长度:2 
  • A 到 G 的路径长度:3
  • A 到 I 的路径长度:4
  • ……

 例2:计算路径长度

  • A 到 B 的路径长度:1 
  • A 到 D 的路径长度:2 
  • A 到 G 的路径长度:2
  • A 到 I 的路径长度:3
  • ……

树的路径长度

  • 从树根到每一个结点的路径长度之和。记作:TL 
  • 根结点到自身的路径长度是0 
  • 结点数目相同的二叉树中,完全二叉树是路径长度最短的二叉树
    • 但路径长度最短的树不一定是完全二叉树

例:计算树的路径长度

权(weight)

将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权(weight)

结点的带权路径长度

从根结点到该结点之间的路径长度,与该结点的权的乘积 

例:计算结点的带权路径长度 

  • F 的带权路径长度为 2 × 7 = 14
  • H 的带权路径长度为 2 × 3  = 6

树的带权路径长度(Weighted Path Length,WPL) 

  • 树中所有叶子结点的带权路径长度之和 

 例:求WPL

哈夫曼树定义

  • 哈夫曼树:带权路径长度(WPL)最短的二叉树(最优二叉树)
    • “带权路径长度最短”是在“度相同” 的树中比较而得的结果,因此有最优二叉树、最优三叉树等等
  • 满二叉树不一定是哈夫曼树
  • 哈夫曼树中权越大的叶子离根越近
  • 具有相同带权结点的哈夫曼树不唯一

例:哈夫曼树

哈夫曼算法(构造哈夫曼树的方法)

口诀

  1. 构造森林全是根
  2. 选用两小造新树
  3. 删除两小添新人
  4. 选用2、3剩单根 

例:构造哈夫曼树

Q:有 4 个结点 a, b, c, d,权值分别为7,5,2,4,构造哈夫曼树

  • 构造森林全是根 

 

  • 选用两小造新树 

 

  • 删除两小添新人 

  • 重复2、3剩单根

 


例:构造哈夫曼树 

Q:有 5 个结点 a, b, c, d, e,权值分别为 7,5,5,2,4,构造哈夫曼树 

  • 构造森林全是根 

  • 选用两小造新树 

  • 删除两小添新人 

  • 重复2、3剩单根 
  • 重复2,挑选两小造新树

  • 重复3,删除两小添新人


  • 重复2,挑选两小造新树

  • 重复3,删除两小添新人


  • 最后

哈夫曼树的结点特点

  • 哈夫曼树的结点的度数为 0 或 2,没有度为 1 的结点 
    • 因为包含 n 棵树的森林要经过 n-1 次合并才能形成哈夫曼树
    • 共产生 n-1 个新结点,且这 n-1 个新结点都是具有两个孩子的分支结点
    • 共有 2n-1(n+n-1) 个结点

哈夫曼编码

  • 在远程通讯中,要将待传字符转换成由二进制的字符串
  • 统计字符集中每个字符在电文中出现的平均概率(概率越大,要求编码越短)
  • 利用哈夫曼树的特点:权越大的叶子离根越近,将每个字符的概率值作为权值,构造哈夫曼树。则概率越大的结点,路径越短
  • 在哈夫曼树的每个分支上标0或1
    • 结点的左分支标0,右分支标1
    • 把从根到每个叶子的路径上的标号连起来,作为该叶子代表的字符的编码

例:哈夫曼编码传输文字内容了解 

  • 如,要将内容为“BADCADFEED”要网络传输给别人,显然要用二进制的数字来表示

  •  对方接收时,为001000011010000011101100100011,可以按照 3 位一分来译码 ,如果一篇文章很长,这样的二进制也将非常可怕

  • 假设六个字母的频率为A 27,B 8,C 15,D15,E 30,F 5,合起来正好是100%。那就意味着,我们完全可以重新按照赫夫曼树来规划它们
  • 左图为构造赫夫曼树的过程的权值显示。右图为将权值左分支改为0,右分支改为1后的赫夫曼树


  •  我们对这六个字母用其从树根到叶子所经过路径的0或1来编码

  • 我们将文字内容为“BADCADFEED”再次编码,对比可以看到结果串变小了
  • 原编码二进制串:001000011010000011101100100011(共30个字符)
  • 新编码二进制串:1001010010101001000111100(共25个字符) 
  • 也就是说,我们的数据被压缩了,节约了大约17%的存储或传输成本

前缀编码 

  •  编码中非0即1,长短不等的话其实是很容易混淆的,所以若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称做前缀编码
  • 在解码时,还是要用到赫夫曼树,即发送方和接收方必须要约定好同样的赫夫曼编码规则

哈夫曼编码性质

哈夫曼编码是前缀码

哈夫曼编码是最优前缀码

进行哈夫曼编码

需要

  • 编码的字符集
  • 各个字符在电文中出现的次数或频率的集合

 


http://www.kler.cn/a/385888.html

相关文章:

  • 高级数据结构——hash表与布隆过滤器
  • SpringSecurity 鉴权认证入门讲解
  • 小白进!QMK 键盘新手入门指南
  • nginx源码安装配置ssl域名
  • Docker+Django项目部署-从Linux+Windows实战
  • 电商系统开发:Spring Boot框架实战
  • c++:模板和STL
  • 自动驾驶---“火热的”时空联合规划
  • Unity3D 包体裁剪与优化详解
  • Qt编译lua库并调用
  • Qt | http获取网页文件(小项目)
  • python爬虫自动库DrissionPage保存网页快照mhtml/pdf/全局截图/打印机另存pdf
  • leetcode20.括号匹配
  • 以梧桐数据库为例讲解如何计算用户连续登录比率
  • 站长用站群安全特性怎么样
  • Python 数据可视化详解教程
  • Java8->Java19的初步探索
  • 反射型XSS--理论
  • AI时代IDE解析
  • 云服务器Linux部署war、jar包,并在nginx配置域名
  • express 使用JWT认证
  • 低空经济之星eVTOL研发技术详解
  • 越权访问漏洞
  • 基于MFC实现的赛车游戏
  • 大神狂秀技术 成功让三星手机用上macOS
  • 【hdfs】【hbase】【大数据技术基础】实践二 HBase Java API编程