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 ...
随机推荐
- C语言二级指针(指向指针的指针)
转载:http://c.biancheng.net/cpp/html/85.html 指针可以指向一份普通类型的数据,例如 int.double.char 等,也可以指向一份指针类型的数据,例如 in ...
- 中间件(WAS、WMQ)运维 9个常见难点解析
本文由社区中间件达人wangxuefeng266.ayy216226分享整理,包括WAS.WMQ在安装.巡检.监控.优化过程中的常见难点. 安装 1.was 负载均衡的机制的粘连性,was负载均衡异常 ...
- [翻译] JTNumberScrollAnimatedView
JTNumberScrollAnimatedView 本人视频教程系类 iOS中CALayer的使用 效果: Use JTNumberScrollAnimatedView for have a n ...
- 设计能长按并有动画效果且能触发事件的高级view
设计能长按并有动画效果且能触发事件的高级view 效果图: 源码: LongTapAnimationView.h 与 LongTapAnimationView.m // // LongTapAnima ...
- python的文件对象(1)
1 首先要明确的是,文件只是连续的字节. 数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成. 2 打开文件之门的钥匙--open() open()内建函数成功打开文件后会返回一个 ...
- 沉淀,再出发:python爬虫的再次思考
沉淀,再出发:python爬虫的再次思考 一.前言 之前笔者就写过python爬虫的相关文档,不过当时因为知识所限,理解和掌握的东西都非常的少,并且使用更多的是python2.x的版本的功能,现 ...
- github发布静态页面
github发布静态页面:https://wangc1993.github.io/2019/01/07/2/
- sqlserver-一次updlock和withnolock和with check option 的报错原因分析
接口程序一直运行的很稳定,其中有一天进行了数据库的整改,导致程序不断报错, 报错信息如下 原因: 程序代码写入以下代码 select * from ViewName with(updlock) whe ...
- rsync 服务器配置过程
rsync的原理和相关算法不赘述,资料很多 1.准备两台机器并确保都已经安装rsync a机器:192.168.1.150 ,用作客户端测试 b机器:192.168.1.151用作server端 先介 ...
- js判断鼠标滚轴方向(向上或向下)
var num=1; $(document).on("mousewheel DOMMouseScroll", function (e) { var delta = (e.origi ...