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. netflix conductor 2.x 版本新功能简单说明

    netflix conductor 2.x 已经发布很长时间了,同时官方也发布了关于2.x 新特性的说明,当前github 行的release 版本为2.14.4 新特性 grpc 框架支持 一个可选 ...

  2. on bind live delegate的区别

    bind()----直接绑定在元素上 live()----通过冒泡的方式绑定到元素上,更适合于列表类型的绑定,和bind()相比,支持动态数据 delegate()----精确的小范围的适用事件代理, ...

  3. 小数据池 is和== 再谈编码

    昨日回顾 上节课内容回顾 1. 字典 {key:value, key:value.....} 成对的保存数据 字典没有索引. 不能切片, 字典的key必须是可哈希的.不可变的 1. 增加: dic[新 ...

  4. [linux][c/c++]代码片段02

    gcc `pkg-config --cflags gtk+-3.0` -o example-1 example-1.c `pkg-config --libs gtk+-3.0` #include &l ...

  5. ex1

    #include <stdio.h> int main() { int x; printf("输入一个整数: \n"); scanf("%d",&a ...

  6. oracle 使用length()函数需要注意的坑!

      1.情景展示 筛选出指定字段字符长度既不等于18也不等于15的数据. 2.原因分析 第一步:按字符串度进行分组统计: 第二步:筛选数据. 你会发现,只将length=17统计了出来,长度不存在的数 ...

  7. vue----子组件引用vux popup mask遮罩在最上层解决办法 z-index问题

    在一个页面的子组件中引用vux的popup组件时,出现mask遮罩在最上层的问题,百度了一下发现有两种解决办法,现提供第三种. popup在子组件引用时,vux将vux-popup-mask默认添加到 ...

  8. 获取url后的参数、获取a标签的参数

    function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  9. Http协议以及Httpclient

    一.HTTP之请求消息Request 客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request line).请求头部(header).空行和请求数据四个部分组成. Http请 ...

  10. ImportError: DLL load failed while importing win32api: 找不到指定的模块。

    这个是用pip install pywin32安装报的一个错误 据说直接使用pip install pypiwin32安装就不会有报错 但是遇到错误还是要尝试解决一下的 pip install pyw ...