哈夫曼树及其应用

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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():输入:无

处理:调用子程序

输出:无

相关文档
最新文档