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. genie 来自netflix 的分布式大数据调度服务

    Genie是Netflix开发的联合作业编排引擎.Genie提供REST-ful API来运行各种大数据工作,如Hadoop,Pig,Hive,Spark,Presto,Sqoop等.它还提供用于管理 ...

  2. 中心极限定理(Central Limit Theorem)

    中心极限定理:每次从总体中抽取容量为n的简单随机样本,这样抽取很多次后,如果样本容量很大,样本均值的抽样分布近似服从正态分布(期望为  ,标准差为 ). (注:总体数据需独立同分布) 那么样本容量n应 ...

  3. SP5971 LCMSUM 数论

    题面 题目要我们求这个: \[\sum_{i=1}^n lcm(i,n)\] 开始化式子: \[\sum_{i=1}^{n} \frac{i*n}{gcd(i,n)}\] \[\sum_{d|n} \ ...

  4. ES6基础-变量的解构赋值

    作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...

  5. Jmeter(四十八)_动态线程分析HTML测试报告

    概述 jmeterGUI模式下,性能测试的结果往往误差很大,因为GUI本身就会消耗一部分资源.所以我们常常用命令行去跑性能脚本,得出结果 同时,jmeter在命令行下还可以生成多维度的测试报告,里面包 ...

  6. Swagger-BootStrap-UI生成的接口文档如何加Basic校验

    首先我们来看看swagger-bootstrap-ui的效果,如图所示: 看起来是不是比Swagger要大气的多. 回到重点上,为什么要给接口文档加密呢? 只对内开放,不对外开放,防止被第三方非公司人 ...

  7. Hawq架构

    Hawq采用分层架构,将MPP shared-nothing的计算层架在HDFS之上. Hawq集群中有三种角色:master, namenode和segment hosts. 1.Master负责认 ...

  8. css3中的盒子模型

    1.示例一 实现左右布局,左侧宽度200px,右侧自适配 代码如下: <!DOCTYPE html> <html lang="en"> <head&g ...

  9. 虚拟机ubuntu16下cheese打开摄像头黑屏问题

    在win7上安装了一个ubuntu1604的虚拟机: 在虚拟机下打开电脑上连接的摄像头时,用ubuntu16自带的cheese软件查看是黑屏: 但是cheese上有摄像头名字显示,就是打不开:如下图 ...

  10. Manifest中meta-data扩展元素数据的配置与获取

    简介-meta是什么 在AndroidManifest.xml清单文件中 我们有时会看到如下类似的<meta-data ... >元素开始的配置内容: <meta-data andr ...