Android版数据结构与算法(七):赫夫曼树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载。
近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出来。
言归正传,开启本篇的正文。
一、什么是赫夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
以上来自百度百科,相信完全不了解的同学看完肯定一头雾水,啥玩意,这么多术语,权值?树的带权路径长度?都是什么鬼?别急,下面一一解释。
二、赫夫曼树中术语解释
路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径。
结点路径长度:一个结点到另一个结点之间路径上分枝数目称作路径长度。
比如上图中根结点到A结点路径长度为3
树的路径长度:从树根结点到每一结点的路径长度之和称作树的路径长度之和。这里是每一结点,而不仅仅是叶子结点。
比如上图树的路径长度为:1+1+2+2+2+2+3+3 = 16
结点权值:将树中的结点赋予一个有意义的数,称为该结点的权值。
结点的带权路径长度:从该结点到树根之间的路径长度与该结点权值的乘机叫做结点的带权路径长度。
比如上图中A结点带权路径长度为:3 * 5 = 15
树的带权路径长度:树中所有叶子结点的带权路径长度之和叫作树的带权路径长度。
上图树的带权路径长度为:3*5+15*3+40*2+30*2+10*2=220
树的带权路径长度可计作WPL,赫夫曼树就是WPL最小的的二叉树。
三、赫夫曼树的创建
了解了基本的概念之后我们继续看下赫夫曼树到底怎么创建呢?以下就直接说创建流程了。
比如我们有以下几个结点信息:A5(A代表结点名字,5代表其权值),B15,C40,D30,E10。
构造赫夫曼树流程如下:
(1)先把有权值的叶子结点从小到大排序成一个有序序列:A5,E10,B15,D30,C40。
(2)取头两个最小权值的结点作为新结点M1的两个子结点,其中权值小的结点在左侧,权值大的在右侧。即A5为M1的左孩子,E10为M1的右孩子,M1结点权值为两个子结点权值的和15,即M15,如图:
(3)新结点M15替换A5与E10结点,插入有序序列中,依然保持从小到大排序:M15,B15,D30,C40。
(4)重复步骤(2),将M15与B15作为新结点P的左右孩子,P的权值为30,如图:
(5) P30替换M15,B15插入有序序列中依然保持从小到大顺序:P30,D30,C40。
(6)重复步骤(2),将P30,D30作为新结点T的左右孩子,T结点权值为60,如图:
(7)T60替换P30,D30插入有序序列,依然保持从小到达排序:C40,T60。
(8)重复步骤(2),C40,T60作为新结点N的左右孩子,N权值为100,N即为根结点,完成赫夫曼树的构建,如图:
到此,赫夫曼树就已经构建完成,其WPL为:WPL=40*1+30*2+15*3+5*4+10*4=205
整个构建过程核心思想就是让权值小的结点距离根结点远,权值大的距离根结点近一些。
四、赫夫曼编码
赫夫曼老爷子研究最优树可不是仅仅为了构建就完事了,肯定有其用处的,赫夫曼树就是为了解决当年远距离通信的数据最优化问题。
比如我们有一段文字"EDEFABAC..."要进行网络传输,一般我们都会选择二进制方式传输,这段文字只包含6个字母:ABCDEF,那么用二进制表示每个字母需要用3位表示,如图:
字母 | A | B | C | D | E | F |
二进制表示 | 000 | 001 | 010 | 011 | 100 | 101 |
这段文字中各字母出现频率分别为A 20, B 10, C 15, D 15, E 25, F 15,正好100%。
这样就可以按照赫夫曼树思想来重新规划各个字母的编码,频率即是各个字母的权重,构建赫夫曼树, 并且将左孩子权重改为0,右孩子改为1,得到下图:
然后我们对各个字母重新编码,编码规则为:从根结点到叶子结点经过路径的0和1来编码,重新编码后如下:
字母 | A | B | C | D | E | F |
二进制表示 | 10 | 11110 | 11111 | 1110 | 0 | 110 |
将"EDEFABAC"这段文字进行编码的前后比较:
原编码:100011100101000001000010 (24个字符)
新编码:01110011010111101011111 (23个字符)
编码后数据被压缩了,这里大家可以觉得才减少一个字符啊,实际情况不可能只有这几个字符的,一个文本会包含很多的字符,这样就可以被压缩很多空间,更利于数据的传输。
五、总结
以上介绍了赫夫曼树以及其使用场景之一(数据的压缩),赫夫曼树原理还有很多其余用处,学习赫夫曼树更多的是要体会其思想,好了,本篇到此为止,下一篇二叉排序树的介绍以及java代码的实现。
声明:文章将会陆续搬迁到个人公众号,以后文章也会第一时间发布到个人公众号,及时获取文章内容请关注公众号
Android版数据结构与算法(七):赫夫曼树的更多相关文章
- 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压
最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- Android版数据结构与算法(六):树与二叉树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 之前的篇章主要讲解了数据结构中的线性结构,所谓线性结构就是数据与数据之间是一对一的关系,接下来我们就要进入非线性结构的世界了,主要是树与图,好了接 ...
- 【数据结构】赫夫曼树的实现和模拟压缩(C++)
赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- C#数据结构-赫夫曼树
什么是赫夫曼树? 赫夫曼树(Huffman Tree)是指给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小.哈夫曼树(也称为最优二叉树)是带权路径长度最短的树,权值较大的结点 ...
- 赫夫曼树JAVA实现及分析
一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点. 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低 ...
- puk1521 赫夫曼树编码
Description An entropy encoder is a data encoding method that achieves lossless data compression by ...
随机推荐
- Nginx 的安装与配置
一.下载 Linux:CentOS 7.3 64位 Nginx:nginx-1.13.1 安装目录:/usr/local/ wget http://nginx.org/download/nginx-1 ...
- sniffer 简介
http://www.doc88.com/p-095375416629.html 介绍sniffer的工作原理及简单介绍.
- thinkphp实现数据分页
方法一: public function show_cate(){ $category_name = array( '1' => '政法综治前沿', '2' => '政策法规', '3' ...
- vsts + XX云服务器构建netcore+docker持续集成交付部署
持续集成交付部署是什么意思,它给我们带来什么好处? 先贴一张图 持续集成(Continuous Integration) 持续集成强调开发人员提交了新代码之后,立刻进行构建.(单元)测试(这个要看情况 ...
- js动态计算移动端rem适配问题
第一:css3的media query来实现适配,例如下面这样: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 2 ...
- UUID那些事
UUID那些事 UUID 是一个全局唯一的通用识别码.它使用某种规则,而不是某种中心化的自增方式,来保证这个识别码的全局唯一性.UUID 有非常多的使用场景,比如在分布式系统中,需要生成全局唯一 ID ...
- keystonejs开发中解决bug--版本要对应
今天要调试bug,先说明一下背景!有需求要修改keystonejs的后台管理页面,然后是看官方文档知道后台管理也是react+redux.然后为了加强后台管理页的功能(如汉化),然后将keystone ...
- 3GPP 测试 /etc/udev/ruse.d/50文件 /lib/udev/ruse.d/55* 网络配置
3GPP是个标准化协议组织,其工作目标是制定协议实现由2G网络到3G网络的平滑过渡,保证未来技术的后向兼容性,支持轻松建网及系统间的漫游和兼容性. 3GPP协议的制订主要是以GSM核心网为基础. 测试 ...
- tkinter属性(总结)
一.主要控件 1.Button 按钮.类似标签,但提供额外的功能,例如鼠标掠过.按下.释放以及键盘操作事件 2.Canvas 画布.提供绘图功能(直线.椭圆.多边形.矩形) 可以包含图形或位图 3.C ...
- switch窗口句柄
Set<String> windows = browser.getWebDriver().getWindowHandles(); //获得所有窗口句柄 for (String string ...