第六周作业——编码实现哈夫曼树
来源:互联网 发布:pc录屏软件 编辑:程序博客网 时间:2024/06/10 13:10
package haff;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.LinkedList;
public class Haff {
public static void main(String[]arg)
{
List<TreeNode> set = makeNodeSet(); //生成节点的集合set,每个字母对应一个节点
while((set.size())>1) //循环过后,set里将只含有哈夫曼树的根节点,也就是生成哈夫曼树
{
TreeNode minNode1 = deletemin(set); //拿出set里频率最小的两个节点minNode1和minNode2
TreeNode minNode2 = deletemin(set); //不再放回set中
insert(minNode1,minNode2,set); //生成节点minNode1和minNode2的父节点,并放入set中
}
TreeNode haffRoot = set.get(0); //拿到根节点
//输出各个字符的编码,得到集合setCode,其元素是含字母及其编码的TreeNode对象
List<TreeNode> setCode = SearchForCode.makeCode(haffRoot,"","");
CodeSave(setCode); //字母编码,保存在文本char&&code中
}
/************* 子函数 **************************************************************/
static List<TreeNode> makeNodeSet()
{
List<TreeNode> set = new LinkedList<TreeNode>();
set.add(new TreeNode("\40",18.3));
set.add(new TreeNode("e",10.2));
set.add(new TreeNode("t",7.7));
set.add(new TreeNode("a",6.8));
set.add(new TreeNode("o",5.9));
set.add(new TreeNode("i",5.8));
set.add(new TreeNode("n",5.5));
set.add(new TreeNode("s",5.1));
set.add(new TreeNode("h",4.9));
// System.out.println("e"+"\40"+"e");
set.add(new TreeNode("r",4.8));
set.add(new TreeNode("d",3.5));
set.add(new TreeNode("l",3.4));
set.add(new TreeNode("c",2.6));
set.add(new TreeNode("u",2.4));
set.add(new TreeNode("m",2.1));
set.add(new TreeNode("w",1.9));
set.add(new TreeNode("f",1.8));
set.add(new TreeNode("g",1.7));
set.add(new TreeNode("y",1.6));
set.add(new TreeNode("p",1.6));
set.add(new TreeNode("b",1.3));
set.add(new TreeNode("v",0.9));
set.add(new TreeNode("k",0.6));
set.add(new TreeNode("j",0.2));
set.add(new TreeNode("x",0.2));
set.add(new TreeNode("q",0.1));
set.add(new TreeNode("z",0.1));
return set;
}
static TreeNode deletemin(List<TreeNode> setPara)
{
List<TreeNode> set = setPara;
TreeNode a = null;
TreeNode b = null;
//for(int i=0;i<(set.size());)
if(set.size()>1)
for(int j = 1;j<(set.size());j++)
{
a = set.get(0);
b = set.get(j);
if(a.f > b.f){ a = b;}
}
if(set.size()==1)
{
a = set.get(0);
set.remove(a);
return a;
}
set.remove(a);
//System.out.println("是否空位:"+set.get(0).s);
return a;
}
static void insert(TreeNode minNodePara1,TreeNode minNodePara2,List<TreeNode> setPara)
{
TreeNode minNode1 = minNodePara1;
TreeNode minNode2 = minNodePara2;
List<TreeNode> set = setPara;
double f = minNode1.f+minNode2.f;
TreeNode FatherNode = new TreeNode(null,f);
FatherNode.left = minNode1;
FatherNode.right = minNode2;
set.add(FatherNode);
}
static void CodeSave(List<TreeNode> setCode)
{
File file = new File("src\\char&&code.txt");;
BufferedWriter out = null;
try{
out = new BufferedWriter(new FileWriter(file));
}catch(IOException e){e.printStackTrace();}
try {
for(int i = 0;i<setCode.size();i++)
{
out.write(setCode.get(i).s);
out.write(" "); //一个空格
out.write(setCode.get(i).p);
out.newLine();
}
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package haff;
import java.util.List;
import java.util.LinkedList;
public class SearchForCode {
static List<TreeNode> set = new LinkedList<TreeNode>();
static List<TreeNode> makeCode(TreeNode t,String preP,String num)
{
if(t!=null)
{
if(t.s!=null)
{
t.p = t.p+preP+num;
System.out.println(t.s+" 的编码是 "+t.p);
set.add(t);
}
if(t.s==null)
{
t.p=t.p+preP+num;
makeCode(t.left,t.p,"0");
makeCode(t.right,t.p,"1");
}
}
return set;
}
}
package haff;
public class TreeNode {
String s = null; //字母
String p = ""; //编码
double f = 0; //频率
TreeNode left = null;
TreeNode right = null;
TreeNode(String s,double f){ this.s = s;this.f = f;}
}
- 第六周作业—哈夫曼编码实现
- 第六周作业——编码实现哈夫曼树
- 第六周作业2——哈夫曼编码实现
- 第六周作业2——哈夫曼编码实现
- 第六周作业——哈夫曼编码
- 第六周作业——1.利用哈夫曼编码英文字母表,2哈夫曼编码实现
- 第六周作业——1.利用哈夫曼编码英文字母表,2哈夫曼编码实现
- 第六周作业——利用哈夫曼编码英文字母表
- 第六周作业——利用哈夫曼编码英文字母表
- 第六周作业——利用哈夫曼编码英文字母表
- 第六周作业——利用哈夫曼编码英文字母表
- 第六周作业——利用哈夫曼编码英文字母表
- 第六周作业——利用哈夫曼编码英文字母表
- 第六周作业—利用哈夫曼编码英文字母表
- 第六周作业—利用哈夫曼编码英文字母表
- 第六周作业3——kruskal算法实现
- 第六周作业--利用哈夫曼树编码英文字母表
- 第六周作业1——利用哈夫曼编码英文字母表】
- thinking in java Generics2
- 金融校园通
- 患伺靥夜厥伦椒狄端刚跃谔炮琢啬
- Skyline_Analysis_CreateFlood
- Struts2输入校验
- 第六周作业——编码实现哈夫曼树
- poj 1556 The Doors 线段相交,最短路
- 如何启动、关闭和设置ubuntu防火墙
- 写着玩玩的密码验证
- 土法炼钢:服务器定时汇报IP地址给我
- 晨跑感悟:三快三爽三熬
- 不高兴的小明
- [leetcode]Maximum subarray
- EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)