`
吸血鬼猎人
  • 浏览: 19464 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

Huffman算法

阅读更多

      大家在离散数学课上学过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");
		}
		
	}
}

 

 

 

分享到:
评论
4 楼 吸血鬼猎人 2010-08-18  
沈冠军 写道
,要是能把胡哥说的那个功能给搞出来的话就厉害了啊

嗯,假懂同学貌似已经弄出来了。
3 楼 吸血鬼猎人 2010-08-18  
freewxy 写道
看着还是有点吃力,这种经典的东西应该多编几次

刘容学长(xio chang) (我觉得应该是你,如果猜错了就不好意思了啊!)……确实,这种东西应该要多编几次。

尤其是Huffman编码的那儿
2 楼 freewxy 2010-08-17  
看着还是有点吃力,这种经典的东西应该多编几次
1 楼 沈冠军 2010-08-17  
,要是能把胡哥说的那个功能给搞出来的话就厉害了啊

相关推荐

    Huffman算法的分析与改进

    ### Huffman算法的分析与改进 #### 引言 在当今数据密集型社会中,数据压缩技术扮演着至关重要的角色,特别是在提高数据存储效率和加快数据传输速度方面。Huffman算法,一种基于字符出现频率的自适应编码方法,是...

    数据结构的Huffman算法

    具体实现Huffman算法的源程序,比较适合新学数据结构的人学习。

    huffman算法

    一种应用广泛是算法,虽然简单;但是比较重要

    实验四 Huffman算法(离散数学实验报告).pdf

    《实验四:Huffman算法详解》 Huffman算法,又称为哈夫曼编码,是一种用于数据压缩的高效算法。它的核心思想是构建最优二叉树,即带权路径长度最短的二叉树,以此来生成编码,使得数据在编码后的平均长度最短,从而...

    第8章贪心算法-Huffman算法

    Huffman算法是贪心算法的一个经典应用,主要用于数据压缩,通过构建Huffman树来实现。Huffman编码是一种可变长度的前缀编码,它使得频繁出现的字符拥有较短的编码,不常出现的字符则拥有较长的编码,以此达到压缩...

    Huffman算法的压缩程序(C#实现)

    在C#中实现Huffman算法,首先需要对输入数据进行频度统计,找出出现最频繁的字符。这通常通过创建一个哈希表或字典来完成,其中键是字符,值是对应字符的出现次数。然后,这些字符按照频度排序,形成一个优先队列...

    java实现huffman算法

    java实现huffman算法 ~可以在控制台输入字符串编码~

    数据结构及离散数学的huffman算法c/c++实现

    简单的算法实现,可以实现任意的最优二叉树的生成(生成的二叉树不唯一)

    基于huffman算法的压缩软件

    ### 基于Huffman算法的压缩软件 #### 概述 随着信息技术的快速发展,数据压缩技术成为提高信息处理效率的重要手段之一。特别是在面对大量数据的存储与传输时,有效的压缩算法不仅能节省存储空间,还能加快数据传输...

    基于huffman算法的图像编码 c语言版

    在这个项目中,我们看到的是使用C语言实现的Huffman算法对图像进行编码和解码的过程。 首先,我们需要理解Huffman编码的步骤: 1. **统计字符频率**:对图像文件中的每个像素颜色值(通常是RGB或灰度值)进行统计...

    huffman进行编码,解码根据Huffman算法编写一个对文件进行压缩和解压缩的程序。该程序可以对所有的文件类型进行压缩,压缩之后的文件后缀名为huff。

    哈夫曼编码(Huffman Coding)是一种数据压缩算法,由美国计算机科学家大卫·艾尔文·哈夫曼在1952年提出。这个算法基于一种称为“最优二叉树”或“哈夫曼树”的数据结构。哈夫曼编码的基本思想是利用字符出现频率的...

    编写基于C++ Huffman 算法的无损压缩程序和解压程序【100010816】

    实验目的:编写基于 Huffman 算法的压缩和解压缩程序。你的程序应该能够压缩任意文件,并能无损解压。 实验内容:压缩文件:根据 ASCII 码文件中各 ASCII 字符出现的频率情况创建 Huffman 树,再将各字符对应的...

    多叉树Huffman算法

    ### 多叉树Huffman算法解析 #### 一、引言与背景 哈夫曼编码是一种广泛应用在数据压缩领域的高效编码方法,它是由David A. Huffman于1952年提出的一种变长前缀编码技术。哈夫曼编码的核心思想在于通过对字符出现...

    flash制作的Huffman算法课件

    【标题】"flash制作的Huffman算法课件" 指的是一种利用Adobe Flash CS6软件创作的互动教学资源,旨在讲解Huffman编码这一数据压缩技术。Huffman编码是信息论中的一个基本概念,由David A. Huffman在1952年提出,是一...

    C语言实现Huffman算法的压缩工具

    在C语言中实现Huffman算法,主要涉及到以下几个关键步骤: 1. **字符频率统计**:首先,我们需要对输入的文本或数据流进行字符频率统计。这通常可以通过遍历输入数据,记录每个字符出现的次数来完成。 2. **构建...

    论文研究-基于Huffman算法的DSP处理器指令编码方法.pdf

    许多按照高性能思想设计出的DSP 处理器, 其性能却在应用中得不到很好的发挥。深入分析DSP 处理器的指令编码就会发现, ...在分别讨论、比较了两种方式后, 提出了一种基于Huffman 算法的能够提高编码效率的指令编码方法。

    用于文件压缩的huffman算法.rar

    在这个“用于文件压缩的huffman算法.rar”压缩包中,我们可以期待找到一个C++实现的哈夫曼编码器。 哈夫曼编码的核心思想是为数据中的每个符号(如文本中的字符)分配一个唯一的二进制编码,使得频率高的符号对应较...

    用于文件压缩的huffman算法.zip_huff 压缩_huffman_vc huffman 压缩_压缩算法_文件压缩

    在本压缩包中,"用于文件压缩的huffman算法"可能是包含具体实现细节的文档,如源代码、算法描述或步骤详解。"www.pudn.com.txt"可能是一个示例文本文件,用于演示哈夫曼压缩的效果。开发者使用VC++(Visual C++)这...

Global site tag (gtag.js) - Google Analytics