哈夫曼树与哈夫曼编码
2015-08-03 17:48
253 查看
哈夫曼编码使用在编码领域,可以有效的压缩存储空间,我们的程序分为两部分,第一部分是哈夫曼树的节点类,定义了它的码值,权重(即出现频率),左右孩子节点与双亲节点,初始化时后三者都是空的。
代码如下
之后我们编写一个工厂类,用于生成哈夫曼树与哈夫曼编码,只需输入一个由树节点组成的数组,即可以得到对应的哈夫曼编码,代码如下
代码如下
public class HTNode { private char data; private int weight; private HTNode parent; private HTNode left; private HTNode right; public HTNode(char data, int weight) { this.data = data; this.weight = weight; this.parent=null; this.left=null; this.right=null; } public char getData() { return data; } public void setData(char data) { this.data = data; } public int getWeight() { return weight; } public void setWeight(int weight) { this.weight = weight; } public HTNode getParent() { return parent; } public void setParent(HTNode parent) { this.parent = parent; } public HTNode getLeft() { return left; } public void setLeft(HTNode left) { this.left = left; } public HTNode getRight() { return right; } public void setRight(HTNode right) { this.right = right; } }
之后我们编写一个工厂类,用于生成哈夫曼树与哈夫曼编码,只需输入一个由树节点组成的数组,即可以得到对应的哈夫曼编码,代码如下
public class TreeBuilder { public static HTNode[] createHT(HTNode[] nodes){ int len=nodes.length*2-1; HTNode[] tree=new HTNode[len]; for(int i=0;i<nodes.length;i++){ tree[i]=new HTNode(nodes[i].getData(),nodes[i].getWeight()); } for(int i=nodes.length;i<len;i++){ tree[i]=new HTNode(' ', 0); } for(int i=nodes.length;i<len;i++){ int min1=9999; int min2=9999; int left=-1; int right=-1; for(int k=0;k<i;k++){ if(tree[k].getParent()==null){ if(tree[k].getWeight()<=min1){ min2=min1; right=left; min1=tree[k].getWeight(); left=k; } else{ if(tree[k].getWeight()<min2){ min2=tree[k].getWeight(); right=k; } } } } tree[i].setWeight(tree[right].getWeight()+tree[left].getWeight()); tree[i].setLeft(tree[left]); tree[i].setRight(tree[right]); tree[left].setParent(tree[i]); tree[right].setParent(tree[i]); } return tree; // for(int i=0;i<len;i++){ // System.out.print(tree[i].getWeight()+" "); // } } public static void createHTCode(HTNode[] nodes){ int len=nodes.length*2-1; HTNode[] tree=new HTNode[len]; tree=createHT(nodes); HTNode p=null; HTNode parent=null; StringBuilder[] codes=new StringBuilder[nodes.length]; for(int i=0;i<nodes.length;i++){ p=tree[i]; parent=p.getParent(); while(parent!=null){ if(parent.getLeft()==p){ if(codes[i]==null){ codes[i]=new StringBuilder("0"); } else{ // sb.Insert(0, "tt"); codes[i].insert(0, "0"); } } if(parent.getRight()==p){ if(codes[i]==null){ codes[i]=new StringBuilder("1"); } else{ codes[i].insert(0, "1"); } } p=parent; parent=p.getParent(); } } for(int i=0;i<codes.length;i++){ System.out.println(codes[i]); } } public static void main(String args[]){ HTNode n1=new HTNode('a',3); HTNode n2=new HTNode('b',4); HTNode n3=new HTNode('a',5); HTNode n4=new HTNode('a',6); HTNode[] nodes={n1,n2,n3,n4}; createHTCode(nodes); } }
相关文章推荐
- android与javascript的交互
- BNUOJ26429 Space Elevators(贪心)
- zoj 1366 Cash Machine 多重背包
- 一些专业学习的文档保存
- Servlet(及tomcat)之一
- PHP禁止浏览器缓存
- 论文提要“Pedestrian Detection aided by Deep Learning Semantic Tasks”
- linux sigaction函数(注册信号)使用
- Swift语法——Swift Sequences 探究
- 转 sql 时间转换格式 convert(varchar(10),字段名,转换格式)
- ASP.NET MVC在线预览Excel、Word、TXT、PDF文件
- jsp基础语法,用法
- Java网络编程(三)
- weblogic与tomcat服务器之间路径的问题
- 【leetcode】Gray Code
- Java 学习笔记--------------做背景图片
- 如何使用SQLAlchemy库写出防SQL注入的Raw SQL
- js判断是否移动设备
- A Simple Problem with Integers
- 使用opencv创建无边框窗口