哈夫曼编码课程设计报告
更新时间:2023-09-22 10:47:01 阅读量: 经管营销 文档下载
数据结构 课程设计报告
课 题: 专业班级: 学 号: 姓 名: 指导教师:
1 课程设计的目的和意义
在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。
哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。
通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。
1
2.需求分析
课 题:哈夫曼编码译码器系统
问题描述:打开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们
作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。
问题补充:1. 从硬盘的一个文件里读出一段英语文章;
2. 统计这篇文章中的每个字符出现的次数; 3. 以字符出现字数作为权值,构建哈夫曼树
4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破
译。
具体介绍:在本课题中,我们在硬盘D盘中预先建立一个file.txt文档,在里面
编辑一篇文章(大写)。然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼树。然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码写入文件。
测试数据:例如从文本中读到文章为:IAMASTUDENT。
则效果如下:
读出文本为:IAMASTUDENT
字符A次数:2 字符D次数:1 字符E次数:1 字符I 次数:1 字符M次数:1 字符N 次数:1 字符S 次数:1 字符T次数:2 字符U次数:1
输出编码:000 101 001 101 011 110 100 1110 1111 010 110
Press any key to continue
2
3
3 系统(项目)设计
(1)设计思路及方案
本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为(W1*L1)+(W2*L2)+?+(Wi*Li)。若将此对应到二叉树上,Wi为叶结点,Li为根结点到叶结点的路径长度。那么,(W1*L1)+(W2*L2)+?+(Wi*Li)恰好为二叉树上带权路径长度。
因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。
该系统将实现以下几大功能:从硬盘读取字符串,建立哈夫曼树,输出哈夫曼树的存储结构的初态和终态,输出各种字符出现的次数以及哈夫曼编码的译码等。
(2)模块的设计及介绍
1从硬盘读取字符串 fileopen(参数) {
实现命令; 打印输出; }
2建立HuffmanTree 通过三个函数来实现: void select_min(参数) {
初始化; for
{
接受命令;
4
4 系统实现
各模块关键代码及算法的解释: ① 主调函数
代码解释:这是main函数里的各个函数调用情况。 fileopen(string); //从硬盘中读取文件
num=tongji(string,cishu,str); //统计字符种类及各类字符出现
的频率
Create_huffmanTree(HT,HC,cishu,str);//建立哈夫曼树 Huffman_bianma(HT,HC); //生成哈夫曼编码
② 建立HuffmanTree
代码解释:该函数为在ht[1....k]中选择parent为0且权值最小的两个根结点的算法,其序号为s1和s2。
void select_min(HuffmanTree T,int k,int &x1,int &x2) {
int i,j; int min1=1000;
for(i=1;i<=k;i++)
if(T[i].weight x1=j;min1=1000; for (i=1;i<=k;i++) if(T[i].weight j=i; min1=T[i].weight; 10 j=i; min1=T[i].weight; } } x2=j; 代码解释:下面函数用来统计字符串中各种字母的个数以及字符的种类。当字符在A和Z之间时即被计数,并用str[j]保存字母到数组中,用cnt[j]统计每种字符个数。j返回总共读取的字符数目。 int tongji(char *s,int cishu[],char str[]) { int i,j,k; char *p; int t[27]; for(i=1;i<=26;i++) t[i]=0; for(p=s; *p!='\\0';p++) { } for(i=1,j=0;i<=26;++i) } if(t[i]!=0 ) { return j; j++; str[j]=i+64; cishu[j]=t[i]; if(*p>='A'&&*p<='Z') k=*p-64; t[k]++; 11 代码解释:下面函数用来构造哈夫曼树HT。首先初始化哈夫曼树,然后输入前面统计的各结点的权值,用for循环来构造哈夫曼树。 void Create_huffmanTree(HuffmanTree ht,HuffmanCode hc,int cishu[],char str[]) { //生成哈夫曼树HT int i,s1,s2; for(i=0;i<2*num-1;i++) { } for(i=1;i<=num;i++) //输入num个叶结点的权值 ht[i].weight=cishu[i]; ht[i].left=0; ht[i].right=0; ht[i].parent=0; ht[i].weight=0; for(i=num+1;i<=2*num-1;i++) { //选择parent为0且权值最小的两个根结点,其序号为s1和s2,i 为双亲 } } for(i=0;i<=num;i++) hc[i].ch=str[i]; //字符的种类 select_min(ht,i-1,s1,s2); ht[s1].parent=i;ht[s2].parent=i; ht[i].left=s1; ht[i].right=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; i=1;while(i<=num) printf(\字符%c次数:?\\n\ 12 ③ 生成Huffman编码并写入文件 代码解释:根据哈夫曼树T求哈夫曼编码H。 void Huffman_bianma(HuffmanTree T,HuffmanCode H) //根据哈夫曼树T求哈夫曼编码H { int child,parent,i; //child和parent分别指示 t中孩子和双亲 符 for(i=1;i<=num;++i) { while((parent=T[child].parent)>0) //直至t[child]是树根为止 { //若t[child]是t[parent]的左孩子,start=num; //初始位置 child=i; //从叶子结点到根结点进行遍历 char code[n]; //存放编码 int start; //指示码在code中的起始位置 code[num]='\\0'; //最后一位(第num个)放上串结束 则生成0;否则生成1 } } } strcpy(H[i].co,&code[start]); H[i].len=num-start; if(T[parent].left==child) code[--start]='0'; else code[--start]='1'; child=parent; 13 代码解释:对str所代表的字符串进行编码并写入文件。将翻译的二进制码写入文本文件。 void coding(HuffmanCode hc ,char *str) { //对str所代表的字符串进行编码 并写入文件 } int i,j; FILE *fp; fp=fopen(\while(*str) { for(i=1;i<=num;i++) if(hc[i]. ch==*str){ } str++; for(j=0;j<=hc[i].len;j++) fputc(hc[i].co[j],fp); break; }fclose(fp); 14 结点的权值 ht[i].weight=cishu[i]; for(i=num+1;i<=2*num-1;i++) { //选择parent为0且权值最小的两个根结点,其序号为s1和s2,i为双亲 select_min(ht,i-1,s1,s2); ht[s1].parent=i;ht[s2].parent=i; ht[i].left=s1; ht[i].right=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; } for(i=0;i<=num;i++) hc[i].ch=str[i]; //字符的种类 i=1;while(i<=num) printf(\字符%c次数:?\\n\ } void Huffman_bianma(HuffmanTree T,HuffmanCode H) //根据哈夫曼树T求哈夫曼编码H { int child,parent,i; //child和parent分别指示t中孩子和双亲 char code[n]; //存放编码 int start; //指示码在code中的起始位置 code[num]='\\0'; //最后一位(第num个)放上串结束符 for(i=1;i<=num;++i) { start=num; //初始位置 child=i; //从叶子结点到根结点进行遍历 while((parent=T[child].parent)>0) //直至t[child]是树根为止 { //若t[child]是t[parent]的左孩子,则生成0;否则生成1 if(T[parent].left==child) code[--start]='0'; else code[--start]='1'; child=parent; } strcpy(H[i].co,&code[start]); 20 H[i].len=num-start; } } void coding(HuffmanCode hc ,char *str) { //对str所代表的字符串进行编码 并写入文件 } void output() //输出编码 { printf(\} int fileopen(char string[]) int i,j; FILE *fp; fp=fopen(\while(*str) { for(i=1;i<=num;i++) if(hc[i]. ch==*str){ for(j=0;j<=hc[i].len;j++) fputc(hc[i].co[j],fp); break; } str++; }fclose(fp); FILE *fp; char ch; if((fp=fopen(\{ printf(\ exit(0); } printf(\编码为:\\n\ch=fgetc(fp); while(!feof(fp)) { putchar(ch); ch=fgetc(fp); } //读入文件 21 { FILE *fp; if((fp=fopen(\数据结构课程设计\\\\file.txt\ printf(\ } //主函数 void main() { HuffmanTree HT; scanf(\ { printf(\不能打开文件!\\n\ exit(1); } while(fgets(string,100,fp)!=NULL) fclose(fp); return 0; char string[100]; char *s,str[27]; int cishu[27]; HuffmanCode HC; int x; printf(\ printf(\ 哈夫曼编码 *****\\n\ printf(\while(1) { printf(\请选择\ printf(\开始\\n\ printf(\输出各字符统计个数\\n\ printf(\编码\\n\printf(\输出编码\\n\ printf(\退出\\n\ switch(x) 22 fileopen(string); 种类及各类字符出现的次数 成哈夫曼编码 件 } { case 1: printf(\读出文本为:\\n\ break; case 2: num=tongji(string,cishu,str); //统计字符的 Create_huffmanTree(HT,HC,cishu,str); break; case 3: Huffman_bianma(HT,HC); //生 coding(HC,string); //建立电文哈夫曼编码文 break; case 4: output(); break; case 5: exit(0); free(HT); default: printf(\输入错误!\\n\ continue; } } 23
正在阅读:
哈夫曼编码课程设计报告09-22
乙型肝炎的实验室诊断12-30
加工贸易存在的问题及对策分析05-07
一年级语文期末试卷(4)06-29
三年级下册英语一课一练-Unit 1 Lesson 3 Fish and Birds∣冀教版 (三起)(含答案)09-02
赢在大卖场,供应商商超渠道运作05-21
模拟电子技术习题06-26
如何绘制思维导图10-20
- 教育局拟征求中考升学奖励制度
- 2020房地产销售主管年终工作总结
- 虚拟多台位互感器检定装置投资项目可行性分析
- 车间工人辞职报告范本
- 溴投资项目可行性分析
- 改名字申请书怎么写
- 忧与爱作文素材
- 溴苯腈投资项目可行性分析
- 2020清华大学考研复试时间:3月6日至22日
- 2020年蚌埠高考查分系统网址
- 2020年二建《建筑工程实务》测试题及答案(13)
- 生死感悟——人间世观感一
- 武陵源区军地小学观看魏书生《如何当好班主任》讲座录像
- 全球10大安全旅游国出炉日本排名第9
- 企业策划书模板
- 高中英语教师工作总结3篇
- 法定代表人证明范本
- 大学助学金申请书范文1700字
- 案外人申请不予执行仲裁裁决司法解释施行首份申请书递交齐齐哈尔...
- 环球国际房地产开发项目策划
- 哈夫曼
- 编码
- 课程
- 报告
- 设计
- 2010届高三物理知识点优化训练:气体
- 2015年中考数学试卷质量分析报告
- 鞋吧创业计划书 - 图文
- 汽车发动机构造原理 - 图文
- 喷涂硬泡聚氨酯外墙外保温施工工艺标准
- 小学数学应用题教学生活化的研究-课题申请书 - 图文
- 网格化工作的实施意见
- 微观经济学练习题 6-7章
- 中国移动10086客服规范
- 2016灵石第一幼儿园自然地质灾害应急预案
- 化学专业英语翻译3
- 2010年度国家技术发明奖评审委员会评审通过项目目录(通用项目)2 - 图文
- 北京四中2011-2012学年度第二学期期中考试英语
- 欧必客的店长手册
- 第八章 学生课业发展的测量与评价
- “小三级”职工之家评分细则1课件资料 - 图文
- 黑龙江省大庆市2017年中考化学真题试题含解析
- 财管·闫基础班·08资本预算
- 自动送料冲床机构的课程设计方案 - 图文
- 成语误用例析