`

Huffman编码

阅读更多

数组里面的权值对应了空格以及abcd......xyz,然后进行Huffman编码

 

package tree;

import java.util.ArrayList;

public class testHuffmanTree {
	public static void main(String[] args) {
		//the weight of leafNode
		int weight[]={186,64,13,22,32,103,21,15,47,57,
				        1, 5,32,20,57, 63,15, 1,48,51,
				       80,23,8,18,1,16,1};	
		huffmanTree tree =new huffmanTree(weight);
		tree.HuffmanCoding();
		tree.printHuffmanCoding();
		
	}
}
class huffmanTreeNode{
	int weight;
	int parent,lchild,rchild;
	huffmanTreeNode(){}
	huffmanTreeNode(int weight,int parent,int lchild,int rchild){
    	this.weight=weight;	
    	this.parent=parent;
    	this.lchild=lchild;
    	this.rchild=rchild;
	}
}
class huffmanTree{
	private int n;//the number of leafNodes
	private int m;
	private int[] weight;
	/*the number of all Nodes
	 *不能在这里写m=2*n-1;否则m只是会等于1.
	*/
	//ArrayList  huffmanTree store the nodes of the tree
	private ArrayList<huffmanTreeNode>  huffmanTree=new ArrayList<huffmanTreeNode>();
	//Coding stores the coding of the huffmanTree.
	private char[][] Coding;
 	huffmanTree(){}
	huffmanTree(int[] weight){
		this.weight=weight;	
		//如果m,n 不在这里初始化,在其他函数中初始化是会随即销毁的
		n=weight.length;
		m=2*n-1;
		creatHuffman();
	} 
	public ArrayList<huffmanTreeNode> getHuffmanTree() {
		return huffmanTree;
	}
    /*to select  two nodes with the minimun weight 
     * (index ranges from 0 to endOfArrayList),
     * and these two nodes' parent  equals 0
	*/
    int Select(int endOfArrayList){
    	int minimun=1000000000;
    	int current=-1;
    	for(int i=0;i<=endOfArrayList;i++){
    		if(0!=huffmanTree.get(i).parent)
    			continue;
    		if(huffmanTree.get(i).weight<minimun){
    			minimun=huffmanTree.get(i).weight;	
    			current=i;  			
    		}  			
    	}
    	return current;	
    }
    //creatHuffman
	void creatHuffman(){		
		for(int i=0;i<n;i++){
			huffmanTree.add(new huffmanTreeNode(weight[i],0,0,0));			
		}	
		for(int i=n;i<m;i++){
			huffmanTree.add(new huffmanTreeNode(0,0,0,0));
		}
		for(int i=n;i<m;i++ ){
			int s1,s2;
			s1=Select(i-1);			
			huffmanTree.get(s1).parent=i;
			s2=Select(i-1);			
			huffmanTree.get(s2).parent=i;
			// s1 and s2 are the smallest 
			huffmanTree.get(i).lchild=s1;
			huffmanTree.get(i).rchild=s2;// in this case  lchild  is  not bigger than rchild
			huffmanTree.get(i).weight=
					huffmanTree.get(s1).weight+
					huffmanTree.get(s2).weight;	
		}    	
	}
	//getHuffmanCoding
    void  HuffmanCoding(){
    	Coding=new char[n][n]; 	
    	for(int i=0;i<n;i++){
    		int start=n-1;
    		for(int c=i, f=huffmanTree.get(i).parent;  f!=0;  c=f,f=huffmanTree.get(f).parent){
    			if(huffmanTree.get(f).lchild==c)
    				Coding[i][start--]='0';//左分支为‘0’
    			else 
    				Coding[i][start--]='1';	
    		}   		 		
    	}	
    }
    //printHuffmanCoding
    void printHuffmanCoding(){
    	char letter=97;//对应的字母
    	System.out.println("the codes  are as following ******" );
    	for(int i=0;i<n;i++){//第一个是空格,额外考虑
    		if(i!=0){
    			System.out.print(letter+"  : "  );
        		letter++; 			
    		}
    		else 
    			System.out.print("空格"+"  : "  );   		
    		for(int j=0;j<n;j++){
    			if(Coding[i][j]!='#')
    	    		System.out.print(Coding[i][j]+" ");
    		}
    		System.out.println();
    	}	
    }
}
 

 

2
0
分享到:
评论
1 楼 come_for_dream 2015-06-18  
     

相关推荐

    Huffman编码的java实现

    Huffman编码是一种高效的数据压缩算法,它基于字符出现频率构建最优前缀树,进而为每个字符分配唯一的二进制编码。在Java环境下实现Huffman编码,我们需要理解以下几个关键概念: 1. **字符频率统计**:首先,我们...

    Quake3 自适应huffman编码分析

    ### Quake3自适应Huffman编码分析 #### 一、Huffman编码原理及Quake3应用背景 Huffman编码是一种广泛应用于数据压缩领域的算法,它能够有效地减少存储或传输的数据量,尤其适用于文本数据的压缩。Huffman编码的...

    C语言实现Huffman树,Huffman编码

    在数据压缩技术中,Huffman编码是一种广泛使用的无损数据压缩算法,它基于字符频率进行编码,使得频繁出现的字符拥有较短的编码,从而提高压缩效率。本项目将深入探讨如何使用C语言实现Huffman树和Huffman编码。 ...

    图像的Huffman编码

    ### 图像的Huffman编码详解 #### 一、Huffman编码原理 Huffman编码是一种用于数据压缩的熵编码算法,由David A. Huffman在1952年提出。该算法的核心是通过构建一棵Huffman树(又称为最优二叉树),来为数据中的每...

    Huffman编码和解码的C语言实现

    ### Huffman编码和解码的C语言实现 #### 引言 随着信息技术的快速发展,数据量呈爆炸式增长,这对存储设备的容量、通信线路的带宽以及计算机的处理能力提出了更高要求。在这种背景下,数据压缩技术变得尤为重要。...

    Huffman编码测试文件

    Huffman编码是一种基于频率的无损数据压缩方法,由David A. Huffman于1952年提出。在信息论和计算机科学中,它被广泛应用于文本、图像、音频和其他类型的数据压缩。这个压缩包文件“Huffman编码测试文件”包含了各种...

    Huffman编码C++源代码

    ### Huffman编码C++源代码解析 #### 一、Huffman编码简介 Huffman编码是一种广泛应用于数据压缩领域的编码方法,其基本思想是根据符号出现的频率来决定编码的长度,出现频率高的符号会分配较短的编码,而出现频率...

    基于Matlab的图像Huffman编码的实现

    Huffman编码是一种基于频率的无损数据压缩方法,最初由D.E. Huffman在1952年提出。本项目实现了在Matlab环境下对图像进行Huffman编码的过程,包括图像的灰度化、编码、解码以及计算压缩比和执行时间。 首先,我们要...

    jpeg压缩编码中的Huffman编码表

    JPEG文件格式中使用了多种技术来实现压缩,其中Huffman编码就是关键技术之一。Huffman编码是一种广泛使用的熵编码方法,属于无损压缩技术,它可以将数据转换为变长编码,使得频繁出现的字符使用较短的编码,不常见的...

    Huffman树 及 Huffman编码 演示程序

    Huffman树,也被称为哈夫曼树或霍夫曼树,是一种特殊的二叉树,用于在数据压缩领域实现高效的编码方法——Huffman编码。这种编码技术是基于频率的,能够为出现频率高的字符分配较短的编码,而为出现频率低的字符分配...

    Huffman编码构成过程.files.rar

    Huffman编码是一种高效的数据压缩算法,由David A. Huffman在1952年提出,主要用于无损数据压缩。它的核心思想是构建一棵特殊的二叉树——Huffman树,通过这棵树来为每个字符生成唯一的二进制编码。下面将详细阐述...

    Huffman编码C++实现

    Huffman编码C++实现 Huffman编码是一种变长前缀编码算法,广泛应用于数据压缩、图像处理、文本处理等领域。下面是对Huffman编码C++实现的详细解释。 Huffman树 Huffman树是一种特殊的二叉树,它的叶子结点代表...

    数据结构上机实验 Huffman编码(二叉树) C语言

    实验三、Huffman编码(二叉树)  实验目的:熟练掌握二叉树应用(Huffman编码)的基本算法实现。  实现功能:对输入的一串电文字符实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现...

    Huffman编码 程序 数据结构实验

    Huffman编码是一种基于二叉树的数据压缩方法,由David A. Huffman在1952年提出,主要用于无损数据压缩。它的核心思想是利用字符出现频率的差异来创建一棵特殊的二叉树——Huffman树,使得频繁出现的字符拥有较短的...

    Huffman编码(MFC版本)

    Huffman编码是一种高效的数据压缩算法,由David A. Huffman在1952年提出,主要用于文本数据的压缩。它的核心思想是构建一棵特殊的二叉树——哈夫曼树,通过这棵树来为每个字符生成一个唯一的前缀编码,使得频繁出现...

    Huffman编码以及其编码效率的计算

    Huffman编码是一种基于贪心策略的数据压缩算法,由David A. Huffman在1952年提出。它通过构建一棵特殊的二叉树——哈夫曼树(Huffman Tree),来为输入符号(通常是一些字符)分配不同的二进制编码,使得出现频率高...

    用Huffman编码对文件进行压缩的C语言实现

    ### 用Huffman编码对文件进行压缩的C语言实现 #### 一、引言 随着计算机技术的发展,数据量的增长速度越来越快,如何有效地管理和处理这些数据成为了亟待解决的问题。其中,数据压缩技术因其能够有效减少数据占用...

    huffman编码/译码的实现

    3. **生成Huffman编码**:调用`HuffmanCode()`函数生成每个字符的Huffman编码。 4. **显示编码结果**:使用`HShowCode()`函数展示每个字符及其对应的编码。 5. **文件编码**:通过`CharCodeFile()`函数对文件进行...

Global site tag (gtag.js) - Google Analytics