- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 《新闻宣传培训》ppt课件完整版.pptx VIP
- 国投证券-A股三件套:俯卧撑、杠铃与跷跷板.pdf
- 教科版科学三年级上册教学计划.docx
- 新北师大版七年级上册生物全册教案(2024年秋季新版教材).pdf
- 代谢相关(非酒精性)脂肪性肝病防治指南(2024年版) .pdf VIP
- 2025年中国电子级氯化钡行业市场运行态势及前景战略研判报告.docx
- 机场航站楼空调水系统深化设计方法与案例研究.pdf VIP
- 代谢相关(非酒精性)脂肪性肝病防治指南(2024年版)解读.pptx VIP
- 代谢相关(非酒精性)脂肪性肝病防治指南(2024年版).pptx VIP
- PeekABoo躲猫猫单词大书歌词及对话内容全.xlsx VIP
文档评论(0)