zoukankan      html  css  js  c++  java
  • 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程序设计与数据结构教程(第二版)》学习指导

  • 相关阅读:
    Struts2结合Ajax实现登录
    Java读取Properties文件
    职责链模式
    javaScript初学者易错点
    2019 DevOps 必备面试题——DevOps 理念篇
    如何成为一名优秀的敏捷团队负责人
    为什么企业敏捷团队会失败
    伪装的敏捷,我好累
    CODING 告诉你如何建立一个 Scrum 团队
    十倍程序员的传说
  • 原文地址:https://www.cnblogs.com/niuzimeng/p/14160988.html
Copyright © 2011-2022 走看看