- 浏览: 305819 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (165)
- hadoop (47)
- linux (11)
- nutch (7)
- hbase (7)
- solr (4)
- zookeeper (4)
- J2EE (1)
- jquery (3)
- java (17)
- mysql (14)
- perl (2)
- compass (4)
- suse (2)
- memcache (1)
- as (1)
- roller (1)
- web (7)
- MongoDB (8)
- struts2 (3)
- lucene (2)
- 算法 (4)
- 中文分词 (3)
- hive (17)
- noIT (1)
- 中间件 (2)
- maven (2)
- sd (0)
- php (2)
- asdf (0)
- kerberos 安装 (1)
- git (1)
- osgi (1)
- impala (1)
- book (1)
- python 安装 科学计算包 (1)
最新评论
-
dandongsoft:
你写的不好用啊
solr 同义词搜索 -
黎明lm:
meifangzi 写道楼主真厉害 都分析源码了 用了很久. ...
hadoop 源码分析(二) jobClient 通过RPC 代理提交作业到JobTracker -
meifangzi:
楼主真厉害 都分析源码了
hadoop 源码分析(二) jobClient 通过RPC 代理提交作业到JobTracker -
zhdkn:
顶一个,最近也在学习设计模式,发现一个问题,如果老是看别人的博 ...
Java观察者模式(Observer)详解及应用 -
lvwenwen:
木南飘香 写道
高并发网站的架构
Java 哈夫曼编码反编码的实现:
//哈弗曼编码的实现类
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;
}
}
调用的时候直接调用该类就行了
eg :
int chars[][] ;
String s =“101010110”;
HffmanCoding hfc = new HffmanCoding(chars);
hfc.coding();//哈弗曼树
String s[] = hfc.CreateHCode();//哈弗曼编码
s=hfc.show(s);
//哈弗曼编码的实现类
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;
}
}
调用的时候直接调用该类就行了
eg :
int chars[][] ;
String s =“101010110”;
HffmanCoding hfc = new HffmanCoding(chars);
hfc.coding();//哈弗曼树
String s[] = hfc.CreateHCode();//哈弗曼编码
s=hfc.show(s);
发表评论
-
博客地址变更
2013-08-16 10:29 1218all the guys of visiting the bl ... -
java 中object 方法
2012-11-02 07:39 1588Java中Object的方法 构造方法摘要 Object() ... -
java 容易引起内存泄漏的几大原因
2012-02-14 16:01 1776容易引起内存泄漏的几 ... -
jvm 调优2
2012-02-09 17:37 55B-树 是一种多路搜索树(并不是二叉的): 1 ... -
java 反射机制
2012-02-09 11:24 1085JAVA反射机制的学习 JAVA语言中的反射机制: ... -
java nio 编程
2012-02-06 14:13 1092转自:http://yangguangfu.iteye.com ... -
JVM学习笔记-方法区示例与常量池解析
2012-01-30 09:36 1471JVM学习笔记-方法区示例与常量池解析(Method Area ... -
JVM调优 (2)
2012-01-13 14:00 869JVM调优 1. Heap设定与垃圾回收 J ... -
jvm 启动参数
2012-01-13 13:58 972转载自:http://www.blogjava ... -
Java虚拟机(JVM)参数简介
2012-01-13 13:14 1290Java虚拟机(JVM)参数简介 在Java、J2EE大型 ... -
离线并发与锁机制
2011-12-15 15:47 908离线并发与锁机制 离线并发的来源 在W ... -
Java观察者模式(Observer)详解及应用
2011-12-14 11:19 4840Java观察者模式(Observer)详解及应用 由于网站 ... -
解决zookeeper linux下无法启动的问题
2011-12-05 14:20 4765在linux下安装zookeeper时,出现了如下的错误: ... -
使用Java NIO编写高性能的服务器
2011-12-04 17:28 1128使用Java NIO编写高性能的服务器 从JDK 1.5开 ... -
jvm 参数设置
2011-10-18 16:01 1132jvm 参数设置 /usr/local/jdk/bin/ja ... -
eclipse 成功发布工程 但访问不到项目
2011-09-29 17:48 1363前提: 将其他的 工程 copy 一份修改了名字 在eclip ... -
java 生成 静态html
2011-09-15 15:43 1579java 生成html 网上的大部分资料都是 用 ##tit ...
相关推荐
哈夫曼编码算法与分析(java实现) 哈夫曼编码是一种广泛用于数据文件压缩的十分有效的编码方法,它通过对文件中各个字符出现的频率进行分析,生成各个字符的哈夫曼编码方案。哈夫曼编码的主要思想是通过构造一棵...
下面将详细介绍哈夫曼编码的原理、构建过程以及在Java中的实现。 1. **哈夫曼编码原理**: 哈夫曼编码是建立在频率统计基础上的,通过对输入文本中各个字符出现频率的统计,构造一棵特殊的二叉树——哈夫曼树。在...
在本项目中,使用Java语言实现了一个哈夫曼编码和解码的可视化界面,使得用户能够直观地观察到编码和解码的过程。 首先,`HuffmanAlgorithmAbstract.java`和`HuffmanAlgorithmImpl1.java`是哈夫曼编码算法的抽象类...
通过本次实验,不仅能够深入理解哈夫曼编码的基本原理,还能实际操作使用C语言编程实现哈夫曼编码器。这种实践经历对于学习数据结构和算法具有重要意义。此外,掌握了贪心算法的设计方法,对于解决实际问题也...
哈夫曼编码是一种基于字符频率构建的前缀编码方法,常用于数据压缩。它通过创建一棵特殊的二叉树——哈夫曼树(也称为最优二叉树),来为每个字符分配一个唯一的二进制编码。在哈夫曼树中,频率较高的字符其编码通常...
本文将围绕Java实现哈夫曼编码的文件压缩与解压进行详细解析。 首先,我们看到`main`方法调用了`zipFile`和`unZipFile`两个静态方法,分别用于文件的压缩和解压缩操作。`zipFile`方法接收源文件路径和目标压缩文件...
### Java实现哈夫曼编码:深入解析与代码解读 #### 哈夫曼编码简介 哈夫曼编码(Huffman Coding)是一种广泛应用于数据压缩领域的编码技术,它是由David Huffman在1952年提出的。这种编码方式的核心思想是根据数据...
总结来说,Java哈夫曼编码是利用数据结构和算法理论实现的一种压缩技术,它在处理大量重复字符的数据时表现优秀。通过合理地分配编码长度,哈夫曼编码可以有效地减少存储空间,同时保持数据的可恢复性,因此在文本...
在Java中实现哈夫曼树和哈夫曼编码,可以分为以下几个关键部分: 1. **创建`HuffmanNode`类**:表示哈夫曼树的节点,包含字符、频率以及指向左右子节点的引用。 2. **优先队列`PriorityQueue<HuffmanNode>`**:用于...
在Java中实现哈夫曼编码,主要涉及到以下几个关键步骤: 1. **构建哈夫曼树**: - 首先,统计输入文本中各个字符的出现频率。 - 接着,使用优先队列(如最小堆)创建一个哈夫曼树。每次从队列中取出两个频率最小...
- **设计目的**:设计一个能够实现对文件进行哈夫曼编码与解码的Java程序。通过对文件进行编码压缩和解码恢复,演示哈夫曼编码的有效性和实用性。 - **设计要求**: - 构造哈夫曼树及其编码。 - 对“明文”进行...
【Java实现哈夫曼编码】在Java中实现哈夫曼编码,首先需要创建一个`TreeNode`类来表示树的节点,包含字符、权重以及左右子节点。接着,通过以下步骤来构建哈夫曼树: 1. **初始化树**:输入的字符及其频率存储在...
在Java编程语言中,我们可以实现哈夫曼编码来压缩和解压缩数据。 首先,我们需要理解哈夫曼树的概念。哈夫曼树,也称为最优二叉树,是一种带权路径长度最短的二叉树。在构建哈夫曼树的过程中,我们会将出现频率最高...
这个“Huffman-coding-version-2.rar”压缩包包含了一个Java实现的哈夫曼编码程序,特别适合初学者学习和研究,因为代码中有丰富的注释,可以帮助理解算法的细节。 哈夫曼编码的基本思想是利用字符出现频率来构建...
在"哈夫曼编码的JAVA实现.pdf"文件中,可能包含了详细的代码示例,解释了如何用Java语言实现以上步骤。文件可能涵盖了从创建频率统计到构建哈夫曼树,再到编码和解码数据的完整过程。通过阅读这份文档,你可以深入...
在Java编程语言中,我们可以自定义实现哈夫曼编码的算法来对文本进行编码和解码。 首先,我们需要理解哈夫曼树的概念。哈夫曼树(又称最优二叉树)是一棵带权路径长度最短的二叉树,其中每个叶子节点代表一个需要...
在Java中实现哈夫曼编码和解码,我们需要理解以下几个关键步骤: 1. **初始化**: - 收集所有符号(例如字符串中的字符),并计算它们的频率(出现次数)。 - 将符号按照频率排序,放入一个列表中。 2. **构建...
8. **编程语言知识**:虽然没有明确指出使用哪种编程语言,但实现哈夫曼编码和译码通常涉及到C、C++、Java、Python等常见编程语言的基础知识,包括变量、条件语句、循环、函数等。 在实现这个项目的过程中,你需要...
综上所述,"HaffmanCode.rar_java 哈夫曼_压缩 解压 java_哈夫曼 编码_哈夫曼压缩"是一个包含Java实现的哈夫曼编码压缩和解压工具。它涉及到了哈夫曼树的构建、编码生成、文件压缩和解压的算法,以及Java中处理二...
java算法分析与设计之哈夫曼编码源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络资源少的可怜,尤其...