- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈夫曼树实验报告的
2006级数据结构实验报告
实验名称: 实验三——树
学生姓名: 王璇
班 级: 2009211118
班内序号: 29
学 号:日 期: 2010年12月20日
1.实验要求
利用二叉树结构实现哈夫曼编/解码器
基本要求如下:
初始化:能够对输入的任意长度的字符串s进行统计,统计每个字符的频率,并建立哈夫曼树.
建立编码表:利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出.
编码: 根据编码表对输入的字符串进行编码,并将编码后的字符串输出.
编码:利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果.
计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈夫曼编码的压缩效果.
2. 程序分析
哈夫曼树类里的成员函数声明如下:
class Huffman
{
private:
HNode *HTree;//哈夫曼树
HCode *HCodeTable;//哈夫曼编码表
int num;
char aftercode[1000];
int countcode;
public:
void CreateHTree(int a[],int n);//创建哈夫曼树
void CreateCodeTable(char b[]);//创建编码表
void Encode(char *d);//编码
void Decode(char *d);//解码
~Huffman();
void SelectMin(int x,int y,int end);//找最小值
void Reverse(char*code);//倒序
int Countcode();//计算编码长
};
2.1 存储结构
采用数组储存的方法:
建立的哈夫曼树由结点HNode数组组成,每个结点包括结点权值,双亲指针,左右孩子指针.
建立的哈夫曼编码表由结点HCode数组组成,每个结点包括字符值,编码字符数组。
初始化中,包括两个数组,分别储存输入语句字符以及统计的每个字符的次数
2.2 关键算法分析
[内容要求]
1、关键算法:比如插入、删除等基本算法的思想,或是约瑟夫问题的基本思想等,要求使用自然语言描述和伪代码描述,具体可参考书上的伪代码
代码详细分析:比如双链表的插入,需要将4句关键代码写清楚,并画出示意图,可参考书上P69页图2-21。
关键算法的时间、空间复杂度
关键算法1:统计出现过的字符以及相应的次数
Huffman ce;
char sentence[100];//统计所有出现过的不同字符
int times[100]={0};//统计相应字符出现的次数
char line[100];//输入的字符串数组
char *afterdecode=new char[100];//在堆里申请的字符数组,用来储存解码后的字符串
char c;
cout请输入语句,以@结束endl;
int i=0;int j=0;int k=0;
cin.getline(line,100,@);//将输入的字符串存在line数组里
do{//统计函数
c=line[k];
if(c!=\nc!=@c!=\0)
{j=0;//j为定义的工作指针
while(sentence[j]!=cj=i)//如果读取的字符没有出现
j++;//工作指针后移
if(j==i+1)//如果该字符第一次出现
{
sentence[i]=c;//把这个新的字符储存在统计字符数组里
i++;//time的工作指针同样后移
times[i-1]++;}//相应的次数增加1
else//如果在sentence数组里找到了已经存储的该字符
times[j]++;//相应字符的统计次数增加1
k++;}
else break;}while(k100c!=@);
统计函数的实现图式如下:
设读取的新字符为M,在sentence里没有,初始时i=2
M
sentence
a b C j j j j
同时,j后移,i后移
times 1
1 1 1 i i
结束时,i=j=3;
如果插入的字符原本已经存在于sentence,则在相应的统计次数上加1,i的位置不变。
该段代码中,由于在循环中又嵌套了循环,时间复杂度约为O(n2)
关键算法2:在结点中比较出两个最小权值的结点
您可能关注的文档
最近下载
- 2025年湖北省襄阳市襄阳四中学初三下学期四月调考化学试题含解析.doc VIP
- GBT 42706.1-2023 电子元器件 半导体器件长期贮存 第1部分:总则.doc
- 2018人教版七年级数学下册练习:期末达标检测卷.docx VIP
- AC-25厂拌热再生沥青混凝土试验段施工方案.doc
- 行业联盟与竞争格局演变-深度研究.pptx
- 2024-2025学年北京西城区九年级初三(上)期末道德与法治试卷(含答案).pdf
- 2025年山东省枣庄市滕州市高三二模物理试卷及答案.docx
- 第九章 压强和浮力(知识清单)【教师版】.docx VIP
- 2025保安员理论考试100题(附答案) .pdf VIP
- 2022年三级教育测试题.docx
文档评论(0)