哈夫曼编码(Huffman Coding)是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就叫作Huffman编码。
以下是代码实现:
public class HFM {
class Node{
Node left;
Node right;
String code="";
int data;
}
public void creatTree(int [] datas){
Node [] nodes=new Node[datas.length]; // 新建一个长度为传入数组长度的Node类型
//遍历将传入数组的值赋给node数组,同时为每个node【i】开辟一个堆空间
for(int i=0;i<nodes.length;i++){
nodes[i]=new Node();
nodes[i].data=datas[i];
}
//当长度大于1时
while(nodes.length>1){
//只要当长度大于一时,开始排序
sort(nodes);
//赋值
Node n1 = nodes[0];
Node n2 = nodes[1];
Node node = new Node();
//左节点指向n1
node.left = n1;
//右节点指向n2
node.right = n2;
//得到相加的值
node.data = n1.data +n2.data;
//新建node型数组,比原节点少一个
Node[] nodes2 = new Node[nodes.length-1];
//将n1,n2,删除掉,将数组从nodes2【2】开始
for(int i = 2; i<nodes.length;i++){
nodes2[i-2]=nodes[i];
}
//将新建的数组地址赋给node
nodes2[nodes2.length-1]=node;
//更新数组
nodes = nodes2;
}
//根节点指向更新后数组首地址
Node root = nodes[0];
//打印树
printTree(root,"");
}
public void printTree(Node node ,String code){
if(node!=null){
//先序遍历
if(node.left==null&&node.right==null)//有了条件只打印叶结点
System.out.println(node.data+"的编码是:"+code);
printTree(node.left,code+"0");
printTree(node.right,code+"1");
}
}
public void sort(Node[] nodes){
//冒泡法排序
for(int i = 0;i<nodes.length;i++){
for(int j = i;j<nodes.length;j++){
if(nodes[i].data>nodes[j].data){
Node temp = new Node();
temp=nodes[i];
nodes[i]=nodes[j];
nodes[j]=temp;
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
HFM hfm = new HFM();
int[] datas = {3,2,7,4,0};
hfm.creatTree(datas);
}
}
效果如图所示:
相关推荐
### 哈夫曼编码的贪心算法设计 #### 实验背景与意义 哈夫曼编码是一种广泛应用的数据压缩技术,特别是在文件压缩领域有着极其重要的作用。哈夫曼编码利用了贪心算法的思想来构建最优的前缀编码树,进而达到高效...
哈夫曼树与哈夫曼编码是数据结构和算法领域中的一个重要概念,广泛应用于数据压缩、文本编码以及优先队列等场景。哈夫曼编码是一种特殊的前缀编码方法,能够为字符提供一种高效的二进制表示,使得频繁出现的字符具有...
哈夫曼编码计算信源熵及编码效率 哈夫曼编码是一种变长前缀编码方法,它可以根据信源符号的概率分布计算信源熵和编码效率。本文将详细介绍哈夫曼编码的原理、步骤和实现方法。 哈夫曼编码的原理 哈夫曼编码的原理...
哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩。它的原理是为每个字符分配一个唯一的二进制编码,使得频繁出现的字符拥有较短的编码,而不常出现的字符则有较长的编码,以此来减少平均编码长度,达到...
哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩,尤其在文本和图像处理领域广泛应用。它基于字符出现频率构建最优的二叉树结构,使得频繁出现的字符占用更短的编码,从而提高压缩效率。这个“图像处理...
利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。根据哈夫曼编码的原理,编写一个程序,在用户输入结点权值的基础上求哈夫曼编码。 从键盘输入若干字符及每个字符出现的频率,...
### 哈夫曼编码MATLAB程序解析 #### 前言 哈夫曼编码是一种广泛应用在数据压缩领域的编码方式,其核心思想是通过构建一棵特殊的二叉树(哈夫曼树)来实现对不同字符的高效编码。该编码方法在确保原始数据可被完全...
哈夫曼编码是一种高效的数据压缩方法,主要用于无损数据压缩,尤其在文本文件的压缩中效果显著。它基于字符出现频率构建最小带权路径长度(Minimum Weighted Path Length, MWPL)的二叉树,也被称为哈夫曼树。在这个...
哈夫曼编码是一种高效的数据压缩方法,由大卫·艾伦·哈夫曼在1952年提出。它是基于字符频率构建的一种前缀编码,能够为频繁出现的字符分配较短的编码,从而减少数据存储空间,提高传输效率。在C语言中实现哈夫曼...
### 哈夫曼编码原理及其实现 #### 前言 哈夫曼编码是一种广泛应用在数据压缩领域的编码方式,特别适用于无损压缩。它通过构建一个特殊的二叉树——哈夫曼树来实现最优前缀编码。本文将详细介绍哈夫曼编码的基本...
哈夫曼编码是一种高效的数据压缩方法,源自于数据结构中的二叉树理论,由David A. Huffman在1952年提出。它基于频率最小的编码原则,通过构建一棵特殊的二叉树(哈夫曼树)来为每个字符或符号生成唯一的前缀编码,...
哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方式,其压缩率通常在20%—90%之间。哈夫曼编码算法是通过使用字符在文件中出现的频率表来构造最优前缀码的贪心算法。所谓前缀码,即是任一字符的编码都不是其他...
哈夫曼编码是一种高效的前缀编码方法,它根据数据出现频率分配最短的二进制码,频繁出现的字符拥有较短的编码,从而减少传输或存储的数据量。 实验报告中提到的实验目的是为了让学生熟练掌握树形结构,特别是哈夫曼...
哈夫曼编码是一种高效的数据压缩方法,常用于文本、图像等多种数据类型的压缩。在数据结构课程中,哈夫曼树(又称最优二叉树)是理解哈夫曼编码的关键。这个C语言实现的哈夫曼编码译码器是学习哈夫曼编码原理和实践...
"三元哈夫曼编码 哈夫曼树" 哈夫曼树是一种特殊的二叉树结构,它可以用于数据压缩、图像处理和网络通讯等领域。哈夫曼树的构造方法是根据给定的权值来构造一棵二叉树,使其带权路径长度 WPL 最小。哈夫曼树的优点是...
哈夫曼编码是一种基于二叉树的数据压缩方法,由美国计算机科学家戴维·哈夫曼在1952年提出。在本项目中,我们利用哈夫曼编码实现了对文本文件的加密和解密功能,具体操作是针对ASCII字符集内的字符进行。以下是关于...
哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩,通过构建最优的二叉树结构(哈夫曼树)来实现对字符的编码。在本项目中,使用Java语言实现了一个哈夫曼编码和解码的可视化界面,使得用户能够直观地观察...
哈夫曼编码实验报告 数据结构大作业哈夫曼编码实验报告是一个关于哈夫曼编码的实验报告,讲述了哈夫曼编码的基本原理、构造过程和代码实现。哈夫曼编码是一种变长前缀编码,用于数据压缩和编码。下面是该实验报告的...
哈夫曼编码是一种高效的数据压缩方法,源自于数据结构中的二叉树理论,由David A. Huffman在1952年提出。它基于频率优先的原则,通过构建最优的二叉树(也称为哈夫曼树或最小带权路径长度树)来为字符或符号分配唯一...