哈夫曼树及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业基础实践报告
题目哈夫曼树及应用
起讫日期2008年6月30日至2008年7月11日所在院系软件学院
学生姓名专业计算机
班级学号
指导教师职称
所在单位软件学院
2008年7 月11 日
目录
一、任务及要求 (1)
二、总体设计 (3)
三、运行效果 (16)
四、总结 (22)
五、附录 (23)
参考文献
1.唐策善•《数据结构---用C语言描述》•高等教育出版社•1995 •p50~p120
2.谭浩强•《C程序设计》•清华大学出版社• 2005 • p330!p348
一、任务及要求
在本专业基础实践中,综合C语言程序设计、离散数学、数据结构等学过的
专业基础课程中的基本概念、基础知识和基本理论,进行软件设计的思想、方法
和过程的训练,提高综合素质和动手能力,达到加强专业基础知识理解程度和熟
练程度的目的。具体任务及要求如下:
1、任务
(1)给定一个包含10个以上字符的字符串,长度不少于100个字符,统计各个字符的概率,存放在数组中。
(2)根据上面统计的结果建立哈夫曼树。
(3)实现哈夫曼编码。
(4)实现哈夫曼译码。
(5)自己选做1~2个附加的任务。
2、要求
(1)算法中处理的数据要存放在文件中,实现文件的读写操作。
(2)设计程序中的各个C函数、画出模块图。
(3)程序的代码要规范、有详细的注释。
(4)按照指导教师给出的模板进行专业基础实践报告书写。
二、工作量
在2周(10个工作日)时间里,完成15-20个C函数,150-200行代码。并提交专业实践报告一份,字数不少于5000字(包括英文字符)。
三、计划安排
第1个工作日-第2个工作日:查找相关资料、书籍;确定逻辑结构并进行运算的
定义;选择存储结构并进行算法设计。
第3个工作日-第7个工作日:完成程序的编码,并且自己调试、测试。穿插进行
实践报告的撰写。
第8个工作日-第9个工作日:整理并完成专业基础实践报告,提交指导教师。第10个工作日:由教师检查软件测试效果、审阅实践报告,评定成绩。
指导教师签字:
2008年6月26日
一.总体设计
1.功能模块设计
本C语言程序共包括12个C函数,函数名及其功能如表1所示
2.函数之间的调用关系
函数之间调用的功能模块图如图1所示。
二、详细设计
1.数据的逻辑结构
本程序主要讨论哈夫曼树的逻辑结构,而简化之即时讨论一般二叉树的逻辑结构。
假设有A ,B ,C,D,E,F,G ,H ,I节点,树形结构如下:
设B=(K,R),r∈R。
K={A,B,C,D,E,F,G,H,I}
r={(A,B),(A,C),(B,D),(D,G),(D,H),(E,E),(C,F),(F,I)}
2.数据的存储结构
同样主要讨论哈夫曼树的存储结构:
哈夫曼树采用链型性结构。
定义:
detypef constrct
{float weight;
int lchild,rchild,parent;
}hufmantree;
hufmantree tree[m];
由定义知,tree[]可看做是链型存储的结构体数组,weight是其权值,lchild为另一节点即左孩子的序号,同理rchild为另一节点即右孩子的序号,而parent为该节点的父节点的序号。树形存储结构如下:
A
上图中,A节点为跟点,无父节点p=0,D和H和I无左右孩子节点i=0,r=0
其中节点的权weight(w)为其子女的的和,也是结构体数组的序号。
3.数据的运算
(1)HUFMAN函数的IPO图如下:
OPENFILE(): 输入:以存在在文件名
处理:存入数组,调用
输出:无
CREATFILE(): 输入:新文件名
处理:存入数组,准备调用
输出:无
READ():输入:无
处理:调用文件名数组,打开,读取,统计总数
输出:总数i
EACHREAD():输入:无
处理:存入文件名数组,依次读取,分别统计每个字符数目
输出:无
PRABABL Y():输入:无
处理:每个字符数目除以总数,得到概率,存入树组
输出:无
HUAMANTREE()输入:无
处理:以概率为权建立哈夫曼树tree[]
输出:无
HUFMANCODE():输入:无
处理:调用tree[],对每个字符进行初始化编码
输出:无
CHCODE():输入:无
处理:调用原始字符树组和code[],把所有字符存入与其相对应的code[i].ch
输出:无
OUTPUTCODES():输入:无
处理:依次输出code[i].ch=code[i].bits
输出:所有字符及对应的编码
DECODES(): 输入:二进制编码
处理:调用tree[]得到与code[].ch
输出:字符
TANSFER(): 输入:26个字母和5个常用符号中的任意串处理:与code[].ch比较,得到code[i].bits
输出:二进制编码
MAIN():输入:无
处理:调用子程序
输出:无