哈夫曼编码
来源:互联网 发布:东方财富通软件 编辑:程序博客网 时间:2024/06/04 01:16
今天看到一些有关树的知识,又想起了哈夫曼树,但是又忘了具体的,真是让人惆怅。于是翻开《大话数据结构》这本书重温一遍,跟着作者重温哈夫曼树和哈夫曼编码。
哈夫曼树的定义:带权路径长度的 WPL 最小的二叉树称为哈夫曼树。
假设我们现在有 A B C D E ,权值分别为 5,15,40,30,10
什么是带权路径长度?我们先看两张图:
我们先看一下什么叫路径长度:从树的一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。
图一中根节点到结点D的路径长度为 4,二叉树的路径长度为 :
1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 = 20 。
图二中根节点到结点 D 的路径长度为 2 ,二叉树的长度为 :
1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 = 16 。
带权路径长度就是对应的路径长度跟结点上权值的积。
图一根结点 到 结点D 的带权路径值为 5*4 = 20,图二根节点到结点D的带权路径值为 5*2 = 10。
我们现在可以分别计算图一跟图二带权路径的长度,图一:
WPL = 5*1 + 15*2 + 40*3 + 30*4 + 10*4 = 315 。
图二:WPL = 5*3 + 15*3 + 40*2 + 30*2 + 10*2 = 220 。
图二的带权路径长度明显比普通二叉树小。我们要做的就是构造一棵使得WPL最小的二叉树。
接下来就是该如何去构造哈夫曼树:
1.我们把带权值的子节点按权值 递增排序,如上面的例子,可以排序:
A5 , E10 , B15 , D30 , C40 。
2.取头两个权值最小的节点 A 和 E 作为一个新节点 N1 的两个子节点,权值小的位左子节点,大的为由子节点
3. 用 N1 代替 A 和 E 插入序列中,变成 N1,B,D,C
4. 重复步骤2 和 3
最终得到哈夫曼树!
WPL = 5*4 + 10*4 + 15*3 + 30*2 + 40*1= 205
哈夫曼树的主要应用则是哈夫曼编码,主要是为了解决当年的远程通信优化问题,使用哈夫曼编码可以缩减文本文件的大小。
- 信源编码---哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- 哈夫曼编码
- ImageLoad+RollViewPage+Jsoup+WebView带你轻松实现抓取网页数据(附源码)
- Map根据value进行排序
- 快速集成Mob短信验证(附源码)
- Canvas学习笔记(一)
- 一步一步带你完成支付宝支付功能的集成(超详细)
- 哈夫曼编码
- c++ MFC int与CString互转
- [LeetCode]83. Remove Duplicates from Sorted List(删除有序链表的重复元素 )
- Fragment概述
- onResume
- for_each使用方法详解[转]
- 从pcap的DNS流量中分离出隐藏信息
- 问题(已解决):push pop for循环中push变量,变量随之改变的问题
- 分布式锁的几种实现方式~