哈夫曼编码(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);
}
}
效果如图所示:
相关推荐
利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向...
详细描述了哈夫曼树的构造方法,同时推广到三元哈夫曼编码,并用C语言于VC++上实现
这个代码是用C/C++实现哈夫曼编码并将编码输出。 文本为操作者输入,,对各字符进行频率统计,然后进行哈夫曼编码,并将编码结果输出,同时可求得平均码长。
哈夫曼树与哈夫曼编码 建立哈夫曼树并计算哈夫曼编码
哈夫曼编码实现文本文件的压缩,可作为数据压缩作业的参考
压缩文件即读文件,统计文件中的字符个数,对文件进行哈夫曼编码和译码,并将编码译码后的字符存储在文件中。 完成功能的详细说明: 1.统计文本文件中各字符的频率(涉及读文件,统计字符个数); 2.对文件中的...
哈夫曼编码(Huffman Coding),是一种熵编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般...
摘 要:哈夫曼编码是一种数据编码方式,以哈夫曼树——即最优二叉树,用带权路径长度最小的二叉树,对数据进行重编码,经常应 用于数据压缩。在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称“熵编码法...
利用哈夫曼编码思想,设计对一个文本文件(.txt)中的字符进行哈夫曼编码,生成编码压缩文件(.txt),并且还可将压缩后的文件进行解码还原为原始文本文件(.txt)。 实现的功能: (1)压缩:实现对文件的压缩,生成...
哈夫曼编码课程设计,我要让所以人都知道写一个哈夫曼编码树便不是难事。
哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方式,其压缩率通常在20%—90%之间。哈夫曼编码算法是通过使用字符在文件中出现的频率表来构造最优前缀码的贪心算法。所谓前缀码,即是任一字符的编码都不是其他...
这是那个用c语言来实现的哈夫曼编码程序,可以对输入的数据进行相应的编码……
一、【问题描述】 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本 。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数 据进行译码,此实验即设计这样...
c语言实现哈夫曼编码,并求平均码长 c语言实现哈夫曼编码,并求平均码长
本人的小工具仅针对英文大小字母及 ' '\n' ' ' 字符针对性的进行了哈夫曼编码,若想实现中文及各种支持语言的编码,可在此代码基础上,进行优化。 详细介绍参考:...
c++ 源代码 哈夫曼树 哈夫曼编码 部分代码如下: #include"Huffman.h" #include"hfmTree.h" #include using namespace std; int main() { cout~~~~~~~~~~~~~welcome to Huffman encodrding&decoding system ~~~~~~...
要求对一段数据序列进行哈夫曼编码,使得平均码长最短,输出各元素编码和编码后的数据序列。 ①组成序列的元素是[0-9]这10个数字,每个数字其对应的4位二进制数表示。比如5对应0101,9对应1001。 ②输入数据序列的...
数据结构课程设计,实现哈夫曼编码,译码,打印哈夫曼树