赫夫曼树

代码在:github.com

赫夫曼(Huffman)树,又称最优树,是一类带权路径长度最短的树。

树的路径和路径长度:从树中一个节点到另一个节点之间的分支构成这两个节点之间的路径,路径上的分支数目乘坐路径长度树的路径长度是从树根到每一个节点的路径长度之和。

带权路径长度:从该节点到树根之间的路径长度与节点上权的乘积,树的带权路径长度为树中所有叶子结点的带权路径长度之和,通常记作: $ WPL=\sum_{k = 1}^{n}w_kl_k $。

例如下面三颗树的路径长度为:

  • (a) WPL = 7 * 2 + 5 * 2 + 2 * 2 + 4 * 2 = 36
  • (b) WPL = 7 * 3 + 5 * 3 + 2 * 1 + 4 * 2 = 46
  • © WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3 = 35

其中(c)树的路径长度最小,其就是赫夫曼树,即带权路径长度在所有带权为 7、5、2、4 的 4 个叶子节点的二叉树中居最小。

构建赫夫曼树的过程

  1. 根据给定的 n 个权值 {w1, w2, …, wn} 构成 n 棵二叉树的集合 $ F = {T_1, T_2, …, T_n} $ , 其中每棵二叉树 $ T_i $ 中只有一个带权为 $ w_i $ 的跟节点,其中左右子树均为空。
  2. 在 F 中选取两棵跟节点的权值最小的树作为左右子树构建一棵新的二叉树,且置新的二叉树的根节点的权值为其左、右子节点的权值之和。
  3. 在 F 中删除这两棵树,同时将新得到的二叉树加入到 F 中。
  • 重复 2、3,直到 F 中只有一棵树为止。这棵树就是赫夫曼树。

构造过程如下图所示:

赫夫曼树的应用 – 数据压缩

霍夫曼编码(Huffman Coding)是一种基于最小冗余编码的压缩算法。最小冗余编码是指,如果知道一组数据中符号出现的频率,就可以用一种特殊的方式来表示符号从而减少数据需要的存储空间。

一个字符串为 ABACCDA 假设 A、B、C、D 的编码分别是 00,01,10,11,则上述7个字符的字符串可编译为 00010010101100(长度为14),接收时按照2bit一字符的方式译码。当然我们希望字符串可以尽可能的短,占用更少的空间,假设我们重新设计 A、B、C、D 的编码分别是 0,00,1,01,那么我们将上面7个字符编码为:000011010(长度为9),但是这样的编码无法翻译,比如 0000 即可翻译为 AAAA 也可翻译为 ABA。因此若要设计长短不等的编码,则必须是任一个字符的编码都不是另一个字符的编码的前缀,这样的编码称做前缀编码

假设每种字符在字符串中出现的频率为 $ w_i $, 该字符编码的长度为 $ l_i $,则字符串总长度为 $ \sum_{i = 1}^{n}w_il_i $,这个是不是看着有点眼熟?没错就是赫夫曼树带权路径长度的公式。将字符在字符串中出现的频率作为权值,字符编码长度为根到叶子节点的路径长度。

根据上面的公式可以设计字符串 ABACCDA,中A、B、C、D 的编码。A、B、C、D 的出现的概率从小到大排序为 D-B-C-AB-D-C-A,约定左右分支分别代表 0 和 1,根据排序的结果构建赫夫曼树,并得到编码集:

编码和译码:

  • 编码,可以从根部出发也可以从叶子节点出发遍历整棵树生成字符的赫夫曼编码。
  • 译码,读取编码中的 0 或 1 ,从根部出发直到寻找到叶子节点,即可得到字符原文。

例子 bmp 图像压缩

bmp 头部结构:

bmp图像压缩例子代码在这

