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();

从把字符合集从文件中读出来,并保存在一个数组里面。

  • 然后进行计算每一个字符出现的频率,用循环来实现,并把计算出的概率存在另一个新建的数组中。
    20182328哈夫曼编码测试_第1张图片

  • 构建出两个一维数组,每一个字符对应一个出现的频率。其中一个存放每个字母,另一个数组存放每个字母出现的次数

  • 对英文文件进行编码,输出一个编码后的文件,并构建列表存储每个结点的编码,最后通过循环输出编码。

  • 再写入文件,对英文文件进行解码,输出一个解码后的文件。
   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:循环溢出,出现多余的循环结果。
    20182328哈夫曼编码测试_第2张图片

  • 问题1解决方案:循环控制次数减1即可。
    20182328哈夫曼编码测试_第3张图片

代码托管

你可能感兴趣的:(20182328哈夫曼编码测试)