设计说明书1
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
输入r后:
输入c 后:
wenku.baidu.com输入e后:
6. 源程序(带注释) #include<stdio.h> #include<stdlib.h> #include<string.h> #define n 27 /* 字符集的容量 */ #define MAXVALUE 1000 /*权值的最大值*/ #define MAXNODE 35 //哈夫曼树最多节点数 #define MAXD 100 typedef struct /* 字符集的元素结构 */ {char data; int weight; }elemtype;
} b.算法的时间复杂度和空间复杂度 时间复杂度: 建立哈夫曼树:O(n³) 对文件中正文进行编码:O(n2) 对文件中的代码进行译码:O(n) 5 测试结果 对下列给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以 下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE“。 字符 空格 A B C D E F G H I J K L M 频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1
cd[n-1]='\0'; //编码结束符标志 for(i=1;i<=n;i++) //逐个字符求哈夫曼编码 {start=n-1; //编码结束位置 for(c=i,f=ht[i].parent;f!=0;c=f,f=ht[f].parent) //从叶子到根逆向求编码 if(ht[f].lchild==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char*)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空 间 strcpy(HC[i],&cd[start]); //从 cd 复制编码(串)到 HC } for(i=1;i<=n;i++) puts(HC[i]); free(cd); //释放工作空间 return(HC) ; } (3)求测试数据的编码(encoding)算法: void encoding(huffmantree ht,char **hc) //根据哈夫曼树HT求哈夫曼编码 表HC {int i,j,k; char sstring[MAXNODE] ; clrscr(); flushall(); printf("input huffmancode \n eg.:this is programma is my favorite:\n"); gets(sstring); for(i=0;i<strlen(sstring);i++) {for(j=1;j<=n;j++) if(sstring[i]==ht[j].data) {k=j;
break; } (4)哈夫曼译码算法: void decoding(huffmantree ht) //代码文件的译码 {char a[MAXD]; int m,i; clrscr(); scanf("%s",a); m=2*n-1; for(i=0;a[i]!='\0';i++) {if(a[i]=='0') m=ht[m].lchild; else m=ht[m].rchild; if(m<=n) {printf("%c",ht[m].data); m=2*n-1; } } } 3.函数调用关系图:
1、 、 设计内容 2 3、 4、 与步骤 5、 1、 设计工作计 2、 划与进度安 3、
排 设计考核 要求
1、 考勤20% 2、 课程设计说明书50% 3、 答辩30%
湖南工业大学计算机与通信学院 《数据结构》课程设计说明书
目 录
摘 要4 前 言5 正 文6 1. 2. 3. 4. 5. 6. 采用类C语言定义相关的数据类型6 各模块的伪码算法6 函数的调用关系图9 调试分析9 测试结果10 源程序(带注释)12
typedef struct /* 哈夫曼树的元素结构 */ {char data; int flag; int weight; //权值 int parent,lchild,rchild; //左右孩子及双亲节点 }htnode,*huffmantree; //动态分配数组存储哈夫曼树 typedef char * *HuffmanCode; //动态分配数组存储哈夫曼编码表
前
言
哈夫曼编码的应用很广泛,利用哈夫曼树求地的二进制编码称 为哈夫曼编码。哈夫曼树中从根到每个叶子都有一条路径,对路径 上的各分支约定:指向左子树的分支表示 “0” 码,指向右子树的分 支表示 “1” 码,取每条路径上的 “0” 或 “1” 的序列作为对应的编码, 这就是哈夫曼编码。我们在对一些问题进行求解时,会发现有些问 题很难找到规律,或者根本无规律可寻。对于这样的问题,可以利 用计算机运算速度快的特点,先搜索查找所有可能出现的情况,再 根据题目条件从所有可能的情况中,删除那些不符合条件的解。 由哈夫曼算法的定义可知,初始森林中共有 n 棵只含有根结点的 二叉树。算法的的第二步是:算法的的第二步是:将当前森林中的 两棵根结点权值最小的二叉树,合并成一棵新的二叉树,每合并一 次,森林中就减少一棵树,产生一个新结点。则要进行 n-1 次合 并,所以共产生 n-1 个新结点。由此可知,最终求得的哈夫曼树中 一共有 2n-1 个结点。其中, n 个结点是初始森林中的 n 个孤立结 点。并且哈夫曼树中没有度数为 1 的分支的结点。 采用哈夫曼编码方案,即应用哈夫曼树构造使电文的编码总长 最短的编码方案。
4.调试分析: a.调试中遇到的问题及对问题的解决方法: 在对源程序进行调试时,当输入字符后,应正确判断所输入的字符 是否满足程序的需求,且保正所输入字符后所输出语句功能唯一。则在 源程序中加入了一条while()判断语句,若while()判断语句中表达式成 立,就重新获取一个字符,然后对while()语句进行重新判断,直到 while()判断语句中表达式不成立,就执行switch()语句中于其输入字符相 对应的case’ ’语句.其程序语句如下: while(ch!='r'&&ch!='c'&&ch!='e'&&ch!='d'&&ch!='q') ch=getchar(); /* 选取功能 */ switch(ch) {case 'r': readdata(w);break; /* 初始化(readdata),读取数据 */ case 'c': ht=createhuff(w);break; /* 建立哈夫曼树(createhuff) */ case 'e': hc=huffmancode(ht);encoding(ht,hc);break; /* 求字符集的哈夫曼编码(huffmancode)和求测试数据的编码 (encoding)*/ case 'd': decoding(ht);break; /* 译码(decoding) */ case 'q': return; /* 程序结束,返回 */
int i,s1,s2; for(i=1;i<=2;*num-1;i++) { HT[i].lchild=0;HT[i].rchild=0; HT[i].parent=0;HTweight=0; } for(i=1;i<=2*num;i++) /*输入num个结点的权值*/ HT[i].weight=cnt[i]; for(i=num+1;i<=2*num-1;i++) {/*在HT[1..i-1]中选择parent为0且权值最小的两个结点*/ selext(Ht,i-1,s1,s2); HT[s1].parent=i;HT[s2].parent=i; Ht[i].lchild=s;HT[i].rchild=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,次数为:%d\n",HC[i].ch,cnt[i++]); } (2)求哈夫曼编码(huffmancode)算法: HuffmanCode huffmancode(huffmantree ht) { char* cd; int c,i,f,start; HuffmanCode HC; HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); //分配 n个字符编码的 头指针向量 cd=(char*)malloc(n*sizeof(char)); //分配求编码的工作区间
课 程 设 计 资 料 袋
计算机与通信学院 学院(系、部) 2010 学年第 一 学期 课程名称 数据结构(C语言) 指导教师 朱文球 职称 教授 学生姓名 黄鑫 题 成 目 绩 专业班级 计本093 学号 09408100306
哈夫曼编译码器 起止日期 2010 年 06 月 28 日~ 2010 年 7 月 n日
目 录 清 单
序号 1 2 3 4 5 6 材 料 名 称 课程设计任务书 课程设计说明书 源程序(电子文档) 资料数量 1 1 1 备 注
湖南工业大学计算机与通信学院 《数据结构》课程设计任务书
设计题目 1.问题描述
设某编码系统共有n个字符,使用频率分别为{w1,w2,…,wn},设计一个不 等长编码方案,使得该编码系统的空间效率最好。
正文
1.采用类C语言定义相关的数据类型 (1)哈夫曼树的存储结构定义为: typedef struct /* 字符集的元素结构 */ {char data; int weight; //权值 }elemtype; typedef struct /* 哈夫曼树的元素结构 */ {char data; int flag; int weight; //权值 int parent,lchild,rchild; //左右孩子及双亲指针 }htnode,*huffmantree; //动态分配数组存储哈夫曼树 typedef char * *HuffmanCode; //动态分配数组存储哈夫曼编码表 (2)哈夫曼树的存储结构描述: #include<stdio.h> #include<stdlib.h> #include<string.h> #define n 27 /* 字符集的容量 */ #define MAXVALUE 1000 /*权值的最大值*/ #define MAXNODE 35 //哈夫曼树最多节点数 #define MAXD 100 2. 各模块的伪码算法: (1)构造哈夫曼树的算法 void ChuffmanTree(HuffmanTree HT,Huffmancode Hc,int cnt[],char str[]) {/*构造哈夫曼树HT,cnt中存放每类字符在电文中出项的频率,str中存放 电文中不同类的字符*/
哈夫曼编\译码器的设计
2.基本要求 已知技术 参数和设 计要求
(1)设计数据结构; (2)设计编码算法; (3)分析时间复杂度和空间复杂度。 (4)字符和频度如下: 字符 空格 A B C D E F G H I J K L M N O P Q 频度 186 64 13 22 32 103 21 15 47 57 1 2 32 20 57 63 15 1 字符 R S T U V W X Y Z 频度 48 51 80 23 8 18 1 16 选择合适的数据结构 结点结构的设计 算法设计与分析 程序设计、实现、调试 课程设计说明书 设计工作4学时 实现与调试16学时 课程设计说明书4学时
参考文献21 致 谢22 附件Ⅰ 部分源程序代码23
摘 要
该设计是对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编 码生成的代码串进行译码,输出电文字符串。在该设计中把数据压缩 过程称为编码,解压缩的过程称为译码。此程序中建立了哈夫曼树, 并利用建好的哈夫曼树对文件中的正文进行编码,对文件中的代码进 行译码,显示输出等功能。 关键词:哈夫曼树,哈夫曼编码,哈夫曼译码。