- 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压缩和解压
Huffman压缩和解压
一、?需求分析
1. 本演示程序中,模拟的是小写26个英文字母的Huffman压缩,字母小随机函数随机产生,后统计字母个数建立Huffman树,用建立Huffman树将字母转为二进制流,再将二进制流每次分8个转为一个Unsigned Char写入物理内存!
2. 解压时建立同样的Huffman树或读取已保存的Huffman树,通过将读取的Unsigned Char转为比特流,再由比特流得到原被压缩的字母
3. 程序执行的命令有:随机文件的产生,文件统计,Huffman树的建立,压缩,解压,程序的运行过程和其它信息的文件存储!
4. 程序测试:运行程序,产生随机文件input.txt,压缩时得到的比特流bytes.txt,压缩文件compress.txt,解压时到得的比特流uncompress.txt,解压后文件output.txt和程序的运行过程文件Run.txt,其中红色文件为可无文件
二、?概要设计
1. 为达到压缩效果,采用Huffman树来进行编码压缩
2. Huffman编码后若直接保存比特流至txt将达不到压缩的效果,因此建议将比特流转为Unsigned char 来间接存储以达到明显的压缩效果
3. 解压时因用到之前的Huffman树,因此在压缩时有必要保存树的状态
4. Huffman树在压缩时直接使用对应编码即可,在解压时通过遍历树来得到被编码的字母
三、?详细设计
1. 树结构体的定义和全局变量的定义:
typedef struct HTNode{/*Huffman Tree 的结构定义*/
??? unsigned int weight;
??? unsigned int parent, lchild, rchild;
}HTNode,* HuffmanTree;
typedef char** HuffmanCode;/*指向字符指针的指针的数据的定义*/
int stat[27];/*存储总数,存储26个字母出现的次数*/
HuffmanTree HT;
??????? HuffmanCode HC;
2. 随机文件的产生函数:
void CreatFile(){/*自动产生文件*/
??? FILE *Fopen,*Fout;
??? int i;
??? srand( (unsigned)time(NULL));
??? Fout=fopen(./Run.txt,w);
??? fprintf(Fout,NO.1: Creating a file by rand()n);
??? Fopen = fopen(./input.txt, w);
??? for(i=0; i10000; i++){
??????? char ch=(char)(97+rand()%26);
??????? fputc(ch, Fopen);
?????? }
??? fclose(Fopen);
??? fclose(Fout);
}
3. 字母个数的统计:
void ReadStat(char *Filename){/*每个字符出现的次数统计*/
??? int c;
??? FILE *Fopen=fopen(Filename, r);
??? while((c=fgetc(Fopen))!=EOF){
??????? stat[c%96]++;
??????? stat[0]++;
??? }
}
4. 选择HT[1…i-1]中Parent为0且Weight最小的一个点的函数:
void Select(HuffmanTree HT, int d, int *s){
??? int temp=0,i;
??? for(i=1; i=d; i++){
?????????? if(HT[i].parent!=0)
????????????????? continue;
?????????? if(temp==0)
????????????????? temp=i;
?????????? else if(HT[temp].weightHT[i].weight)
????????????????? temp=i;
??? }
??? *s=temp;
}
5. Huffman树的建立函数:
void HuffmanCoding(int* w, int n){
??? int m= 2*n-1;
??? int i, s1, s2, start;
??? unsigned int c, f;
??? char *cd;
??? if(n=1)
?????????? return;
??? HT=(HTNode*)malloc((m+1)*sizeof(HTNode));/*0号单元未用*/
??? f
您可能关注的文档
最近下载
- 海信日立空调工程安装操作标准.pdf VIP
- 2021-2027全球及中国红外探测器芯片行业研究及十四五规划分析报告.docx VIP
- 2025-2026学年小学美术二年级上册(2024)岭南版(2024)教学设计合集.docx
- 02s404防水套管图集.docx VIP
- NASA认知负荷评估量表(TLX).docx VIP
- 20以内加减法练习题(a4).pdf VIP
- 光纤通信考试题及答案.doc VIP
- 天津市南开区2024-2025学年九年级上学期期末语文试题(含答案).pdf VIP
- 2025年公路水运安全员证考试题库答案.docx
- (推荐!)《ISO 37001-2025反贿赂管理体系要求及使用指南》专业深度解读和应用培训指导材料之7:9绩效评价(2025A1).docx VIP
文档评论(0)