赫夫曼树 和 赫夫曼树编码相关推荐

  1. 赫夫曼树(哈夫曼树)

    赫夫曼树->赫夫曼编码 在数据膨胀.信息爆炸的今天,数据压缩的意义不言而喻. 一个字节8位 赫夫曼编码压缩-无损压缩 可以看成成绩的排布.成绩是70-90之间占有70%,所以以下两个数据结构优化 ...

  2. 霍夫曼树(赫夫曼树、哈夫曼树)

    霍夫曼树:给定n个权值做为n个叶子节点,若该树的带权路径长度达到最小,这棵树为最优二叉树,也称赫夫曼树. 霍夫曼树中的几个概念 路径和路径长度 一棵树中,一个节点往下可以达到的孩子或孙子节点之间的通路 ...

  3. 树:赫夫曼树赫夫曼编码

    1,赫夫曼树 1.1,赫夫曼树基本介绍及相关概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的的二叉树为最优二叉树,也称为赫夫曼树,或者哈夫曼 ...

  4. 字符串哈夫曼树C语言,哈夫曼树(赫夫曼树、最优树)及C语言实现

    赫夫曼 哈夫曼树相关的几个名词 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径.路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 .例如在一棵树中,规定根结点所在层数为1层,那么 ...

  5. 哈夫曼树(赫夫曼树、最优树)详解

    赫夫曼树,别名"哈夫曼树"."最优树"以及"最优二叉树".学习哈夫曼树之前,首先要了解几个名词. 哈夫曼树相关的几个名词 路径:在一棵树中, ...

  6. 【数据结构】【哈夫曼树】哈夫曼树、赫夫曼树(Huffman Tree)C语言实现

    目录 一.哈夫曼树定义与原理 二.构建哈夫曼树 三.哈夫曼编码 完整代码: 前言:章末含c语言实现完整代码 一.哈夫曼树定义与原理 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权 ...

  7. 【Java数据结构与算法】第十二章 哈夫曼树和哈夫曼编码

    第十二章 哈夫曼树和哈夫曼编码 文章目录 第十二章 哈夫曼树和哈夫曼编码 一.哈夫曼树 1.基本术语 2.构建思路 3.代码实现 三.哈夫曼编码 1.引入 2.介绍 3.代码实现哈夫曼编码综合案例 一 ...

  8. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件

    那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...

  9. 霍夫曼树及霍夫曼编码的C语言实现,霍夫曼树及霍夫曼编码的C语言实现

    从周五开始学习霍夫曼树,一直到今天终于完成,期间遇到了各类各样的棘手的问题,经过一遍遍在纸上分析每一步的具体状态得以解决.如今对学习霍夫曼树的过程加以记录web 首先介绍霍夫曼树数组 霍夫曼树(Huf ...

最新文章

  1. Apache中抑制IP段,在httpd.conf中的写法
  2. 华为oj平台的新网址
  3. [RN] React Native 实现 类似京东 的 沉浸式状态栏和搜索栏
  4. POJ3889-Fractal Streets【分形,递归,分治】
  5. linux nfs限制连接数,linux – 对NFS有一个有效的稳定性参数吗?
  6. 【GDB调试学习笔记】GDB查看运行时数据
  7. Android 系统开发_核心技术篇 -- 深入钻研 JNI
  8. 微信小游戏制作坦克大战(三)添加发射炮弹按钮,主角坦克可以发射炮弹
  9. EXCEL-解决表格被锁定和分组的冲突
  10. spacy包及trained pipelines安装教程
  11. java唯一订单号_java高并发下唯一订单号生成器【16位数字订单号】
  12. 4G模块 | 基于4G Cat.1的内网穿透实践
  13. 又一大佬加盟OpenAI!他还是姚班学霸陈立杰的导师
  14. 106短信平台备受欢迎的原因
  15. 零和对策matlab,零和对策
  16. 计算机关闭应用窗口的方法,电脑怎么从后台关闭程序应用
  17. 如何成为一名卓越的软件工程师
  18. 未成年帐号登录华为游戏,启动后不断弹出防沉迷提示
  19. seq2seq模型_具有注意力机制的seq2seq模型
  20. 信息技术发展史及其趋势

热门文章

  1. 微信小程序bug小全 : [“usingComponents“][“XXX“]: “../../components/XXX/XXX“ 未找到
  2. CY7C68013A在win7中的驱动安装
  3. 苹果Vision Pro手势+眼球融合交互的奥秘
  4. 亚马逊欧洲站9月以后卖什么比较有市场——新手怎么去做亚马逊?
  5. SGU 106 The euqation
  6. 尝试理解ICA(Independent Component Analysis)独立成分分析
  7. 【oracle工具报错】plsqldev客户端中的PL/SQL美化器文件的规则不能用的郁闷事(因注释放错位置)
  8. 常见的邮箱服务器(SMTP,POP3)地址,端口
  9. Mac 电脑截屏 不 自动保存 到 桌面问题
  10. 浏览器缓存和HTTP缓存协商