赫夫曼树、赫夫曼编码
基本介绍
给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为赫夫曼树(HuffmanTree)。
赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
重要概念
- 路径和路径长度:
在一棵树中,从一个结点往下可以达到的孩子节点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1 - 结点的权及带权路径长度:
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积 - 树的带权路径长度:
树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL(weighted path length),权值越大的结点离根结点越近的二叉树才是最优二叉树。 - WPL最小的就是赫夫曼树
赫夫曼树创建
例如:一个数组 arr={13,7,8,3,29,6,1};
排序后
arr={1,3,6,7,8,13,29};
代码实现:
package HuffmanTree;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** 创建赫夫曼树* @author 86178**/
public class HuffmanTreeDemo {public static void main(String[] args) {int[] arr= {7,6,8,29,13,1,3};Node root=createTree(arr);pre(root);}//创建赫夫曼树public static Node createTree(int[] arr) {List<Node> list=new ArrayList<>();for(int v:arr) {list.add(new Node(v));}//list最终只剩root根结点while (list.size()>1) {Collections.sort(list);//排序Node left=list.get(0); //取出最小结点Node right=list.get(1); //取出次小结点Node parent=new Node(left.value+right.value);//新建父结点parent.left=left;//建立左节点关系parent.right=right;//建立右节点关系list.remove(left);//删除list.remove(right);//删除list.add(parent);//将父结点添加进list}return list.get(0);//返回root}//先序遍历打印结点信息public static void pre(Node head) {System.out.println(head);if (head.left!=null) {pre(head.left);}if (head.right!=null) {pre(head.right);}}
}
//实现Comparable接口,便于排序
class Node implements Comparable<Node> {int value;Node left;Node right;public Node(int v) {this.value=v;}public String toString() {return "[Node="+this.value+"]";}@Overridepublic int compareTo(Node o) {return this.value-o.value;}}
赫夫曼编码
- 赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,属于一种程序算法。
- 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。
- 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间。
- 赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出种编码方法,称之为最佳编码。
定长编码
- 例如: 一个字符串,s=“i like java”;共有11个字符,包括空格
- 对应ASCII码值为 105 32 108 105 107 101 32 106 97 118 97
- 进一步转换为二进制为 01101001 00100000 01101110 01101001 01101011 01100101
00100000 01101010 01100001 01110110 01100001 - 最终按照二进制传递信息,总长度为98,包括空格。
变长编码
- 例如: 一个字符串,s=“i like like like java do you like a java”;共有40个字符,包括空格
- 统计各个字符出现的个数 d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9
- 对应编码: 0=,1=a,10=i, 11=e,100=k,101=l,110=o,111=v,1000=j, 1001=u,1010=y, 1011=d
- 说明:按照各个字符出现的次数进行编码,原则是出现次数越多的,则编码越小,比如 空格出现了9次,编码为0,其它依次类推.
- 按照上面给各个字符规定的编码,则我们在传输“i like like like java do you like a
java"数据时,编码就是10010110100… - 字符的编码都不能是其他字符编码的前缀,符合此要求的编码叫做前缀编码,即不能匹配到重复的编码。
赫夫曼编码
- 例如: 一个字符串,s=“i like like like java do you like a java”;共有40个字符,包括空格
- 统计各个字符出现的个数 d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9
- 构建赫夫曼树
- 根据赫夫曼树,给各个字符规定编码,向左的路径为0,向右的路径为1。
- 编码如下: o: 1000 u: 10010 d:100110 y: 100111 i: 101a : 110k: 1110e: 1111j: 0000v: 0001l: 001 : 01
- 按照上面的赫夫曼编码,我们的"i like like like javado you like a java"字符串对应的编码为(注意这里我们使用的无损压缩)
1010100110111101111010011011110111101001101111011110100001100001110011001111000011001111000100100100110111101111011100100001100001110
长度为:133 - 说明:原来长度是359,压缩了(359-133)/ 359= 62.9%2)此编码满足前缀编码,即字符的编码都不能是其 他字符编码的前缀。不会造成匹配的多义性。
注意,这个赫夫曼树根据排序方法不同(有多个相等的值),也可能不太一样,这样对应的赫夫曼编码也不完全一样,但是wpl是一样的,都是最小的。
赫夫曼树、赫夫曼编码相关推荐
- 赫夫曼树赫夫曼编码的创建
目录 基础知识点 最优二叉树 如何构造赫夫曼树 赫夫曼编码 编码与压缩文件 代码 结构体设计 创建赫夫曼树 创建构建赫夫曼编码 基础知识点 赫夫曼树又称为最优树,是一种带权路径长短最短的树,有着广泛的 ...
- 数据结构与算法(赫夫曼树,赫夫曼编码)
赫夫曼树 基本介绍: (1)给定n个权值作为n给叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树(HuffmanTree),还有的树翻译为霍夫 ...
- 赫夫曼树+赫夫曼编码小结
赫夫曼树 赫夫曼树定义与原理 从树中一个节点到另一个节点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度. 图6-12-4的二叉树a中,根结点到结点D的路径长度就为4,二叉树b中根结点到 ...
- 树:赫夫曼树赫夫曼编码
1,赫夫曼树 1.1,赫夫曼树基本介绍及相关概念 给定n个权值作为n个叶子节点,构造一颗二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的的二叉树为最优二叉树,也称为赫夫曼树,或者哈夫曼 ...
- 【数据结构】赫夫曼树与赫夫曼编码(可执行完整代码)
赫夫曼编码对文件进行压缩与解密 理论 赫夫曼树 赫夫曼编码 应用 应用源码 运行结果截图 理论 赫夫曼树 先有赫夫曼树,才有赫夫曼编码.所以,首先简单介绍一下什么是赫夫曼树. 假设一共五个叶子节点,分 ...
- 赫夫曼编码(基于赫夫曼树的实现)
上一篇文章中我们探讨了赫夫曼树的基本原理和构造方式,而赫夫曼编码可以很有效地压缩数据(通常可以节约20%-90%的空间,具体压缩率依赖于数据的特性). 名词:定长编码,边长编码,前缀码(装B用的) 定 ...
- 2020-10-1 //严蔚敏《数据结构》 //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码
//严蔚敏<数据结构> //赫夫曼树及其应用:创建顺序赫夫曼树创建及得到赫夫曼编码 //(从叶子结点到根逆向求每个字符的赫夫曼编码)以及(无栈非递归遍历赫夫曼树,求赫夫曼编码) //自学中 ...
- 赫夫曼树以及赫夫曼编码实现
介绍 赫夫曼树创建图解思路 一直找就找到最好的样子: 赫夫曼树创建代码实现 package 树;import java.util.ArrayList; import java.util.Collect ...
- 赫夫曼树介绍、赫夫曼树的性质、赫夫曼编码、赫夫曼树与赫夫曼编码的应用
文章目录 赫夫曼树 1. 赫夫曼树介绍: 2. 赫夫曼树的创建过程: 3. 赫夫曼树的性质: 4. 赫夫曼编码: 5. 赫夫曼树与赫夫曼编码的c语言代码实现: 赫夫曼树 1. 赫夫曼树介绍: 赫夫 ...
最新文章
- eclipse下的spring环境配置
- 6 不更新无法使用_win10更新后无线网络无法使用
- 华为 鸿蒙 操作系统关键特性解读
- postfix导致maillog填满磁盘空间的巨坑!
- 交换两个数字的三种方式
- ajax分批mysql_使用select2分批异步加载大量数据
- Go语言面向对象编程
- sentinel 打包_SpringCloud Alibaba整合Sentinel
- 《R数据可视化手册》——3.8 绘制百分比堆积条形图
- sql 语句循环方法的使用
- ucore Lab1 系统软件启动过程
- 代表JAVA线程优先级的常量是_Java 线程优先级
- 浏览器播放视频时蓝牙耳机自动关机
- 实验吧web天网管理系统
- WPS参考文献自动生成方法
- cl.3hh.win/index.php,windows 系统下 安装 gitblit 教程
- MAC无法重装anaconda3
- 在编译前与后调教C语言binary的一种方法
- 不定式作各种成份和现在分词作各种成份
- CentOS 7 更改 任务栏 高度
热门文章
- acwing349 黑暗城堡 ——最短路径生成树
- linux中的wget命令
- 【实践】haskell、coq基本语法
- Diabetes 糖尿病及其并发症.|2021/1/25(未完待续)
- 网络舆情系统的四大要素-张华平博士
- 中山大学新华学院计算机,中山大学新华学院信息科学学院电子信息科学与技术、计算机科学与技术、软件...
- 1.主流的流媒体服务器FMS/wowza/red5/SRS产品对比
- 好用并强大的图片插件:PhotoSwipe.js
- 单继承与多继承的虚函数表
- visual svn for visual studio 2019