20182328哈夫曼编码测试
哈夫曼编码测试
班级: 1823
姓名:张景昊
学号:20182328
实验教师:王志强
实验日期:2019年11月22日
必修/选修: 必修
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)对编码文件进行解码,输出一个解码后的文件
2. 实验思路
1、首先要把字符集从文件中读出来,并保存在一个数组里面。这一步暂时想用IO流来实现。
2、紧接着是去计算每一个字符出现的频率。初步想用嵌套循环来实现,并把出现的概率存在另一个数组中。
3、然后通过这两个步骤,构建出一个二维数组,每一个字符对应一个出现的频率,再写一个compareTo方法,对该二维数组的第二个元素进行排序,得到从小到大的一个顺序。
4、用构造哈夫曼树的方法,依次递归,找到最小的两个元素然后相加构成一个子树,直到最终的和为1结束。
5、通过遍历哈夫曼树,得到每一个元素的编码值,并存进一个新的数组中。
6、对从文件中读出的数据进行遍历,并与新数组中的字符进行比较,如若相等,则转换为对应的变码。直至遍历结束,哈夫曼编码完成。
7、最后进行哈夫曼树的解码,完成实验。
3. 实验解决过程
- 编写读文件的代码:
File file = new File("C:\Users\hp\IdeaProjects\untitled38\src\\outfile.txt");
FilereadputStream stream = new FilereadputStream("file")
String a = HuffmanMakeCode.makecode(stream);
- 编写写文件的代码
File file = new File("C:\Users\hp\IdeaProjects\untitled38\src\\outfile.txt");
Writer out = new FileWriter(file);
out.write(result);
out.close();
从把字符合集从文件中读出来,并保存在一个数组里面。
-
然后进行计算每一个字符出现的频率,用循环来实现,并把计算出的概率存在另一个新建的数组中。
-
构建出两个一维数组,每一个字符对应一个出现的频率。其中一个存放每个字母,另一个数组存放每个字母出现的次数
-
对英文文件进行编码,输出一个编码后的文件,并构建列表存储每个结点的编码,最后通过循环输出编码。
-
再写入文件,对英文文件进行解码,输出一个解码后的文件。
String temp1 = "";
String temp="";
while(secretText.size()>0) {
temp = temp + "" + secretText.get(0);
secretText.remove(0);
for (int p = 0; p < newlist1.size(); p++) {
if (temp.equals(newlist1.get(p))) {
temp1 = temp1 + "" + newlist.get(p);
temp="";
}
}
System.out.println("文件解码结果为: "+temp1);
运行截图
实验问题
-
问题1:循环溢出,出现多余的循环结果。
-
问题1解决方案:循环控制次数减1即可。