java哈弗曼编码的实现
Java code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
//哈弗曼编码的实现类
public class HffmanCoding {
private int charsAndWeight[][];// [][0]是 字符,[][1]存放的是字符的权值(次数)
private int hfmcoding[][];// 存放哈弗曼树
private int i = 0;// 循环变量
private String hcs[];
public HffmanCoding(int[][] chars) {
// TODO 构造方法
charsAndWeight = new int[chars.length][2];
charsAndWeight = chars;
hfmcoding = new int[2 * chars.length - 1][4];// 为哈弗曼树分配空间
}
// 哈弗曼树的实现
public void coding() {
int n = charsAndWeight.length;
if (n == 0)
return;
int m = 2 * n - 1;
// 初始化哈弗曼树
for (i = 0; i < n; i++) {
hfmcoding[i][0] = charsAndWeight[i][1];// 初始化哈弗曼树的权值
hfmcoding[i][1] = 0;// 初始化哈弗曼树的根节点
hfmcoding[i][2] = 0;// 初始化哈弗曼树的左孩子
hfmcoding[i][3] = 0;// 初始化哈弗曼树的右孩子
}
for (i = n; i < m; i++) {
hfmcoding[i][0] = 0;// 初始化哈弗曼树的权值
hfmcoding[i][1] = 0;// 初始化哈弗曼树的根节点
hfmcoding[i][2] = 0;// 初始化哈弗曼树的左孩子
hfmcoding[i][3] = 0;// 初始化哈弗曼树的右孩子
}
// 构建哈弗曼树
for (i = n; i < m; i++) {
int s1[] = select(i);// 在哈弗曼树中查找双亲为零的 weight最小的节点
hfmcoding[s1[0]][1] = i;// 为哈弗曼树最小值付双亲
hfmcoding[s1[1]][1] = i;
hfmcoding[i][2] = s1[0];// 新节点的左孩子
hfmcoding[i][3] = s1[1];// 新节点的右孩子
hfmcoding[i][0] = hfmcoding[s1[0]][0] + hfmcoding[s1[1]][0];// 新节点的权值是左右孩子的权值之和
}
}
// 查找双亲为零的 weight最小的节点
private int[] select(int w) {
// TODO Auto-generated method stub
int s[] = { -1, -1 }, j = 0;// s1 最小权值且双亲为零的节点的序号 , i 是循环变量
int min1 = 32767, min2 = 32767;
for (j = 0; j < w; j++) {
if (hfmcoding[j][1] == 0) {// 只在尚未构造二叉树的结点中查找(双亲为零的节点)
if (hfmcoding[j][0] < min1) {
min2 = min1;
s[1] = s[0];
min1 = hfmcoding[j][0];
s[0] = j;
} else if (hfmcoding[j][0] < min2) {
min2 = hfmcoding[j][0];
s[1] = j;
}
}
}
return s;
}
public String[] CreateHCode() {// 根据哈夫曼树求哈夫曼编码
int n = charsAndWeight.length;
int i, f, c;
String hcodeString = "";
hcs = new String[n];
for (i = 0; i < n; i++) {// 根据哈夫曼树求哈夫曼编码
c = i;
hcodeString = "";
f = hfmcoding[i][1]; // f 哈弗曼树的根节点
while (f != 0) {// 循序直到树根结点
if (hfmcoding[f][2] == c) {// 处理左孩子结点
hcodeString += "0";
} else {
hcodeString += "1";
}
c = f;
f = hfmcoding[f][1];
}
hcs[i] = new String(new StringBuffer(hcodeString).reverse());
}
return hcs;
}
public String show(String s) {// 对字符串显示编码
String textString = "";
char c[];
int k = -1;
c = new char[s.length()];
c = s.toCharArray();// 将字符串转化为字符数组
for (int i = 0; i < c.length; i++) {
k = c[i];
for (int j = 0; j < charsAndWeight.length; j++)
if (k == charsAndWeight[j][0])
textString += hcs[j];
}
return textString;
}
// 哈弗曼编码反编译
public String reCoding(String s) {
String text = "";// 存放反编译后的字符
int k = 0, m = hfmcoding.length - 1;// 从根节点开始查询
char c[];
c = new char[s.length()];
c = s.toCharArray();
k = m;
for (int i = 0; i < c.length; i++) {
if (c[i] == '0') {
k = hfmcoding[k][2];// k的值为根节点左孩子的序号
if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判断是不是叶子节点,条件(左右孩子都为零)
{
text += (char) charsAndWeight[k][0];
k = m;
}
}
if (c[i] == '1') {
k = hfmcoding[k][3];// k的值为根节点右孩子的序号
if (hfmcoding[k][2] == 0 && hfmcoding[k][3] == 0)// 判断是不是叶子节点,条件(左右孩子都为零)
{
text += (char) charsAndWeight[k][0];
k = m;
}
}
}
return text;
}
}
分享到:
相关推荐
在Java编程世界中,"java源代码实例系列之三供参考"是一个旨在引导初学者深入理解Java编程概念的教程。这个实例系列通过实际的代码示例来解释Java的基础知识,帮助开发者逐步掌握这门强大的面向对象语言。在这个章节...
java编程实例源代码,对初学者非常有帮助。里面有100个实例。
"java简单实例程序源代码"这个压缩包包含了一系列章节相关的Java实例源代码,适合初学者和有经验的开发者用来加深对Java语言的理解。以下是这些章节可能涉及的重要知识点的详细解释: 1. **CH11**: 这个章节可能...
100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码100个Java经典编程实例源代码
通过学习这些Java源代码实例,初学者可以逐步理解并掌握Java编程语言的核心特性。这些实例不仅提供了理论知识的实践平台,还有助于培养良好的编程习惯和问题解决能力。同时,这些实例也可以作为自我检查和提升的工具...
本资源"JAVA图形界面实例源代码"提供了丰富的GUI实现示例,旨在帮助初学者和进阶开发者更好地理解和应用Java GUI技术。 首先,我们需要了解Java中的Swing和JavaFX两个主要的GUI库。Swing是Java AWT(Abstract ...
【描述】提到的"国内Java培训郝斌视频的一些源代码,上课PPT"意味着这个压缩包中包含两部分主要资料:一是郝斌在视频课程中讲解的Java源代码实例,二是他的授课幻灯片。源代码是学习编程的重要组成部分,因为它直观...
Java游戏中斜视角编辑器及引擎源代码.rar Java游戏使命的召唤源码.rar Java游戏沙丘城堡源代码.rar Java源码的仿QQ聊天程序.rar Java用GZIP压缩解压文件.rar Java用Zip压缩多个文件实例源码.rar Java用的在线地图...
【标题】"JAVA源代码100实例"涵盖了Java编程语言中的各种常见应用场景和技术点,旨在帮助初学者和进阶者通过实际操作来理解和掌握Java编程。这些实例旨在解决实际问题,提供了一手的编程经验,是提升Java编程技能的...
这个压缩包文件包含了多种Java源代码实例,是初学者探索和学习Java编程的理想资源。以下将详细解析这些源代码可能涉及的知识点,以帮助你更好地理解和应用Java。 1. **基础语法**:所有编程语言都有其基本的语法...
这些源代码实例涵盖了Java的基础概念到进阶特性,是学习和理解Java语法、编程技巧以及解决问题的有效工具。 首先,Java源代码的学习应从基础语法开始。这可能包括变量声明、数据类型(如基本类型和引用类型)、控制...
这些源代码实例可能会包含更多关于如何使用继承和多态性的示例,比如抽象类、final关键字、访问修饰符的应用以及如何在实际项目中利用这些特性提高代码结构的清晰度和可维护性。学习并理解这些示例,对于深入理解和...
在Java编程领域,一个"java工程源代码实例"通常指的是包含了一系列类、接口、方法和其他相关资源的项目,这些组合起来构成了一个可运行的程序。Java工程是开发人员用来组织和管理代码的方式,使得代码更加模块化,...
Java坦克大战网络对战版源代码.rar Java声音播放程序源代码.rar JAVA实现CLDC与MIDP底层编程的代码.rar Java实现HTTP连接与浏览,Java源码下载.rar Java实现的FTP连接与数据浏览程序.rar Java实现的放大镜效果附有...
首先,你需要读取Java源代码文件,然后使用`ASTParser`类来创建一个解析器实例。解析器可以设置不同的解析选项,如源代码版本、绑定级别等。以下是一个基本示例: ```java ASTParser parser = ASTParser.newParser...
通过这些Java源代码实例,开发者可以: 1. 学习基本语法:包括变量、数据类型、运算符、流程控制语句等。 2. 掌握面向对象编程:类、对象、继承、多态、接口等。 3. 熟悉集合框架:List、Set、Map的使用和实现原理...
6. **多线程**:Java提供强大的多线程支持,源代码可能包含Thread类、Runnable接口以及同步机制(如synchronized关键字、wait()、notify()方法)的实例,让读者了解如何在并发环境下编写程序。 7. **网络编程**:...
### 加密Java源代码 #### 知识点概述: 在提供的描述中,主要涉及的是Java源代码加密的相关技术,特别是利用DES(数据加密标准)算法进行加密的过程。本篇文章将详细解析Java源代码加密的基本原理、DES算法的工作...
这个文件可能包含了一系列章节,每个章节都有相应的源代码实例,供读者下载、编译和运行,以加深对课程内容的理解。 总的来说,这份"JAVA学习源代码"资源是一个完整的Java学习套餐,不仅提供了理论知识,还提供了...
《中小型Java游戏实例:探索国外Java源代码》 在编程世界中,Java作为一种跨平台、面向对象的语言,因其强大的性能和灵活性,常被用于开发各种类型的应用程序,其中包括游戏。本资源“中小型Java游戏实例 国外Java...