实验三哈夫曼树实验报告.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《实验三哈夫曼树实验报告.doc》由会员分享,可在线阅读,更多相关《实验三哈夫曼树实验报告.doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.数据结构实验报告实验名称:实验三 树学生姓名:班级:班内序号:学号:日期:2012 年 12 月 7 号1、 实验要求利用二叉树结构实现赫夫曼编/解码器。基本要求:1、 初始化(Init):能够对输入的任意长度的字符串 s 进行统计,统计每个字符的频度,并建立赫夫曼树2、 建立编码表(CreateTable):利用已经建好的赫夫曼树进行编码,并将每个字符的编码输出。3、 编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。4、 译码(Decoding):利用已经建好的赫夫曼树对编码后的字符串进行译码,并输出译码结果。5、 打印(Print):以直观的方式打印赫
2、夫曼树(选作)6、 计算输入的字符串编码前和编码后的长度,并进行分析,讨论赫夫曼编码的压缩效果。测试数据:I love data Structure, I love Computer。I will try my best to study data Structure.提示:1、用户界面可以设计为“菜单”方式:能够进行交互。2、根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。.2、 程序分析2.1 存储结构(1)二叉树template class BiTreepublic:BiTree(); /构造函数,其前序序列由键盘输入BiTree(void); /析构函数Bi
3、Node* Getroot(); /获得指向根结点的指针protected:BiNode *root; /指向根结点的头指针;/声明类 BiTree 及定义结构 BiNodeData:二叉树是由一个根结点和两棵互不相交的左右子树构成。二叉树中的结点具有相同数据类型及层次关系。示意图: rootlchild parent rchild(2)静态三叉链表struct HNode /哈夫曼树的静态三叉链表unsigned int weight; /结点权值unsigned int parent; /双亲指针unsigned int Lchild; /左孩子指针unsigned int Rchild;
4、 /右孩子指针;示意图:data Lchild Rchild parent(3) 编码表的节点结构struct HCode /字符及其编码结构char data;.char code100;示意图:char data char code1002.2 关键算法分析一:关键算法(一)初始化函数 void Huffman:Init(int a,int n)(1)算法自然语言1. 创建一个长度为 2*n -1 的三叉链表2. 将存储字符及其权值的链表中的字符逐个写入三叉链表的前n 个结点的 data 域,并将对应结点的孩子域和双亲域赋为空3. 从三叉链表的第 n 个结点开始,i=n3.1 从存储字符及
5、其权值的链表中取出两个权值最小的结点x,y,记录其下标 x,y。3.2 将下标为 x 和 y 的哈夫曼树的结点的双亲设置为第 i 个结点3.3 将下标为 x 的结点设置为 i 结点的左孩子,将下标为 y 的结点设置为 i 结点的右孩子,i 结点的权值为 x 结点的权值加上 y 结点的权值,i 结点的双亲设置为空4. 根据哈夫曼树创建编码表(2)源代码void Huffman:Init(int a,int n) /创建哈夫曼树 /二叉树只有度为和度为的结点时,总结点数为(n-1)个HTree=new HNode2*n-1; /根据权重数组a1n初始化哈夫曼树int i,x,y;for(i=0;i
6、n;i+) /n个叶子结点HTreei.weight=ai;HTreei.Lchild=-1; HTreei.Rchild=-1; HTreei.parent=-1;for(int i=n;i2*n-1;i+) /开始建哈夫曼树,从底层向顶层搭建 SelectMin(HTree,i,x,y); /从-(i-1)中选出两个权值最小的结点HTreex.parent=i;HTreey.parent=i; /左右孩子权值相加为父结点的权值HTreei.weight=HTreex.weight+HTreey.weight;.HTreei.Lchild=x;HTreei.Rchild=y;HTreei.p
7、arent=-1;(3)时间复杂度在选取两个权值最小的结点的函数中要遍历链表,时间复杂度为 O(n),故该函数的时间复杂度为 O(n2)(二)统计字符出现频度的代码(1)算法自然语言用 cin.getline()函数获取一段字符串。同时设置一个权值数组 weight,以及暂时统计和存放权值的数组s。用 strlen()函数获取未编码时的字符串长度。从字符串的起始位置进行权值统计,即获得 stri每个字符的 AS 编码,并在s(int)stri数组中进行+1 统计,为字符出现一次。 i 进行自加,统计下面字符出现的频度,在相应的数组元素中进行+1 统计。继续循环,直到字符串结束。(2)源代码(在
8、 main()函数中实现)int i,j=0,v;int s200=0;int weightM; /权值数组cout请输入一段字符串,按回车键结束:endl;cin.getline(str,1000,n); /由用户输入一段字符串coutendl;Len1=strlen(str); /得到未编码时的字符串长度for(i=0;stri!=0;i+) /统计每个字符的权值s(int)stri+; /(int)stri为每个字符的AS编码for(i=0;i200;i+)if(si!=0) /如果权值不为cj=i; /AS编码为i的字符写入字符数组cweightj=si; /权值s数组赋给权值weig
9、ht数组j+;n=j; /叶子结点个数for(v=0;vn;v+) /循环输出字符权值coutcv的权值为:weightvendl;(3) 时间复杂度:若输入的字符串长度为 n,则时间复杂度为 O(n).(三)选择两个最小权值的函数(1)算法自然语言先暂时将前两个叶子结点作为权值最小的两个结点i1,i2从第三个叶子结点开始,每一个结点的权值与 i1,i2 进行比较,如果此结点权值比 i1 权值要小,则将 i1 结点赋给 i2,此结点赋给 i1。如果此结点权值比 i2 要小,此结点赋给 i2。每进行一次循环,总结点个数1.(两个结点进行权值合并)继续执行循环,直到循环到根结点,循环结束。(2)源
10、代码void Huffman:SelectMin(HNode*hTree,int n,int &i1,int &i2)int i,j; /找一个比较的起始值for(i=0;in;i+) /找i1if(hTreei.parent=-1) i1=i;break;i+;for(;ihTreei2.weight) /i1指向最小的j=i2; i2=i1;i1=j;i+;for(;in;i+) /开始找最小的两个.if(hTreei.parent=-1&hTreei.weighthTreei1.weight) /如果之后的叶子结点权值小于前两个,那么进行交换i2=i1; /把i1赋给i2i1=i;els
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 三哈夫曼树 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内