原理:哈夫曼编码是根据将已给出的权值作为叶子结点,生成一颗哈夫曼树,然后使得权重最小。

首先生成已给权重的所有的叶子结点,然后取所有节点中最小和次小的结点作为左右孩子生成一个哈夫曼树,计算出父节点的权重放入给出的权重森林中,并把之前的最小和次小的结点从森林中删除,再在种种森林中找最小和次小的结点生成权重树....直到最终只剩下一个树为止。

哈夫曼树的结点用如下结点表示:

(有权重,左右孩子,父节点,然后设置一个标识符标志结点是否已经放入哈夫曼树)

package tree;

/**********哈夫曼树的节点类描述*********/

public class HuffmanNode {

private int weight;//权重

private int flag;//是否加入到huffman树中

private HuffmanNode parent,lchild,rchild;//树种的结点之间的关系

public HuffmanNode(){//构造空结点

this(0);

}

public HuffmanNode(int weight){//构造只具有权值的空结点

this.weight=weight;

flag=0;

parent=lchild=rchild=null;

}

public void setweight(int weight){

this.weight=weight;

}

public int getweight(){

return weight;

}

public void setflag(int flag){

this.flag=flag;

}

public int getflag(){

return flag;

}

public void setparent(HuffmanNode parent){

this.parent=parent;

}

public HuffmanNode getparent(){

return parent;

}

public void setlchild(HuffmanNode lchild){

this.lchild=lchild;

}

public HuffmanNode getlchild(){

return lchild;

}

public void setrchild(HuffmanNode rchild){

this.rchild=rchild;

}

public HuffmanNode getrchild(){

return rchild;

}

}

哈夫曼树的构造:

用给出的权重数组构造哈夫曼树,首先要先给每个权重生成哈夫曼结点代用(标志为放入哈夫曼树 falg=0);

计算得出最终哈夫曼树中会有多少个结点,由叶子结点为n,则总结点为2*n-1个;

所以要其次接入n-1个结点(下标为:n--m-1);首先选n个中的二最小和次小结点比较(设置一个比较函数对HN中的所有节点遍历,找到之后设置flag=1,然后再次寻找HN中的最小结点),最终构成整个哈夫曼树

然后由叶子结点开始读出哈夫曼编码:

package tree;

