20192328牛梓萌 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼编码实践

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程序设计与数据结构教程(第二版)》学习指导

posted @ 2020-12-19 20:50  20192328牛梓萌  阅读(88)  评论(0编辑  收藏  举报