Java---Huffman树的实现
什么是哈弗曼树
1.哈弗曼树是最优二叉树,树的带权路径长度最小的一个二叉树。
2.带权路径长度为根节点到该节点的路径长度和该节点权重的乘积。
3.路径长度为当前节点到另一个节点所经过的分支的个数(边的个数)。
应用场景
哈弗曼树可以用来求哈弗曼编码,通过对文件中不同数据出现的频率,
设计出新的编码方式,来对文件进行数据压缩。
建立哈弗曼树
1.将表示不同数据的节点按照出现的频率(权重)进行排序。
2.选取出两个最小频率(权重)的数据,创建新节点,作为新节点的两个子节点。
3.将两个子节点从原有的节点集删除,计算新节点的权重,并将其加入到节点集合中。
4.对新的节点集进行排序,重复2和3步骤,直到节点集中只有一个节点。
代码实现
package com.newer.tree; /**
* 哈弗曼树中每个节点的信息
*
* @author lixiaochi
*
*/
public class HuffmaNode {
// 当前节点的数据
String name;
// 当前节点的权重
int value;
// 当前节点所对应的哈弗曼编码
String encode; // 当前节点的左右子节点
HuffmaNode leftChild;
HuffmaNode rightChild; // Hafuman节点的构造方法
public HuffmaNode(String name, int value) {
super();
this.name = name;
this.value = value;
} public HuffmaNode(String name, int value, HuffmaNode leftChild, HuffmaNode rightChild) {
super();
this.name = name;
this.value = value;
this.leftChild = leftChild;
this.rightChild = rightChild;
} @Override
public String toString() {
return "HuffmaNode [name=" + name + ", value=" + value + ", encode=" + encode + "]";
} }
package com.newer.tree;
/**
* 我的哈弗曼树
* 什么是哈弗曼树:哈弗曼树是最优二叉树,树的带权路径长度最小的一个二叉树。
* 带权路径长度为根节点到该节点的路径长度和该节点权重的乘积。
* 路径长度为当前节点到另一个节点所经过的分支的个数(边的个数)。
*
* 应用场景:哈弗曼树可以用来求哈弗曼编码,通过对文件中不同数据出现的频率,
* 设计出新的编码方式,来对文件进行数据压缩。
* 建立哈弗曼树:
* 1.将表示不同数据的节点按照出现的频率(权重)进行排序。
* 2.选取出两个最小频率(权重)的数据,创建新节点,作为新节点的两个子节点。
* 3.将两个子节点从原有的节点集删除,计算新节点的权重,并将其加入到节点集合中。
* 4.对新的节点集进行排序,重复2和3步骤,直到节点集中只有一个节点。
*
* @author lixiaochi
*
*/
public class MyHuffmanTree {
// 哈弗曼树的根节点
HuffmaNode root; public static void main(String[] args) {
MyHuffmanTree huffmantree = new MyHuffmanTree();
// 数组中的元素是一个节点,节点中有数据内容和出现的频率。
HuffmaNode[] nodeArray = new HuffmaNode[6];
// 哈弗曼树中各个节点的初始化。
nodeArray[0]=new HuffmaNode("A",27);
nodeArray[1]=new HuffmaNode("B",8);
nodeArray[2]=new HuffmaNode("C",15);
nodeArray[3]=new HuffmaNode("D",15);
nodeArray[4]=new HuffmaNode("E",30);
nodeArray[5]=new HuffmaNode("F",5); // 创建一颗哈弗曼树
huffmantree.root = huffmantree.create(nodeArray); // 对哈弗曼树进行编码,其实可以在生成哈弗曼树的时候,一起生成哈弗曼编码。
encode(huffmantree.root); // 按先序的方式输出哈弗曼树的每个节点的信息。
print(huffmantree.root); } public static HuffmaNode create(HuffmaNode[] nodeArray) { // 表示当前要排序的起始位置
int num = 0; // 不断循环,一直到节点集只有一个节点。
while(num<nodeArray.length-1) {
// 对当前节点集进行排序,使用了最简单的选择排序。
// 可以使用高效的排序方法,快排,归排都可以。
for(int i=num;i<nodeArray.length;i++) {
int min=i;
for(int j=i+1;j<nodeArray.length;j++) {
if(nodeArray[j].value<nodeArray[min].value) {
min=j;
}
}
swap(nodeArray,i,min);
} // 创建新节点,记录新节点的权重
int newNodeValue = nodeArray[num].value+nodeArray[num+1].value;
HuffmaNode newNode = new HuffmaNode("分支节点",newNodeValue,nodeArray[num],nodeArray[num+1]);
// 将节点加入到节点集中,这里的num表示的起始位置,已经实现了在节点集数组中删除两个节点。
nodeArray[++num] = newNode;
}
return nodeArray[num];
} private static void swap(HuffmaNode[] nodeArray, int i, int min) {
HuffmaNode temp = nodeArray[i];
nodeArray[i] = nodeArray[min];
nodeArray[min] = temp;
} public static void encode(HuffmaNode node) {
encode(node,"0","1","");
} // 对哈弗曼树中叶子节点进行编码。
public static void encode(HuffmaNode node,String a,String b,String c) {
if(node.leftChild != null) {
String temp = c+"0";
encode(node.leftChild,"0","1",temp);
}
if(node.rightChild != null) {
String temp = c+"1";
encode(node.rightChild,"0","1",temp);
}
if(node.leftChild==null && node.rightChild==null) {
node.encode=c;
} } // 按先序的方式输出哈弗曼树的每个节点的信息。
public static void print(HuffmaNode node) {
if(node != null) {
System.out.println(node);
print(node.leftChild);
print(node.rightChild);
}
} }
显示结果
Java---Huffman树的实现的更多相关文章
- Java蓝桥杯练习题——Huffman树
Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...
- [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Huffman树与编码的简单实现
好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的.注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了. package other; import ...
- 数据结构(二十七)Huffman树和Huffman编码
Huffman树是一种在编码技术方面得到广泛应用的二叉树,它也是一种最优二叉树. 一.霍夫曼树的基本概念 1.结点的路径和结点的路径长度:结点间的路径是指从一个结点到另一个结点所经历的结点和分支序列. ...
- Huffman树与Huffman编码
1.Huffman树 今天复习Huffman树.依稀记得自己被Huffman树虐的经历.还记得是7月份,我刚开始看数据结构与算法,根本看不懂Huffman树的操作.后来我终于悟出了Huffman树是怎 ...
- Huffman树、霍夫曼编码
Huffman树指的是带权路径长度WPL最小的二叉树 WPL=路径*权值 Huffman常用于压缩编码,正常传输ABCDEF这些字母需要3位二进制树来描述,但由于一篇文章中ABCDEF这些字母出现的概 ...
- 构造数列Huffman树总耗费_蓝桥杯
快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
- 【数据结构】Huffman树
参照书上写的Huffman树的代码 结构用的是线性存储的结构 不是二叉链表 里面要用到查找最小和第二小 理论上锦标赛法比较好 但是实现好麻烦啊 考虑到数据量不是很大 就直接用比较笨的先找最小 去掉最小 ...
- Huffman树的编码译码
上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...
随机推荐
- Java快速入门-01-基础篇
Java快速入门-01-基础篇 如果基础不好或者想学的很细,请参看:菜鸟教程-JAVA 本笔记适合快速学习,文章后面也会包含一些常见面试问题,记住快捷键操作,一些内容我就不转载了,直接附上链接,嘻嘻 ...
- Spring面试 IOC和AOP的理解
spring 的优点?1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实 ...
- No enum constant org.apache.ibatis.type.JdbcType.Integer
同事今天在用mybatis查询时候,报了上面这个问题.上网查了下,原来是mybatis封装类型的问题.原因是在resultMap中jdbcType写为了Integer,但是在MyBatis中没有这个数 ...
- d3js data joins深入理解
Data joins 给定一个数据数组和一个 D3 selection 我们就可以attach或者说是'join'数组中的每个数据到selection中的每个元素上. 这将使得我们的数据和可视化元素 ...
- 倒计时特效的CountAnimationLabel
倒计时特效的CountAnimationLabel 效果: 源码: CountAnimationLabel.h 与 CountAnimationLabel.m // // CountAnimation ...
- webpack笔记一 起步
webpack笔记一 起步 安装 对于大多数项目,我们建议本地安装(--save-dev).这可以在引入突破式变更(breaking change)版本时,更容易分别升级项目. 起步 初始化项目 mk ...
- switch结构可以更好的解决等值判断问题
switch 选择结构的语法:switch (表达式){case 常量 1://代码块1:break;case 常量 2://代码块2:break;......default://代码块n:break ...
- 宝塔面板 + Rancher + 阿里云镜像仓库 + Docker + Kubernetes,添加集群、部署 web 应用
目录 一,安装宝塔面板(V 6.8) 二,使用宝塔安装 Docker,配置阿里云容器服务 三,安装 Rancher (Server) 四,管理 Rancher.添加集群 五,添加 Rancher 应用 ...
- 给腾讯云Linux主机创建Swap文件
新买的腾讯云主机没有提供Swap分区 理由是由于主机经常因为内存使用率过高,频繁使用Swap,导致磁盘IO过高,服务器整体性能反而下降. 不过用户依然可以使用Swap文件的方式添加Swap. 方法如下 ...
- 深入浅出SharePoint——定制保存Item按钮
<script type="text/javascript" src="/_layouts/style/jquery-1.4.4.min.js">& ...