分享
分销 收藏 举报 申诉 / 26
播放页_导航下方通栏广告

类型哈夫曼编码优秀课程设计优质报告.doc

  • 上传人:精***
  • 文档编号:2683370
  • 上传时间:2024-06-04
  • 格式:DOC
  • 页数:26
  • 大小:75.04KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    哈夫曼 编码 优秀 课程设计 优质 报告
    资源描述:
    湖南科技学院 数据结构 课程设计汇报 课 题: 霍夫曼编码 专业班级: 信计1202 学 号: 05001239 姓 名: 黄思琪 指导老师: 牛志毅 1 课程设计目标和意义 在当今信息爆炸时代,怎样采取有效数据压缩技术来节省数据文件存放空间和计算机网络传送时间已越来越引发大家重视。哈夫曼编码正是一个应用广泛且很有效数据压缩技术。 哈夫曼编码应用很广泛,利用哈夫曼树求得用于通信二进制编码称为哈夫曼编码。树中从根到每个叶子全部有一条路径,对路径上各分支约定:指向左子树分支表示“0”码,指向右子树分支表示“1”码,取每条路径上“0”或“1”序列作为和各个对应字符编码,这就是哈夫曼编码。 通常我们把数据压缩过程称为编码,解压缩过程称为解码。电报通信是传输文字二进制码形式字符串。但在信息传输时,总期望总长度尽可能最短,即采取最短码。 2.需求分析 课 题:哈夫曼编码译码器系统 问题描述:打开一篇英文文章,统计该文章中每个字符出现次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。 问题补充:1. 从硬盘一个文件里读出一段英语文章; 2. 统计这篇文章中每个字符出现次数; 3. 以字符出现字数作为权值,构建哈夫曼树 4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。 具体介绍:在本课题中,我们在硬盘D盘中预先建立一个xuzhimo.txt文档,在里面编辑一篇文章(大写)。然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对该文章字符种类进行统计,并对每个字符出现次数进行统计,而且在界面上显示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼树。然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码写入文件。 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 { 接收命令; 处理命令; } } 说明:在ht[1....k]中选择parent为0且权值最小两个根结点算法 int tongji(参数) { 初始化; for { 接收命令; 处理命令; } } 说明:统计字符串中多种字母个数和字符种类 void Create_huffmanTree() { 初始化; for { 接收命令; 处理命令; } 输出字符统计情况; } 说明:结构哈夫曼树 3哈夫曼编码 void Huffman_bianma(参数) { 定义变量; { 处理命令; } } 说明:哈夫曼编码 (3)关键模块程序步骤图 下面介绍三个关键程序模块步骤图: ①主函数步骤图: 结束 统计字符种类及频率 字符总数num 建立哈夫曼树 哈夫曼编码 打开文件? 开始 否 是 图3.1 步骤图注释: 该图比较简单,关键是调用各个函数模块,首先代开已经存在文件,然后统计总字符数和出现各个字符和频率。然后才开始建立哈夫曼树,接着在哈夫曼树基础上对其进行编码。最终输出结束。 ②结构哈夫曼树: 开始 结束 第i个结点权值 i=num? 创建哈夫曼树 输出字符统计情况 第i个根结点 i=2*num-1? i=num? 否 是 否 是 否 是 图3.2 步骤图注释: 该图是表示结构哈夫曼树过程。首先输入num个叶结点权值,当i=num是循环结束。然后进行哈夫曼树构建,当i=2*num-1是循环结束。最终输出所得到字符统计情况。 ③哈夫曼编码: 结束 开始 T[p].left=c? i<=num? Cd[--start]=0,start=num Cd[--start]=0 Cd[--start]=1 否 否 是 是 图3.3 步骤图解释: 该步骤图表四哈夫曼编码情况。首先初始化,Cd[--start]=0,start=num。然后进行 编码,当cd[--start]=T[p].lchild= =c时,cd[--start]=0;当cd[--start]=T[p].left!= =c时,cd[--start]=1。这个编码循环一直到i=num时结束。 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<min1 &&T[i].parent==0) { j=i; min1=T[i].weight; } x1=j;min1=1000; for (i=1;i<=k;i++) if(T[i].weight<min1 && T[i].parent==0 && i!=x1) { 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++) { if(*p>='A'&&*p<='Z') k=*p-64; t[k]++; } for(i=1,j=0;i<=26;++i) if(t[i]!=0 ) { j++; str[j]=i+64; cishu[j]=t[i]; return j; } 代码解释:下面函数用来结构哈夫曼树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++) { ht[i].left=0; ht[i].right=0; ht[i].parent=0; ht[i].weight=0; } for(i=1;i<=num;i++) //输入num个叶结点权值 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次数:%8d\n",hc[i].ch,cishu[i++]); } ③ 生成Huffman编码并写入文件 代码解释:依据哈夫曼树T求哈夫曼编码H。 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]); H[i].len=num-start; } } 代码解释:对str所代表字符串进行编码并写入文件。将翻译二进制码写入文本文件。 void coding(HuffmanCode hc ,char *str) { //对str所代表字符串进行编码 并写入文件 int i,j; FILE *fp; fp=fopen("codefile.txt","w"); 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); } 5 系统调试 此次测试是在我电脑D盘中建立一个名为file.txt文本文档,其中有大写字母IAMASTUDENT,期望程序能将其读出至界面并实现其它相关功效。 运行程序后,我们能够见到一下运行界面。 从硬盘中读出已经有文本文件 输出所读字符种类和每种字符个数 输出编码 小 结 经过一周课程设计使我对哈夫曼树和哈夫曼编码有了更深认识和了解,也使我愈加明白哈夫曼编码译码在信息技术中关键性和地位。 首先我谈谈我在设计期间我碰到难点。开始时候,代码中有很多错误,尤其是有一个“无法找到文件”错误让我束手无策,最终还是屏蔽了定义四个头文件然后慢慢地更正错误才让我又看到了期望。然后在实现文章读入时,因为对文件不是太熟悉,只好翻开C语言书本仿照其模式编写,但以后进入了死循环,最终处理方法是把main函数里一个do…while循环去掉。 很多错误让我明白了一个道理---细心是很关键。同时,对于编程者而言,思绪清楚是相当关键。在合适时候和同学一起交流探讨是一个十分好学习机会。 这次课程设计不仅让我学得了部分编程知识,还学会了系统做一份课程设计汇报,学会了怎样截图,学会了怎样愈加好画步骤图,明白了做事情只有认真,才能真正做得愈加好! 经过这次课程设计,我看清楚了自己编程功底和动手能力还很不足,这关键是平时实践太少缘故。我想,在未来暑假中,我会努力尝试编写部分程序。 在这个程序中,还有很多地方值得完善。比如,读出文本只能是大写文档,空格和小写不能识别。因为时间问题,临时不能实现了,我想在暑假里好好研究这个问题。 未完成:哈夫曼译码 附录 源程序 #include <stdio.h> #include <string.h> #include <stdlib.h> #include<fstream.h> //类型相关变量定义 #define n 100 #define m 2*n-1 typedef struct{ char ch; char co[9]; //存放编码 int len; }CodeNode; typedef CodeNode HuffmanCode[n+1]; typedef struct { int weight; int left,right,parent; }HTNode; typedef HTNode HuffmanTree[m+1]; int num; void select_min(HuffmanTree T,int k,int &x1,int &x2) { //选择权值最小两个根结点,其序号为x1和x2 int i,j; int min1=1000; for(i=1;i<=k;i++) //找最小值 if(T[i].weight<min1 &&T[i].parent==0) { j=i; min1=T[i].weight; } x1=j;min1=1000; for (i=1;i<=k;i++) //找次小值 if(T[i].weight<min1 && T[i].parent==0 && i!=x1) { j=i; min1=T[i].weight; } x2=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++) //统计多种字符个数   { if(*p>='A'&&*p<='Z') k=*p-64; t[k]++; } for(i=1,j=0;i<=26;++i) if(t[i]!=0 ) { j++; str[j]=i+64; //送对应字母到数组中 cishu[j]=t[i]; //存入对应字母权值 } return j; //j是输入字母种数 } void Create_huffmanTree(HuffmanTree ht,HuffmanCode hc,int cishu[],char str[]) { //生成哈夫曼树HT int i,s1,s2; for(i=0;i<2*num-1;i++) { ht[i].left=0; ht[i].right=0; ht[i].parent=0; ht[i].weight=0; } for(i=1;i<=num;i++) //输入num个叶结点权值 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次数:%8d\n",hc[i].ch,cishu[i++]); } 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]); H[i].len=num-start; } } void coding(HuffmanCode hc ,char *str) { //对str所代表字符串进行编码 并写入文件 int i,j; FILE *fp; fp=fopen("codefile.txt","w"); 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); } void output() //输出编码 { FILE *fp; char ch; if((fp=fopen("codefile.txt","r+"))==NULL) { printf("error\n"); exit(0); } printf("编码为:\n"); ch=fgetc(fp); while(!feof(fp)) { putchar(ch); ch=fgetc(fp); } printf("\n"); } int fileopen(char string[]) //读入文件 { FILE *fp; if((fp=fopen("D:\\数据结构课程设计\\file.txt","r"))==NULL) { printf("不能打开文件!\n"); exit(1); } while(fgets(string,100,fp)!=NULL) printf("%s\n",string); fclose(fp); return 0; } //主函数 void main() { char string[100]; char *s,str[27]; int cishu[27]; HuffmanTree HT; HuffmanCode HC; int x; printf("********************************\n"); printf("***** 哈夫曼编码 *****\n"); printf("********************************\n"); while(1) { printf("请选择"); printf("\t 1.开始\n"); printf("\t 2.输出各字符统计个数\n"); printf("\t 3.编码\n"); printf("\t 4.输出编码\n"); printf("\t 5.退出\n"); scanf("%d",&x); switch(x) { case 1: printf("读出文本为:\n"); fileopen(string); 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; } } }
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:哈夫曼编码优秀课程设计优质报告.doc
    链接地址:https://www.zixin.com.cn/doc/2683370.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork