用C++实现文件压缩(哈弗曼编码).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
今天下午想把文件压缩写一下,因为我觉得这个还是比较锻炼技术的,对数据结构的要求应该比较高,权当练习了吧。 我采用的压缩方式是Huffman编码,不过比较囧的是,我拼写拼错了,我拼的是haffman,在后面的代码也是出尽洋相。 huffman是非常经典的一种编码形式,不过现在好像用的不多了,但是这种压缩编码的好处在于数据是无损压缩的,而且非常经典。 在构造huffman树,要做的步骤如下: 1 对文件的元素进行统计,其实就是个计数,我这里的元素是以字节为单位的,毕竟任何文件都可以转化为字节流的形式,处理起来方便的很。 2 然后对统计结果进行一次由小到大的排序,排序的key值就是元素出现的次数。 3?接着取出来排好序的数组的前两个元素,求和,并且再其左右子树上创建这两个元素的副本,然后再扔回首部,此时扔回数组中的,就是包含子树的节点了。在这里有个代码优化的小技巧,能在一定程度上提高效率,减少不必要的操作。 4 此时原来已经排好序的数组可能会遭到破坏,必须重新进行排序,因为数组大体是有序的,所以使用此时效率最高的一步插入排序,时间复杂度仅为O(n),我专门写了个函数来实现这个功能,并且进行了简单的测试。 5 然后再取出首部的前两个元素,重复上面步骤3,直到数组中的元素个数为1. 最终数组中仅存的元素,就是一棵二叉树的Root。 这样huffman树的构造就完成了。 在huffman树构造完成后,接着要做的就是根据huffman树获取其huffman编码,这个还是很简单的,就是使用递归,左树传入0,右树传入1,依次递归下去,遇到叶子节点就直接输出, 当然了,如果需要添加到某个数据结构中,只要在递归函数中给个参数接口,或者设置一个全局的容器,都能解决,换言之,类似于输出重定向。 这样上面的步骤完成后,就能很好的获取到huffman编码了。不过根据huffman编码结果将字符型的0,1写入到二进制中的0,1还有一些比较关键的函数需要处理,还没想到比较好的点子,不过最基础的蛮力方法肯定是能写的,但是,效率就不好说了。 另外获取huffman编码中,用于0,1传递的参数肯定是要用一个buffer的,这个buffer我用的是char字符串,现在有个问题就是,这个字符串的长度只要大于多少就能满足任何2GB以下文件的huffman编码呢? 我觉得这个题可以用来出一道笔试面试题,好好想一想就能想明白的。我的结果是 254,你觉得呢? 最近笔试面试写了不少题,都是被人考,现在我来考考别人~ 另外huffman的解码我也基本想到思路了,明天有时间的话就试着明天实现。 程序运行结果: 第一列是字符的数值,第二列是出现的次数,第三列是其huffman编码。 我这代码放眼望去,尽是被拼成了haffman的错误拼写…… 程序代码: 1 #include iostream 2 #include windows.h 3 #include vector 4 #include algorithm 5 using namespace std; 6 7 struct HaffmanStruct 8 { 9 //a small structure 10 HaffmanStruct():val(0),ncounts(0),lNext(NULL),rNext(NULL){} 11 bool operator (HaffmanStruct ); 12 bool operator (HaffmanStruct ); 13 void Reset(); 14 unsigned char val; 15 unsigned int ncounts; 16 //used for tree 17 HaffmanStruct * lNext; 18 HaffmanStruct * rNext; 19 }; 20 21 bool HaffmanStruct::operator (HaffmanStruct hs) 22 { 23 return ncounts hs.ncounts; 24 } 25 26 bool HaffmanStruct::operator (HaffmanStruct hs) 27 { 28 return hs.ncounts ncounts; 29 } 30 31 void HaffmanStruct::Reset() 32 { 33 val = 0; 34 ncounts = 0; 35 lNext = NULL; 36 rNext

文档评论(0)

ipad0c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档