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即可。

代码托管

原文地址:https://www.cnblogs.com/monsterhunter/p/11917304.html

时间: 2024-10-10 04:47:40

20182328哈夫曼编码测试的相关文章

20172327-哈夫曼编码测试

20172327-哈夫曼编码测试 哈夫曼编码与哈夫曼树 哈夫曼编码步骤 用Java实现哈夫曼编码 实验结果截图 码云链接 感悟 参考资料 原文地址:https://www.cnblogs.com/mrf1209/p/10111365.html

哈夫曼编码测试

哈夫曼编码实践 实践要求 设有字符集: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)对编码文件进行解码,输出一个解码后的文件 哈夫曼编码

基于python的二元霍夫曼编码译码详细设计

一.设计题目 对一幅BMP格式的灰度图像(个人证件照片)进行二元霍夫曼编码和译码 二.算法设计 (1)二元霍夫曼编码: ①:图像灰度处理: 利用python的PIL自带的灰度图像转换函数,首先将彩色图片转为灰度的bmp图像,此时每个像素点可以用单个像素点来表示. ②:二元霍夫曼编码: 程序流程图: 详细设计: 统计像素点频率,首先通过python自带的PIL库的图像像素点读取函数read()获取灰度图像的所有像素点,通过循环遍历每个像素点,将每个出现的像素点值以及其次数以键值对的形式放入到pyt

数据结构课程设计-哈夫曼编码译码

//******************************************** //程序功能:哈夫曼编码及译码 // //日期:2014年11月18 // //******************************************** #include<stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #define MAX 128 //叶子节点

贪心算法-霍夫曼编码

霍夫曼编码是一种无损数据压缩算法.在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度.期望值降低,从而达到无损压缩数据的目的.例如,在英文中,e的出现机率最高,而z的出现概率则最低.当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26).用普通的表示方法时,每个

基于哈夫曼编码的压缩解压程序

这个程序是研一上学期的课程大作业.当时,跨专业的我只有一点 C 语言和数据结构基础,为此,我查阅了不少资料,再加上自己的思考和分析,实现后不断调试.测试和完善,耗时一周左右,在 2012/11/19 完成.虽然这是一个很小的程序,但却是我完成的第一个程序. 源码托管在 Github:点此打开链接 一.问题描述: 名称:基于哈夫曼编码的文件压缩解压 目的:利用哈夫曼编码压缩存储文件,节省空间 输入:任何格式的文件(压缩)或压缩文件(解压) 输出:压缩文件或解压后的原文件 功能:利用哈夫曼编码压缩解

哈夫曼编码(最优前缀码)

作为哈夫曼树的一个重要应用,我们来介绍哈夫曼编码.在我的上一篇博文<树之哈夫曼树>中已经介绍了建立哈夫曼树的过程,而由哈夫曼树求得的编码为最优前缀码.每个叶子表示的字符的编码,就是从根到叶子的路径上的标号依次相连所形成的编码,显然这就是该字符的最优前缀码.所谓前缀码是指,对字符集进行编码时,要求字符集中任一字符的编码都不是其它字符的编码的前缀,比如常见的等长编码就是前缀码.所谓最优前缀码是指,平均码长或文件总长最小的前缀编码称为最优的前缀码(这里的平均码长相当于码长的期望值). 我们知道,变长

java使用优先级队列实现哈夫曼编码

思路: 构建小根堆 根据小根堆实现哈夫曼树 根据哈夫曼树对数据进行编码 代码实现如下: /** * @Author: DaleyZou * @Description: 使用java实现一个哈夫曼编码的小程序 * @Date: Created in 19:45 2018-9-27 * @Modified By: */ public class HuffmanCode { private class Node implements Comparable<Node>{ char ch; // 字符

20182327 2019-2020 《程序设计与数据结构》哈夫曼编码测试报告

20182327 2019-2020 <程序设计与数据结构>哈夫曼编码测试报告 课程:<程序设计与数据结构> 班级: 1823 姓名:赵天昊 学号:20182327 实验教师:王志强 实验日期:2019年11月17日 必修/选修: 必修 教材中的哈夫曼树 1.在计算机数据处理中,哈夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字