zoukankan      html  css  js  c++  java
  • 20182324 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼编码测试报告

    20182324 2019-2020-1 《数据结构与面向对象程序设计》哈夫曼编码测试报告

    课程:《程序设计与数据结构》
    班级: 1823
    姓名: yyh
    学号: 20182324
    课程教师:王志强
    测试日期: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)对编码文件进行解码,输出一个解码后的文件

    • (5)撰写博客记录实验的设计和实现过程,并将源代码传到码云

    • (6)把实验结果截图上传到云班课

    2. 实验过程及结果

    • (1)事先准备好一个包含 26 个英文字母的文本文件,相对路径为srcHuffmanTree.txt,使用读写流将其内容读出并存储英文字母出现的个数。

        File file = new File("src\HuffmanTree.txt");
        if (!file.exists())
        {
            file.createNewFile();
        }
        BufferedReader br = new BufferedReader(new FileReader(file));
        String s;
        String message = "";
      
        while((s = br.readLine()) != null)
        {
            message += s; 
        }
      
        String[] result = message.split("");
        for (int n = 0;n < result.length; n++){
            for (int i = 0; i < 27; i++){
                if (result[n].equals(list.get(i))){
                    number[i] += 1;
                }
            }
        }
      
    • (2)构造 HuffmanTree

        while (nodes.size() > 1)
        {
            Collections.unmodifiableList(nodes);
      
            HuffmanNode left = nodes.get(nodes.size() - 2);
            left.setCode("0");  //左子树置为 0
            HuffmanNode right = nodes.get(nodes.size() - 1);
            right.setCode("1");  //右子树置为 1
            HuffmanNode parent = new HuffmanNode(null, left.getLength() + right.getLength());
            parent.setLeft(left);
            parent.setRight(right);
            nodes.remove(left);
            nodes.remove(right);
            nodes.add(parent);
        }
      
    • (3)将 26 个英文字母出现的次数与文本总字数相除,使用DecimalFormat规范小数位,输出各字母出现的概率。

        List<HuffmanNode> nodeList = new ArrayList<HuffmanNode>();
        DecimalFormat df = new DecimalFormat( "0.0000000");
        double wei;
        double sum = result.length;
      
        for(int i = 0;i < 27;i++)
        {
            wei = ((double) number[i]/sum);
            System.out.println(list.get(i) + "出现" + number[i] + "次,概率为" + df.format(wei));
            nodeList.add(new HuffmanNode(list.get(i),number[i]));
        }
      
    • (4)将 Huffman 树中的内容进行编码。

        List<HuffmanNode> list = new ArrayList<HuffmanNode>();
        Queue<HuffmanNode> queue = new ArrayDeque<HuffmanNode>();
      
        if (root != null)
        {
            queue.offer(root);
            root.getLeft().setCode(root.getCode() + "0");
            root.getRight().setCode(root.getCode() + "1");
        }
      
        while (!queue.isEmpty())
        {
            list.add(queue.peek());
            HuffmanNode node = queue.poll();
            if (node.getLeft() != null)
            {
                node.getLeft().setCode(node.getCode() + "0");
            }
            if (node.getRight() != null)
            {
                node.getRight().setCode(node.getCode() + "1");
            }
      
            if (node.getLeft() != null)
            {
                queue.offer(node.getLeft());
            }
      
            if (node.getRight() != null)
            {
                queue.offer(node.getRight());
            }
        }
      
    • (5)对源文件进行编解码操作,并分别输出结果。

        HuffmanTree huffmanTree = new HuffmanTree();
        HuffmanNode node = createTree(nodeList);
        List<HuffmanNode> inlist = new ArrayList<HuffmanNode>();
        inlist = huffmanTree.breadth(node);
      
        String[] name = new String[number.length];
        String[] code = new String[number.length];
      
        File file1 = new File("src\Huffman编码文件.txt");
        File file2 = new File("src\Huffman解码文件.txt");
        FileWriter fileWriter1 = new FileWriter(file1);
        FileWriter fileWriter2 = new FileWriter(file2);
      
    • 最终运行结果如图所示:

  • 相关阅读:
    git 的常用命令(未完待补充)
    Mysql占用内存过高参数优化
    mysql安全基线设置
    redis安全基线设置
    centos7安全基线设置
    检查shell脚本
    redis安装和配置
    TIME_WAIT状态全是3306解决办法
    PHP message: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted 错误
    tcp的三次握手和四次挥手(二)
  • 原文地址:https://www.cnblogs.com/lolipop2019/p/11918803.html
Copyright © 2011-2022 走看看