20192328牛梓萌 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼编码实践
课程:《程序设计与数据结构》
班级: 1923
姓名: 牛梓萌
学号:20192328
实验教师:王志强
实验日期:2019年12月19日
必修/选修: 必修
1.实验内容
设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。
给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。
并完成对英文文件的编码和解码。
要求:
(1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
(2)构造哈夫曼树
(3)对英文文件进行编码,输出一个编码后的文件
(4)对编码文件进行解码,输出一个解码后的文件
(5)撰写博客记录实验的设计和实现过程,并将源代码传到码云
(6)把实验结果截图上传到云班课
2. 实验过程及结果
构造哈夫曼树
将老师发布到云班课的哈夫曼树代码稍作修改即可
对于测试方面
·读取和写文件的操作
(准备三个文件,一个用来读入文件中的内容,一个用来编码,一个用来解码)
File file = new File("/Users/haha/Desktop/Huffman.txt");
if(!file.exists()){
file.createNewFile();
}
File file2 = new File("/Users/haha/Desktop/enHuffman.txt");
Writer writer = new FileWriter(file2);
writer.write(result1);
writer.close();
File file3 = new File("/Users/haha/Desktop/deHuffman.txt");
Writer writer1 = new FileWriter(file3);
writer1.write(result2);
writer.close();
·对于文本读写
File file = new File("/Users/haha/Desktop/Huffman.txt");
if(!file.exists()){
file.createNewFile();
}
Reader reader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(reader);
String temp = bufferedReader.readLine();
·对于频率的计算
for (int j = 97; j <= 122; j++) {
int number = 0;//给字母计数
for (int m = 0; m < characters.length; m++) {
if (characters[m] == (char) j) {
number++;
}
frequency[j - 97] = (float) number / characters.length;
}
}
·对于编码
String result1 = "";
List<HuffNode> temp1 = breadthFirstTraversal(root);
for (int i = 0; i < characters.length; i++) {
for (int j = 0; j < temp1.size(); j++) {
if (characters[i] == temp1.get(j).getData()) {
result1 += temp1.get(j).getCodenumber();
}
}
}
·对于解码
String result2 = "";
String current="";
while(secretText.size()>0) {
current = current + "" + secretText.get(0);
secretText.remove(0);
for (int p = 0; p < newlist1.size(); p++) {
if (current.equals(newlist1.get(p))) {
result2 = result2 + "" + newlist.get(p);
current="";
}
·实验结果
其他(感悟、思考等)
对于哈夫曼树的编写首先要理解哈夫曼树的形成过程,参考老师的代码给了很大的帮助,在此基础上再增加对于文件的读取等操作。
参考资料
《Java程序设计与数据结构教程(第二版)》
《Java程序设计与数据结构教程(第二版)》学习指导