huffman编码与解码实现文件压缩与解压缩(编辑修改稿)内容摘要:

等长编 码所对应的编码二叉树也可以直接看出,任何一个叶子结点都不可能是其它叶子结点的双亲,也就是说,只有当一个结点是另一个结点的双亲时,该结点的字符编码才会是另一个结点的字符编码的前缀。 为了使不等长编码为前缀编码,可用该字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得文件的最短长度,特将每个字符的出现频率作为字符结点的权值赋予该结点上,求出此树的最小带权路径长度就等于文件的最短长度。 因此,对文件进行压缩,就可以转化字符集中的所有字符作为叶子结点,字符出现的频率作为权值所产生的 huffman 树的问题。 基 本思路大致有了后,接下来是对程序的编写工作,程序初步形成后,对其测试,发现了一些变量还没有声明的错误,对遗漏的变量进行了声明后,再次调试,发现一个比较大的问题,就是字符都能读入,但是不能进行编码,也即不能构造 huffman 树,最后经过检查发现原来是结点方面存在问题,最后加入sum=2*count1。 语句,问题得到解决。 (该语句的作用是:例如提供了 3 个权值不同的结点,现在要构造 huffman 树,那就需要 5 个结点。 ) 五、用户使用说明 用户运行本程序前,首先要在起工程文件下建立一个名字为 文本文档,再运行本程序后,第一步,按任意键来读取建立的 文本文档 ,再据程序中提示完成第二步操作,也即是讲压缩的文件以 Huffman 编码放入一个由用户自己建立的文本文档中,接着再根据提示完成第三步操作,即对要压缩的文件解压后放入由用户建立的任意名的文本文档中,由此完成操作。 六、测试结果 数据结构与算法课程设计 被编码(部分字符): 被解码(部分文件): 数据结构与算法课程设计 七、参考书目 [1]徐孝凯 .数据结构实用教程 (c/c++描述 )[M].北京:清华大学出版社,2020 年 6 月 [2]郑莉等 .c++语言程序设计 (第三版 )[M].北京:清华大学出版社, 2020 年12月 八、附录 includeiostream includefstream includestring includeiomanip using namespace std。 string remfile[600000]。 //存放原文件字符的数组 int remcount=0。 //记录元素个数 float bitecount=0。 //记录二进制码的个数 struct huffchar{ //存放读 入字符的类 int count。 //字符出现的个数 char data。 //字符 }。 int count=1。 //记录 huff 数组中字符实际出现的个数 huffchar huff[1000]。 //类的对象 //文件读入部分和统计字符出现的频率 bool char_judge(char c)//判断字符出现的函数 { 数据结构与算法课程设计 for(int i=1。 i=count。 i++) if(huff[i].data==c){huff[i].count++。 return true。 }//如果出现过,出 现的频数加1 return false。 } void char_add(char c)//添加新出现的字符; {huff[count].data=c。 huff[count++].count++。 //个数增加 } //文件的读取 void read_file_count() {char c。 ifstream infile。 ()。 //打开 文件 if(!infile)//检查文件是否打开。 {cout不能打开 文件。 //输出文件未打开的标志 exit(0)。 } cout读入的文件中的内容为: endl。 while((c=())!=EOF)//EOF 是文件结束的标志 {remfile[++remcount]=c。 //recount 记录元素个数 if(!char_judge(c)) char_add(c)。 } coute。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。