public class HuffmanTree {

public int[][] huffmanCoding(int[] w){

int n=w.length;

int m=2*n-1;

HuffmanNode[] HN=new HuffmanNode[m];//生成一个元素为哈夫曼树结点的数组

int i;

for(i=0;i

HN[i]=new HuffmanNode(w[i]);//生成哈夫曼树的叶子结点

}

for(i=n;i

HuffmanNode min1=selectMin(HN,i-1);

min1.setflag(1);

HuffmanNode min2=selectMin(HN,i-1);//上面找到的那个flag已标志为1,所以不会再次寻找

min2.setflag(1);//找到所有节点中权重最小的结点加入到哈夫曼树中

HN[i]=new HuffmanNode();

min1.setparent(HN[i]);

min2.setparent(HN[i]);

HN[i].setlchild(min1);

HN[i].setrchild(min2);

HN[i].setweight(min1.getweight()+min2.getweight());//修改两个结点的父节点,及权重

}

int[][] HuffCode=new int[n][n];//分配n个字符编码存储空间

for(int j=0;j

int start=n-1;

//从后开始 对HuffCode数组每个结点的下标由后向前填充,保证编码的前缀相同00... huffCode[0][6]=1 huffCode[0][5]=0

//则huffCode 为0000 0001即小标为1的一个哈夫曼结点的哈夫曼变慢

for(HuffmanNode c=HN[j],p=c.getparent();p!=null;c=p,p=p.getparent()){

if(p.getlchild().equals(c)) HuffCode[j][start--]=0;

else HuffCode[j][start--]=1;

}//对同一个结点的路径做遍历

HuffCode[j][start--]=-1;//对剩余的路径为填充-1

}//对n个叶子结点的路径做遍历

return HuffCode;//返回哈夫曼编码数组

}

private HuffmanNode selectMin(HuffmanNode[] HN,int end){

HuffmanNode min=HN[end];

for(int i=0;i<=end;i++){

HuffmanNode h=HN[i];

if(h.getflag()==0&&h.getweight()

min=h;

}

return min;

}

public static void main(String[] args){

int[] w={23,11,5,3,29,14,7,8};

HuffmanTree t=new HuffmanTree();

int[][] HN=t.huffmanCoding(w);

System.out.println("哈弗满编码为:");

for(int i=0;i

System.out.print(w[i]+": ");

for(int j=0;j

if(HN[i][j]==-1){//值输出有路径的编码位(n位中的后几位)

for(int k=j+1;k

System.out.print(HN[i][k]);

break;

}

}

System.out.println();

}

}

}

结果:

哈弗满编码为:

23: 01

11: 001

5: 11111

3: 11110

29: 10

14: 110

7: 1110

8: 000

哈夫曼树为:

java中哈夫曼编码所用的函数_数据结构(java语言描述)哈夫曼编码相关推荐

  1. java中把路径定义到src下的_设置java路径路径

    JDK环境变量配置 java设置classpath,path,java_home环境变量 Windows7安装JDK的环境变量设置Windows7 X64安装"jdk-6u26-window ...

  2. java中数组的返回值是什么类型_打印java 数组的最简单方式是什么?

    简介 问题来源于stackoverflow. 在java语言中,数组是无法重写toString.如果直接打印一个数组,则得到className+'@'+ hashCode数组的十六进制. int[] ...

  3. java中线程控制方法的说法正确的是_在java程序中,下列关于线程的说法错误的时()...

    银行会计记账方法按其登记经济业务方式不同,可选择()A.借贷复式记账法B.资金收付复式 细集料泥块含量试验试样置于容器中后,注入洁净的水,水面至少超过砂面约()A.100mmB.150mmC.200 ...

  4. java中的复合数据类型是什么_【填空题】类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素。一个类的实现包括两部分:____和_____....

    [填空题]类是Java中的一种重要的复合数据类型,是组成Java程序的基本要素.一个类的实现包括两部分:____和_____. 更多相关问题 [名词解释] 观叶树木 [单选] 开花时有浓郁香气的树种是 ...

  5. java中没有直接调用matlab的接口函数

    java中没有直接调用matlab的接口函数,在通常的情况下我们是通过借用C++作为中间过程来实现的,使用C++主要是用c与matlab的结构实现c调用matlab的功能,将这些功能函数封装成dll文 ...

  6. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

    艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...

  7. 数据结构 --- c语言实现哈夫曼树

    哈夫曼树的结构体描述 #include <stdio.h> #include <stdlib.h> #include <assert.h> #define MAX ...

  8. 不属于JAVA类中的变量_在Java中,不属于整数类型变量的是( )。_学小易找答案...

    [单选题]整型数据类型中,需要内存空间最少的是( ). [单选题]下列语句序列执行后,i的值是( ). int i=16; do { i/=2; } while( i > 3 ); [填空题]布 ...

  9. java编码gbk的不可_解决 java “错误:编码GBK 的不可映射字符”

    在cmd控制台编译时报错:编码GBK的不可映射字符 检查: 1. 查本机区域语言设置中文没有问题 2. 此程序可以在eclipse上正常运行 右键properties-resource-text fi ...

最新文章

  1. sql 树状结构中知道 父节点与孙节点_集群环境中使用Zookeeper实现分布式幂等控制...
  2. webservice 之 Java CXF实战效果 RS WS(二)
  3. 干货 | 从零进阶数据分析学习资料汇总(限时福利)
  4. 【前端就业课 第一阶段】HTML5 零基础到实战(十一)canvas 基础
  5. python制作系统程序与html交互_python+html语音人物交互_flask后台与前端(html)交互的两种方法...
  6. 灾备中心服务器辐射,数据中心和灾备中心的相同点以及不同点
  7. ExcelHandle
  8. [C#-Util]-读写文件汉字乱码
  9. 【开源.NET】 分享一个前后端分离的轻量级内容管理框架
  10. 实现isprime函数python,怎样才能实现IsPrime()函数
  11. 探讨大数据时代如何规划智慧城市
  12. 微信视频号下载视频工具3.0,实测有效免费保存!
  13. 华为鸿蒙系统卡片,18个月不卡?这四款华为2年还流畅,支持鸿蒙OS
  14. 后端程序员生产力工具合集
  15. IBM PVM Study之--IBM PVM技术概述
  16. 华为机试题(python版本)
  17. 多线程有几种实现方法?同步有几种实现方法
  18. 用于通过声波捕获显示视觉,触觉和音频的全息显示(A volumetric display for visual, tactile and audio presentation using acous)
  19. 计算机考试反思1000,计算机考试作弊检讨书1000字.docx
  20. PCL入门系列一——PCL简介及PCL安装

热门文章

  1. 【转】Java中获取文件大小的正确方法
  2. Entity Framework ModelFirst尝试
  3. 把一些11年老博客上的文章转移过来了
  4. 分布式缓存,就该这样设计!
  5. 读写分离原来这么简单,一个小注解就够了
  6. 不称职Leader的10个特征,看看你中几条?
  7. RocketMQ消息丢失场景及解决办法
  8. 总监说,20、30岁年轻人面临人生抉择,早点知道这个法则,会少一些遗憾!
  9. 上线前一个小时,dubbo这个问题可把我折腾惨了
  10. 存储的瓶颈--大型网站技术演进思考