Huffman树又称为最优树,是一种带权路径最短的树。

一、带权路径


在一棵树中我们把一个节点到另一个节点之间的通路叫做路径,在路径中每经过一个节点路径的长度就加一。如果对一个节点附上权值,则该节点的带权路径长为该节点到树根的路径长与权的乘积。
在一棵有\(n\)个叶子节点的树中,令每个叶子节点的权为\(w_i\),路径长为\(l_i\),则树的带权路径长\(WPL=\sum_{k=1}^{n}w_kl_k\)。

如图所示,令a、b、c、d分别带权7、5、2、4,这他们的带权路径长为\(WPL=7*3+5*3+2*1+4*2=46\)。

二、Huffman树


对一颗二叉树,如果对一组给定的权,使得其WPL最小,那么这颗二叉树称为Huffman树(或最优二叉树)。
Huffman树的构造方法:

(1)首先建立一组二叉树集合,每颗二叉树仅含一个节点,每个节点对应一个权值。
(2)在二叉树集合中选取权值最小的两科二叉树,把它们合并为一颗新树,新树根节点的左右子树为所选的二叉树,新树的权值为两颗子树权值的和。
(3)在树集中删去选出的两颗二叉树,并将新树加入树集中。
(4)重复(2)和(3),直到树集中只剩下一颗二叉树,这棵树便是所需的Huffman树。

如图:

三、Huffman编码


Huffman编码是一种编码方式,主要用于数据文件的压缩。Huffman编码是一种不定长度编码,它保证让经常使用的字符拥有较短的编码,来加快文件传输的效率。
假如我们有\(n\)个字符,且每个字符在文件里出现的频数为\(w_i(i=1,2,...,n)\)。则我们以\(n\)个字符作为初始树集,并以\(w_i\)作为对应的权值构建Huffman树,且约定左分支为字符'0',右分支表示字符'1',则从根节点到叶子节点的路径上分支字符所组成的字符串即为对应字符的Huffman编码。

假如我们有一个文件,它只包含字符'a','s','d','f','g',并且字符对应出现的频数为12,4,8,15,9,以此为基础建立Huffman树如下图所示:

Haffman编码的更多相关文章

  1. ACM Haffman编码

    Haffman编码 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...

  2. Haffman编码(haffman树)

    Haffman编码 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 哈弗曼编码大家一定很熟悉吧(不熟悉也没关系,自己查去...).现在给你一串字符以及它们所对应的权值 ...

  3. java实现Haffman编码

    1.先创建一个树节点类(泛型类),为了方便使用集合的排序方法,泛型类要实现泛型接口Comparable,代码如下 package com.hjp.huffman; /** * Created by J ...

  4. 转载一篇关于unicode字符编码的文章

    很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一 ...

  5. Python 学习之进制与编码

    进制 日常生活中,我们最熟悉的数据就是十进制计数.它的数值部分由十个不同的数字符号0.1.2.3.4.5.6.7.8.9来表示,我们把这些数字符号叫做数码,表示十种不同的状态.数码处于不同的位置(或数 ...

  6. Ansi,UTF8,Unicode,ASCII编码的差别

    近日须要不同的编码,关于上述编码,一直迷迷糊糊,查了些资料,总算大致了解了,以下全是从网上搜来的: 1.  ASCII和Ansi编码    字符内码(charcter code)指的是用来代表字符的内 ...

  7. 文件压缩小项目haffman压缩

    文件压缩的原理: 文件压缩总体可以分为有损压缩和无损压缩两类,有损压缩是指对mp3等格式的文件,忽略一些无关紧要的信息,只保留一些关键的信息,但并不因此影响用户对于这些mp3格式文件的体验度,无损压缩 ...

  8. Ansi,UTF8,Unicode,ASCII编码的区别 ---我看完了 明白了很多

    来自:http://blog.csdn.net/xiongxiao/article/details/3741731 ------------------------------------------ ...

  9. JPEG编码(二)

    来自CSDN评论区http://bbs.csdn.net/topics/190980 1. 色彩模型 JPEG 的图片使用的是 YCrCb 颜色模型, 而不是计算机上最常用的 RGB. 关于色彩模型, ...

随机推荐

  1. 几个java proxy servlet 工具

    HTTP-Proxy-Servlet 这个工具使用比较简单,可以通过配置,或者代码的方式 https://github.com/mitre/HTTP-Proxy-Servlet servlet 配置方 ...

  2. 寄存器,移位寄存器的电路原理以及verilog代码实现

    寄存器:用以存放二进制代码的电路,下图为由维特阻塞D触发器组成的4位数码寄存器: 逻辑功能分析: 1.异步端CR置0时,输出置0: 2.同步并行置数:D0~D3为4个输入代码,当CP上升沿到达时,D0 ...

  3. P4141 消失之物

    目录 链接 思路 代码 链接 P4141 消失之物 思路 f[N];//表示删掉物品后能出现容积为i的方案数 a[N];//单纯0-1背包的方案数asd 那么就先求出a[i]来,然后转移就是 if(j ...

  4. SpringMVC效验器

    效验器: 1. 效验器依赖 <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> &l ...

  5. 在 Mac、Linux、Windows 下Go交叉编译

    Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED= ...

  6. java读取文件夹下文件及txt内容

    public class PositionController {     // 读取txt内容     public static String txt2String(File file) {    ...

  7. answer

    https://www.cnblogs.com/549294286/p/10451394.html 基于BIO实现的Server端,当建立了100个连接时,会有多少个线程?如果基于NIO,又会是多少个 ...

  8. Css3 文字渐变整理(一)

    一.文本颜色渐变 <gradient> :可以应用在所有接受图像的属性上,允许使用简单的语法实现颜色渐变,以便UA在渲染页面自动生成图像. 语法:<gradient> = li ...

  9. uniapp - 点赞动画插件

    更新时间: 2019/8/31 - 点击下载demo 点赞动画插件配合animate.css更好用! 该组件参考于:https://github.com/OYsun/VueStar/tree/mast ...

  10. 基于cesium的GIS洪水淹没三维模拟系统

    简介: “FloodFreeth3D”是一款对Mike11软件计算的洪水演进结果使用cesium进行淹没演进三维模拟的软件产品.   技术参数: 1. B/S架构,支持多Web浏览器(ie.chrom ...