大家在离散数学课上学过Huffman算法,我们学的时候特别不认真,对它嗤之以鼻,哭着喊着说不好学,结果现在要用java来把Huffman树编出来,也就开始郁闷了,话说这个东西也郁闷了我好久。现在给大家晒晒,我的Huffman编码的生成。有可能和您用纸画出来的编码有点不同,但是其实质都是一样的。
import java.util.ArrayList;
/**
* 哈弗曼算法
*
*/
public class Huffman {
TreeNode treeroot;
/**
* 能够让一个无序字符串统计出其中的字母以及出现的次数
* @param s 要传入的无序字符串
* @return 统计出含有字母以及出现次数的队列
*/
public ArrayList<TreeNode> getString(String s){
ArrayList<TreeNode> str=new ArrayList<TreeNode>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
String st=""+c;
boolean exist=false;
for(int j=0;j<str.size();j++){
TreeNode temp=str.get(j);
if(temp.s.equals(st)){
temp.times++;
exist=true;
break;
}
}
if(!exist){
//在创建对象,向队列中加入之前,要先查看队中是否己有?
TreeNode data=new TreeNode();
data.times=1;
data.s=st;
str.add(data);
}
}
return str;
}
/**
* 冒泡排序
* @param MyTree 结点的队列(可以不按从小到大排列)
*/
public void Change(ArrayList<TreeNode> MyTree){
for(int i=0;i<MyTree.size()-1;i++){
for(int j=i+1;j<MyTree.size();j++){
int itime=MyTree.get(i).times; //前一个结点所含字母的出现次数
int jtime=MyTree.get(j).times; //后一个结点所含字母的出现次数
if(itime>jtime){
//TreeNode tag=new TreeNode();
TreeNode temi = MyTree.get(i);
TreeNode temj = MyTree.get(j);
MyTree.set(i, temj);
MyTree.set(j, temi);
// tag=temi;
// temi=temj; //只改变了新设定对象的指向
// temj= tag; //比较出现次数的大小 交换顺序
}
//把有叶片的结点放到前面
TreeNode item=MyTree.get(i);
TreeNode jtem=MyTree.get(j);
if(item.times==jtem.times){
if(item.LeftChild!=null&&jtem.LeftChild==null){
MyTree.set(i, jtem);
MyTree.set(j, item);
}else if(item.LeftChild==null&&jtem.LeftChild!=null){
MyTree.set(i, jtem);
MyTree.set(j, item);
}
}
}
}
//检测排序是否正确
// for(int i=0;i<MyTree.size();i++){
// System.out.println("字母为"+MyTree.get(i).s+" 出现次数为"+MyTree.get(i).times);
// System.out.println();
// }
}
/**
* 开始创建哈弗曼树
* @param MyTree
*/
public void BuildTree(ArrayList<TreeNode> MyTree){
TreeNode tn=new TreeNode();
TreeNode node1=new TreeNode();
TreeNode node2=new TreeNode();
if(MyTree.size()>1){
node1=MyTree.get(0); //确定前两个最小的结点所生成的树叶
node2=MyTree.get(1);
tn.LeftChild=node1; //确定左孩子 右孩子
tn.RightChild=node2;
node1.root=tn; //确定前两个孩子的根
node2.root=tn;
tn.times=node1.times+node2.times;//确定根值
// tn.s="新的";
MyTree.remove(0);
MyTree.remove(0); //移除已确定的两片树叶
MyTree.add(tn); //把已经确定好了的一个根添加到队列中
//int ThisNum=tn.times; //确定根的值的大小
// System.out.println("左子树为"+node1.s+" 出现次数为"+node1.times+" 右子树为"+node2.s+" 出现次数为"+node2.times);
// System.out.println(); //检测树是否创建错误
Change(MyTree); //重新排序
BuildTree(MyTree); //递归 再次生成树叶
}else if(MyTree.size()==1){
treeroot=MyTree.get(0);
//System.out.println("treeroot"+treeroot.times);
CalculateHuffman(treeroot,"");
}
}
public void CalculateHuffman(TreeNode root,String s){
if(root!=null){
// if(root.LeftChild){
// s+="0";
// CalculateHuffman(root.LeftChild,s);
// }
// if(root.RightChild!=null){
// s+="1";
// CalculateHuffman(root.RightChild,s);
//因为每个结点都是有左子树和右子树的(叶片不算),故这两句话没用
// }
if(root.LeftChild==null&&root.RightChild==null){
System.out.println(root.s+"编码为"+s);
System.out.println(" 出现次数为"+root.times);
}
CalculateHuffman(root.LeftChild,s+"0");
CalculateHuffman(root.RightChild,s+"1");
}
}
}
分享到:
相关推荐
### Huffman算法的分析与改进 #### 引言 在当今数据密集型社会中,数据压缩技术扮演着至关重要的角色,特别是在提高数据存储效率和加快数据传输速度方面。Huffman算法,一种基于字符出现频率的自适应编码方法,是...
具体实现Huffman算法的源程序,比较适合新学数据结构的人学习。
一种应用广泛是算法,虽然简单;但是比较重要
《实验四:Huffman算法详解》 Huffman算法,又称为哈夫曼编码,是一种用于数据压缩的高效算法。它的核心思想是构建最优二叉树,即带权路径长度最短的二叉树,以此来生成编码,使得数据在编码后的平均长度最短,从而...
Huffman算法是贪心算法的一个经典应用,主要用于数据压缩,通过构建Huffman树来实现。Huffman编码是一种可变长度的前缀编码,它使得频繁出现的字符拥有较短的编码,不常出现的字符则拥有较长的编码,以此达到压缩...
在C#中实现Huffman算法,首先需要对输入数据进行频度统计,找出出现最频繁的字符。这通常通过创建一个哈希表或字典来完成,其中键是字符,值是对应字符的出现次数。然后,这些字符按照频度排序,形成一个优先队列...
java实现huffman算法 ~可以在控制台输入字符串编码~
简单的算法实现,可以实现任意的最优二叉树的生成(生成的二叉树不唯一)
### 基于Huffman算法的压缩软件 #### 概述 随着信息技术的快速发展,数据压缩技术成为提高信息处理效率的重要手段之一。特别是在面对大量数据的存储与传输时,有效的压缩算法不仅能节省存储空间,还能加快数据传输...
在这个项目中,我们看到的是使用C语言实现的Huffman算法对图像进行编码和解码的过程。 首先,我们需要理解Huffman编码的步骤: 1. **统计字符频率**:对图像文件中的每个像素颜色值(通常是RGB或灰度值)进行统计...
哈夫曼编码(Huffman Coding)是一种数据压缩算法,由美国计算机科学家大卫·艾尔文·哈夫曼在1952年提出。这个算法基于一种称为“最优二叉树”或“哈夫曼树”的数据结构。哈夫曼编码的基本思想是利用字符出现频率的...
实验目的:编写基于 Huffman 算法的压缩和解压缩程序。你的程序应该能够压缩任意文件,并能无损解压。 实验内容:压缩文件:根据 ASCII 码文件中各 ASCII 字符出现的频率情况创建 Huffman 树,再将各字符对应的...
### 多叉树Huffman算法解析 #### 一、引言与背景 哈夫曼编码是一种广泛应用在数据压缩领域的高效编码方法,它是由David A. Huffman于1952年提出的一种变长前缀编码技术。哈夫曼编码的核心思想在于通过对字符出现...
【标题】"flash制作的Huffman算法课件" 指的是一种利用Adobe Flash CS6软件创作的互动教学资源,旨在讲解Huffman编码这一数据压缩技术。Huffman编码是信息论中的一个基本概念,由David A. Huffman在1952年提出,是一...
在C语言中实现Huffman算法,主要涉及到以下几个关键步骤: 1. **字符频率统计**:首先,我们需要对输入的文本或数据流进行字符频率统计。这通常可以通过遍历输入数据,记录每个字符出现的次数来完成。 2. **构建...
许多按照高性能思想设计出的DSP 处理器, 其性能却在应用中得不到很好的发挥。深入分析DSP 处理器的指令编码就会发现, ...在分别讨论、比较了两种方式后, 提出了一种基于Huffman 算法的能够提高编码效率的指令编码方法。
在这个“用于文件压缩的huffman算法.rar”压缩包中,我们可以期待找到一个C++实现的哈夫曼编码器。 哈夫曼编码的核心思想是为数据中的每个符号(如文本中的字符)分配一个唯一的二进制编码,使得频率高的符号对应较...
在本压缩包中,"用于文件压缩的huffman算法"可能是包含具体实现细节的文档,如源代码、算法描述或步骤详解。"www.pudn.com.txt"可能是一个示例文本文件,用于演示哈夫曼压缩的效果。开发者使用VC++(Visual C++)这...