【报告】课程设计报告哈夫曼编码

合集下载

huffman哈夫曼树编码译码课程设计报告

huffman哈夫曼树编码译码课程设计报告

数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

【基本要求】1)初始化。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。

2)编码。

利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。

3)译码。

利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。

4)输出编码。

将编码结果显示在终端上,每行50个代码。

5)输出哈夫曼树。

将哈夫曼树以直观的方式(树或凹入表形式)显示出来。

【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。

参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。

23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。

数据结构课程设计总结报告 哈夫曼编码译码

数据结构课程设计总结报告 哈夫曼编码译码

《数据结构》课程设计实验报告题目哈夫曼编码/译码器学院数理与信息学院专业计算机科学与技术班级计科132学生姓名刘海澍 5周弘杰8徐铭瑶 3指导教师编写日期数据结构课程设计目录1 问题描述.................................................................错误!未定义书签。

2 问题分析.................................................................错误!未定义书签。

3 算法设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)4.3 流程图 (6)5 测试分析 (9)6 课程设计总结 (10)7 成员分工 (10)参考文献 (11)附录(源程序清单) (12)1.问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

1) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;2) 编码:利用建好的哈夫曼树生成哈夫曼编码;3) 输出编码;4)显示哈夫曼树;5)界面设计的优化;6) 设字符集及频度如下表:字符空格 A B C D E F频度4 9 23 2 17 15字符G H I J K频度1 2 3 3 42.问题分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[60]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。

课程设计报告哈夫曼编码

课程设计报告哈夫曼编码

课程设计题目哈夫曼编码学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2010 年07 月02 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806 指导教师:姚寒冰工作单位:计算机科学系题目: 哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

(1)I:初始化(Initialization)。

对输入的一段英文中的每个字符统计其权值,建立哈夫曼树;(2)E:编码(Encoding)。

利用已建好的哈夫曼树,对每个字符进行编码。

(3)D:译码(Decoding)。

利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4)P:印代码文件(Print)。

将每个字符编的哈夫曼码和译码结果显示在终端上。

测试用例见题集p149。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。

2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。

源程序要加注释。

如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

时间安排:1、第18周(6月28日至7月2日)完成。

2、7月2 日08:30到计算中心检查程序、交课程设计报告、源程序(CD盘)。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录1 设计题目....................... 错误!未定义书签。

2 问题描述....................... 错误!未定义书签。

3.1数据结构设计................ 错误!未定义书签。

课程设计报告哈夫曼编码

课程设计报告哈夫曼编码

课程设计题目哈夫曼编码学院计算机科学与技术专计算机科学与技术业班级姓名指导教师20 0 010 年7 月2 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806指导教师:姚寒冰工作单位:计算机科学系题目:哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

(1) 1:初始化(Initialization )。

对输入的一段央文中的每个字符统计其权值,建立哈夫曼树;(2) E:编码(Encoding )。

利用已建好的哈夫曼树,对每个字符进行编码。

(3) D:译码(Decoding )。

利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4) P:印代码文件(Print )。

将每个字符编的哈夫曼码和译码结果显示在终端上。

测试用例见题集p149。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。

2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。

源程序要加注释。

如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

时间安排:1、第18周(6月28日至7月2日)完成。

2、7月2日08 : 30到计算中心检查程序、交课程设计报告、源程序( CD盘)。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录1设计题目 (1)2问题描述 (1)3.1数据结构设计 (1)3.2主要算法设计 (3)3.3测试用例设计 (6)4调试报告 (7)5结束语 (7)六、课程设计参考资料 (8)附录 (9)F1源代码 (9)F2运行结果 (16)哈夫曼编码1设计题目哈夫曼编码2问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

关于哈夫曼编码的程序设计报告

关于哈夫曼编码的程序设计报告

关于哈夫曼编码的程序设计报告第一部分:引言1. 关于哈夫曼编码的程序设计报告在现代社会中,信息的传输和存储已经成为了我们生活中不可或缺的一部分。

在数字化时代,我们经常需要对数据进行编码和解码,以便有效地传输和存储信息。

而哈夫曼编码作为一种有效的数据压缩方式,被广泛应用于通信、计算机科学和信息处理领域。

在本篇文章中,我将从程序设计的角度进行深入探讨哈夫曼编码的原理、实现和应用。

我将带领你一起了解哈夫曼编码的本质,探讨其在实际应用中的价值,以及我个人对于哈夫曼编码的理解和观点。

第二部分:哈夫曼编码的原理与实现2. 原理概述哈夫曼编码是一种变长编码方式,通过统计文本中字符出现的频率,构建一颗最优二叉树,将出现频率高的字符用较短的编码表示,而出现频率低的字符用较长的编码表示,从而实现了对数据的高效压缩和解压缩。

3. 算法流程哈夫曼编码的算法流程主要包括构建哈夫曼树、生成编码表和进行编码解码三个步骤。

在构建哈夫曼树时,需要通过优先队列或堆来实现最小频率字符的选择和合并,然后生成编码表,最后进行编码和解码操作。

4. 实现技巧在实际的程序设计中,优化哈夫曼编码的实现是非常重要的。

例如采用树结构、位操作以及内存管理等技巧可以有效提高哈夫曼编码的性能和效率。

第三部分:哈夫曼编码的应用5. 通信领域在通信领域中,哈夫曼编码被广泛应用于数据传输和网络通信中。

通过哈夫曼编码可以实现对数据的高效压缩,从而节省带宽和传输成本。

6. 储存领域在储存领域中,哈夫曼编码也能够帮助我们实现对数据的高效压缩和解压缩,节省存储空间并提高储存效率。

特别是在大数据和云计算时代,哈夫曼编码的应用更是显得尤为重要。

第四部分:个人观点与理解7. 我的观点在我看来,哈夫曼编码作为一种高效的数据压缩算法,为我们在通信、计算机科学和信息处理领域带来了极大的便利。

它不仅可以帮助我们节省带宽和存储空间,还能够提高数据传输和存储的效率。

8. 我的理解通过对哈夫曼编码的深入学习和探讨,我不仅对其原理和实现有了更深入的理解,也对其在实际应用中的潜力和价值有了更深刻的认识。

霍夫曼编码的实验报告(3篇)

霍夫曼编码的实验报告(3篇)

第1篇一、实验目的1. 理解霍夫曼编码的基本原理和实现方法。

2. 掌握霍夫曼编码在数据压缩中的应用。

3. 通过实验,加深对数据压缩技术的理解。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 20194. 数据源:文本文件三、实验原理霍夫曼编码是一种常用的数据压缩算法,适用于无损数据压缩。

它通过使用变长编码表对数据进行编码,频率高的数据项使用短编码,频率低的数据项使用长编码。

霍夫曼编码的核心是构建一棵霍夫曼树,该树是一种最优二叉树,用于表示编码规则。

霍夫曼编码的步骤如下:1. 统计数据源中每个字符的出现频率。

2. 根据字符频率构建一棵最优二叉树,频率高的字符位于树的上层,频率低的字符位于树下层。

3. 根据最优二叉树生成编码规则,频率高的字符分配较短的编码,频率低的字符分配较长的编码。

4. 使用编码规则对数据进行编码,生成压缩后的数据。

5. 在解码过程中,根据编码规则恢复原始数据。

四、实验步骤1. 读取文本文件,统计每个字符的出现频率。

2. 根据字符频率构建最优二叉树。

3. 根据最优二叉树生成编码规则。

4. 使用编码规则对数据进行编码,生成压缩后的数据。

5. 将压缩后的数据写入文件。

6. 读取压缩后的数据,根据编码规则进行解码,恢复原始数据。

7. 比较原始数据和恢复后的数据,验证压缩和解码的正确性。

五、实验结果与分析1. 实验数据实验中,我们使用了一个包含10000个字符的文本文件作为数据源。

在统计字符频率时,我们发现字符“e”的出现频率最高,为2621次,而字符“z”的出现频率最低,为4次。

2. 实验结果根据实验数据,我们构建了最优二叉树,并生成了编码规则。

使用编码规则对数据源进行编码,压缩后的数据长度为7800个字符。

将压缩后的数据写入文件,文件大小为78KB。

接下来,我们读取压缩后的数据,根据编码规则进行解码,恢复原始数据。

比较原始数据和恢复后的数据,发现两者完全一致,验证了压缩和解码的正确性。

哈夫曼编码译码课程设计报告

哈夫曼编码译码课程设计报告

哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级:10电信实验班学号:Q10600132姓名:王彬彬一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。

2、熟悉掌握一门计算机语言,能够进行数据算法设计。

二、实验原理哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。

在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。

构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。

最简单的二进制编码方式是等长编码。

若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。

哈夫曼树课用于构造使电文的编码总长最短的编码方案。

主要流程图如下:三、实验步骤1:写好流程图,设计实验方案。

2:初始化,从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件HuofumanTree中。

3:编码。

利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

4:译码。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。

5:印代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrint中。

6:印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。

具体函数如下:1:Initialization() 初始化2:Encoding() 编码3:Decoding() 译码4:Print_file() 打印代码文件5:search(k,j,p) 搜索二叉树6:Print_tree() 打印二叉树7:menu() 主菜单9:main() 主函数四、实验结果与分析(1)大致个人测试案例:主界面:。

huffman哈夫曼树编码译码课程设计报告

huffman哈夫曼树编码译码课程设计报告

数据结构课程设计信息科学与工程学院:学院计算机科学与技术专业:1601 计卓级:班号:学:学生姓名指导教师:23/ 1年月日题目名称一、实验内容哈夫曼编码译码系统【问题描述】用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

【基本要求】1)初始化。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。

2)编码。

利用已建好的哈夫曼树对输入英文进行编码,编码结果存储在数组中。

3)译码。

利用已建好的哈夫曼树将数组中的代码进行译码,结果存入一个字符数组。

4)输出编码。

将编码结果显示在终端上,每行50个代码。

5)输出哈夫曼树。

将哈夫曼树以直观的方式(树或凹入表形式)显示出来。

【实现提示】用户界面可以设计为“菜单”方式,再加上一个“退出”功能。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“退出”为止。

参考教材P240-246【选做内容】将哈夫曼树保存到文件中,编码和译码的结果也分别存放在两个文本文件中。

23/ 2二、数据结构设计储存结构struct HNodeType {//字符结构体类型int weight;//权int parent;//双亲位置int lchild;//左孩子int rchild;//右孩子char inf;// 字符};struct HcodeType {存储编码int bit[MaxBit];// int start;// 起始位置};三、算法设计1、在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1。

数据结构 哈夫曼编码器课程设计报告

数据结构 哈夫曼编码器课程设计报告

课程设计报告一.需求分析1、一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree 中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件中。

(5)T:印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

2、利用哈夫曼编译码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

3、用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quito。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

4、在程序的一次执行过程中,第一次执行I,D或C命令之后,哈夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

二、概要设计1、部分函数1)树与编码类型struct HTNode2)选两个最小的树组成二叉树Void Select(HNode *HT,int I,int &s1,int &s2)3)初始化哈夫曼树void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n)4)输出哈夫曼树void TreePrint(HTNode *HT,int n)5) 输出哈夫曼编码void CodePrint(HuffmanCode *HC,int n)2、主函数void main(){初始化;Switch(){ }end;}3、模块之间的调用关系三、详细设计1、树的结构体的建立struct HTNode{int weight,parent,lchild,rchild;char zifu;};struct HuffmanCode{char *code;char zifu;int size;};2、部分编码void Select(HTNode *HT,int i,int &s1,int &s2) {int k;for(k=1;k<=i;k++){if(HT[k].parent==0){s1=k;break;}}for(k=k+1;k<=i;k++){if(HT[k].parent==0){s2=k;break;}}for(k=k+1;k<=i;k++){if(HT[k].parent==0){if(HT[k].weight<HT[s1].weight){if(HT[k].weight<HT[s2].weight){if(HT[s2].weight<HT[s1].weight){s1=s2;s2=k;}else{s2=k;}}else{s1=s2;s2=k;}}else if(HT[k].weight<HT[s2].weight){s2=k;}}}}void HuffmanCoding(HTNode *&HT,HuffmanCode *&HC,char *x,int *w,int n) {if(n<=1)return;int m=2*n-1,i,s1,s2;HTNode *p;HT=(HTNode *)malloc((m+1)*sizeof(HTNode));for(p=HT+1,i=1;i<=n;i++,p++,w++,x++)p->weight=*w,p->parent=0,p->lchild=0,p->rchild=0,p->zifu=*x;for(;i<=m;i++,p++)p->weight=0,p->parent=0,p->lchild=0,p->rchild=0,p->zifu='N';for(i=n+1;i<=m;i++){Select(HT,i-1,s1,s2);HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}char *CD;int k,j;CD=(char *)malloc(n*sizeof(char));for(i=1;i<=n;i++){j=i;k=0;while(HT[j].parent!=0){if(HT[HT[j].parent].lchild==j)CD[k]='0';elseCD[k]='1';k++;j=HT[j].parent;}HC[i-1].code=(char *)malloc((k+1)*sizeof(char));HC[i-1].code[k]='\0';k--;int m=k;HC[i-1].size=m;for(int l=0;l<=m;l++){HC[i-1].code[l]=CD[k];k--;}HC[i-1].zifu=HT[i].zifu;}free(CD);}int Strsize(char *d){int i=0;while(*d!='\0'){d++;i++;}return i;}char* Bianma(HuffmanCode *&HC,char *d) {//哈夫曼树编码int n=Strsize(d),i,k,j,sum=0;char *a;a=(char *)malloc((10*n)*sizeof(char));for(i=0;i<n;i++){k=0;while(*d!=HC[k].zifu){k++;}j=0;while(HC[k].code[j]!='\0'){a[sum]=HC[k].code[j];j++;sum++;}d++;}a[sum]='\0';return a;}void Yima(HTNode *HT,char *&a,char *b,int n){int k=2*n-1,i=0;int m=k;while(*b!='\0'){if(*b=='0'){if(HT[HT[m].lchild].lchild==0){a[i]=HT[HT[m].lchild].zifu;i++;b++;m=k;}else{m=HT[m].lchild;b++;}}else{if(HT[HT[m].rchild].lchild==0){a[i]=HT[HT[m].rchild].zifu;i++;b++;m=k;}else{m=HT[m].rchild;b++;}}}a[i]='\0';}void Initialization(HTNode *&HT,HuffmanCode *&HC,int *&w,char *&x,int &n) {//初始化哈夫曼树printf("输入字符集大小n\n");scanf("%d",&n);fflush(stdin);w=(int *)malloc(n*sizeof(int));x=(char *)malloc(n*sizeof(char));for(int i=0;i<n;i++){printf("输入第%d个字符和权值:\n",i+1);scanf("%c %d",&x[i],&w[i]);fflush(stdin);}HC=(HuffmanCode *)malloc(n*sizeof(HuffmanCode));HuffmanCoding(HT,HC,x,w,n);}void TreePrint(HTNode *HT,int n){//输出哈夫曼树for(int i=1;i<(2*n);i++)printf("%c %d %d %d %d\n",HT[i].zifu,HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild); }void CodePrint(HuffmanCode *HC,int n){//输出哈夫曼编码for(int i=0;i<n;i++){printf("%c ",HC[i].zifu);puts(HC[i].code);}}3、主程序void main(){HTNode *HT;HuffmanCode *HC;int n,*w;char *x,*y,Z;char *a,*b;a=(char *)malloc(100*sizeof(char));b=(char *)malloc(100*sizeof(char));start:printf("初始化i,编码e,译码d,印哈夫曼码p,印哈夫曼树t,退出q。

哈夫曼树编码课程设计实验报告

哈夫曼树编码课程设计实验报告

四、综合设计(课程设计)摘要:在这次课程设计中,所进行的实验是:哈夫曼编码和编译器。

对哈夫曼树进行建立,由节点的权值建立最小二叉树,哈夫曼树haftree,并由所建立的哈夫曼树进行编码,求出各个节点的编码。

在由所求的哈夫曼树,输入一段二进制电文,能够输出那所建立的哈夫曼树中的节点。

建立的haftree用图形化表示出来。

在整个代码实现中,窗体的实现,功能的完善,哈夫曼树的建立,哈夫曼树的编码,遇到了许多难题,haftree对象数组的分配空间,节点的属性等都比较困难。

在整个过程中,用的是C#语言,包的应用,字符串数组的空间分配,在计算每个字符的权值时,用的是sizeOf()检索整个字符串,计算字符的权值,建立字符出现频度的表格,根据表格中每个字符频度建立起哈夫曼树。

从根节点出发检索每个节点的左右孩子,如果是左孩子遍历左边,路径为0,然后左孩子为根节点;如果是右孩子,遍历右孩子,路径为1,然后右孩子为根节点。

在重新上述方法,直到所有的节点都遍历完,每个节点的编码就确定后输出来。

在译码过程中,由所输入的二进制电文,根据所建立的哈夫曼树,如果是0走左边,如果是1,走右边,直到节点的左右孩子为空时,输出给节点的信息,在回到根节点重新遍历后面的二进制电文,直到所有电文都遍历完为止,输出所有从电文中译码出来的信息。

关键词:编译器;频度;译码五、综合设计(课程设计)Abstract:In this design, the experiment was : Huffman coding and compiler. The Huffman tree to establish, by the node weights to establish a minimum of two fork tree, Huffman tree haftree, and by the Huffman tree coding, and every node coding. By the Huffman tree, enter a binary message, can output the set up by the Huffman tree nodes. Establishment of haftree graphical representation. In the implementation of the code, the realization form, function perfect, Huffman tree is established, Huffman coding tree, encountered a lot of problems, an array of haftree objects allocated space, node attributes are difficult. Throughout the process, using the C# language, the application package, an array of strings in the spatial distribution, calculated for each weight of characters, using sizeOf to retrieve the entire string, calculating the weight of characters, establish character appearance frequency of form, form the basis of each character frequency established Huffman tree. Starting from the root node to retrieve each node around children, if children left traverse left, path 0, then left the child as the root node; if it is right child, traversing the right path for children, 1 children for the root node, then the right. In the new method described above, until all of the node traversal finished, each node is determined after the output coding.In the decoding process, by the input binary message, according to the established Huffman tree, if it is 0 the left, if it is 1, go right, until the left and right child node is empty, the output to the node information, in the back of the root node to traverse behind a binary message, until all message traversal finished so far, the output from all the message decoding of information.Keywords:compiler;frequency;decoding目录摘要 ................................................................................. 错误!未定义书签。

哈夫曼编码课程设计报告

哈夫曼编码课程设计报告

哈夫曼编码课程设计报告数据结构课程设计报告课题: 专业班级:学号:姓名:指导教师:1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0〞码,指向右子树的分支表示“1〞码,取每条路径上的“0〞或“1〞的序列作为和各个对应的字符的编码,这就是哈夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度尽可能最短,即采用最短码。

12.需求分析课题:哈夫曼编码译码器系统问题描述:翻开一篇英文文章,统计该文章中每个字符出现的次数,然后以它们作为权值,对每一个字符进行编码,编码完成后再对其编码进行译码。

问题补充:1. 从硬盘的一个文件里读出一段英语文章;2. 统计这篇文章中的每个字符出现的次数;3. 以字符出现字数作为权值,构建哈夫曼树4. 对每个字符进行编码并将所编码写入文件然后对所编码进行破译。

具体介绍:在本课题中,我们在硬盘D盘中预先建立一个file.txt文档,在里面编辑一篇文章(大写)。

然后运行程序,调用fileopen()函数读出该文章,显示在界面;再调用tongji()函数对该文章的字符种类进行统计,并对每个字符的出现次数进行统计,并且在界面上显示;然后以每个字符出现次数作为权值,调用Create_huffmanTree()函数构建哈夫曼树。

然后调用Huffman_bianma()函数对哈夫曼树进行编码,调用coding()函数将编码写入文件。

测试数据:例如从文本中读到文章为:IAMASTUDENT。

那么效果如下:读出文本为:IAMASTUDENT字符A次数:2 字符D次数:1 字符E次数:1 字符I 次数:1 字符M次数:1 字符N 次数:1 字符S 次数:1 字符T次数:2 字符U次数:1输出编码:000 101 001 101 011 110 100 1110 1111 010 110Press any key to continue233 系统〔工程〕设计(1)设计思路及方案本课题是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。

哈夫曼编码 实验报告

哈夫曼编码 实验报告

哈夫曼编码实验报告哈夫曼编码实验报告一、引言哈夫曼编码是一种用于数据压缩的算法,由大卫·哈夫曼于1952年提出。

它通过将出现频率高的字符用较短的编码表示,从而实现对数据的高效压缩。

本实验旨在通过实际操作和数据分析,深入了解哈夫曼编码的原理和应用。

二、实验目的1. 掌握哈夫曼编码的基本原理和算法;2. 实现哈夫曼编码的压缩和解压缩功能;3. 分析不同数据集上的压缩效果,并对结果进行评估。

三、实验过程1. 数据集准备本实验选取了三个不同的数据集,分别是一篇英文文章、一段中文文本和一段二进制数据。

这三个数据集具有不同的特点,可以用来评估哈夫曼编码在不同类型数据上的压缩效果。

2. 哈夫曼编码实现在实验中,我们使用了Python编程语言来实现哈夫曼编码的压缩和解压缩功能。

首先,我们需要统计数据集中各个字符的出现频率,并构建哈夫曼树。

然后,根据哈夫曼树生成每个字符的编码表,将原始数据转换为对应的编码。

最后,将编码后的数据存储为二进制文件,并记录编码表和原始数据的长度。

3. 压缩效果评估对于每个数据集,我们比较了原始数据和压缩后数据的大小差异,并计算了压缩比和压缩率。

压缩比是指压缩后数据的大小与原始数据大小的比值,压缩率是指压缩比乘以100%。

通过对比不同数据集上的压缩效果,我们可以评估哈夫曼编码在不同类型数据上的性能。

四、实验结果与分析1. 英文文章数据集对于一篇英文文章,经过哈夫曼编码压缩后,我们发现压缩比为0.6,即压缩后的数据只有原始数据的60%大小。

这说明哈夫曼编码在英文文本上具有较好的压缩效果。

原因在于英文文章中存在大量的重复字符,而哈夫曼编码能够利用字符的出现频率进行编码,从而减少数据的存储空间。

2. 中文文本数据集对于一段中文文本,我们发现哈夫曼编码的压缩效果不如在英文文章上的效果明显。

压缩比为0.8,即压缩后的数据只有原始数据的80%大小。

这是因为中文文本中的字符种类较多,并且出现频率相对均匀,导致哈夫曼编码的优势减弱。

哈夫曼编译码器课程设计报告完整版

哈夫曼编译码器课程设计报告完整版

哈夫曼编译码器课程设计报告完整版XXX学院本科数据结构课程设计总结报告设计题目:实验一、哈夫曼编/译码器学生姓名:XXX系别:XXX专业:XXX班级:XXX学号:XXX指导教师:XXX XXX6 月 21日xxx学院课程设计任务书题目一、赫夫曼编译码器专业、班级 xxx学号 xxx 姓名 xxx主要内容、基本要求、主要参考资料等:1. 主要内容利用哈夫曼编码进行信息通信可大大提高信道利用率,缩短信息传输时间,降低传输成本。

要求在发送端经过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。

对于双工信道(既能够双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼的编/译码系统。

2. 基本要求系统应具有以下功能:(1)C:编码(Coding)。

对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中,将以此建好的哈夫曼树存入文件HuffmanTree中(2)D:解码(Decoding)。

利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入textfile中。

(3)P:打印代码文件(Print)。

将文件codefile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件codeprint中。

(4)T:打印哈夫曼树(Tree Printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。

3. 参考资料:数据结构(C语言版)严蔚敏、吴伟民编著;数据结构标准教程胡超、闫宝玉编著完成期限: 6月21 日指导教师签名:课程负责人签名:6月 21 日一、设计题目(任选其一)实验一、哈夫曼编/译码器二、实验目的1巩固和加深对数据结构的理解,提高综合运用本课程所学知识的能力;2 深化对算法课程中基本概念、理论和方法的理解;3 巩固构造赫夫曼树的算法;4 设计试验用程序实验赫夫曼树的构造。

课程设计报告--哈夫曼编码译码系统

课程设计报告--哈夫曼编码译码系统
1.我们需要一个功能函数对ASCII码的初始化并需要一个数组来保存它们;
2.定义代表森林的数组,在创建哈夫曼树的过程当中保存被选中的字符,即给定报文中出现的字符,模拟哈夫曼树选取和删除左右子树的过程;
3.自底而上地创建哈夫曼树,保存根的地址和每个叶节点的地址,即字符的地址,然后自底而上检索,首尾对换调整为哈夫曼树实现哈弗曼编码;
随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。
4.定义hufnode类型的全局数组hufNode[256],在编码时最为哈夫曼编码对照表的节点,char型c保存字符,int code[100]保存其哈夫曼编码;
5.定义HFM类,主要保存哈夫曼树的根节点指针,但其丰富的功能函数将实现哈夫曼编码译码的工作及其他功能;
函数介绍:
1.void init(signode * sig){……}初始化数组SN[];
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。
《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

哈夫曼编码译码课程设计报告

哈夫曼编码译码课程设计报告

哈夫曼编码译码课程设计报告《数据结构》课程设计——赫夫曼编码/译码器设计指导教师:李文书、周维达班级:10电信实验班学号:Q10600132姓名:王彬彬一、实验目的1、提高分析问题、解决问题的能力,进一步巩固数据结构各种原理与方法。

2、熟悉掌握一门计算机语言,能够进行数据算法设计。

二、实验原理哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。

在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。

构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。

最简单的二进制编码方式是等长编码。

若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。

哈夫曼树课用于构造使电文的编码总长最短的编码方案。

主要流程图如下:三、实验步骤1:写好流程图,设计实验方案。

2:初始化,从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件HuofumanTree中。

3:编码。

利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

4:译码。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。

5:印代码文件(Print).将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrint中。

6:印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。

具体函数如下:1:Initialization() 初始化2:Encoding() 编码3:Decoding() 译码4:Print_file() 打印代码文件5:search(k,j,p) 搜索二叉树6:Print_tree() 打印二叉树7:menu() 主菜单9:main() 主函数四、实验结果与分析(1)大致个人测试案例:主界面:初始化:Huofuman.txt初始化存入文件结果如下:编码结果如下:codefile.txt编码存入文件如下:译码结果如下:textfile.txt译码存入文件如下:打印结果如下:打印树结果如下:treeprint.txt存入文件结果如下:(2)本例测试案例_1已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计哈夫曼编码。

数据结构课程设计-哈夫曼编码实验报告

数据结构课程设计-哈夫曼编码实验报告

数据结构课程设计报告实验二哈夫曼编码目录一.问题描述及分析p11.问题描述p12.需求分析p1 二.功能模块及数据结构描述p11.数据结构描述 p1 2.模块描述 p2三.主要算法流程描述p21.编码流程图 p3 2.译码流程图 p4四.使用说明p5 五.调试分析说明p6一.问题描述及分析1.问题描述设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(后缀名.cod);反过来,可将一个编码文件还原为一个文本文件(.txt)。

2.需求分析(1)输入一个待压缩的文本文件名,统计文本文件中各字符的个数作为权值,生成哈夫曼树;(2)将文本文件利用哈夫曼树进行编码,生成编码文件(后缀名cod);(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码;(4)显示指定的编码文件和文本文件;3.运行要求.Windows xp/2003.VC++6.0(或以上)运行库二.功能模块及数据结构描述1.数据结构描述typedef struct{long weight;long lchild,rchild,parent;}hfmt;hfmt t[2*256-1];存放哈夫曼树结构体,weight为节点权值,lchild,rchild为节点的左右孩子在向量中的下标(为叶节点时,两值为:-1),parent为节点的双亲在向量中的下标(用来区别根与非根节点,值为-1与非-1)。

typedef struct{char bits[256];long s;}hfmcc;hfmcc cc[256];存放哈夫曼编码结构体,s用来指示编码在位串bits[n]中的起始位置。

2.模块描述图2.1 系统函数copy函数:根据s的值在位串bits[n]中提取有效编码位数。

HFM函数:对读入的节点权值,生成哈夫曼树。

HFMBM函数:对生成的哈夫曼树进行零一编码,对应于原文件字符。

三.主要算法流程描述1.编码流程图图2.2 编码流程图2.译码流程图图2.3 译码流程图四.使用说明图2.4 生成的文件本软件默认生成的编码文件名为:a.cod默认生成的译码文件名为:b.txt执行提示:输入所要编码的文本文件。

数据结构 哈夫曼编码器课程设计报告

数据结构 哈夫曼编码器课程设计报告

数据结构哈夫曼编码器课程设计报告哈夫曼编码器课程设计报告设计目标:本课程设计的目标是实现一个哈夫曼编码器,能够实现对给定文本文件进行压缩和解压缩操作。

通过使用哈夫曼编码,可以使文本文件的大小大幅度减小,从而节约存储空间。

设计原理及实现方法:本设计主要包括以下几个步骤:1、文本文件的读取:首先需要从外部文件中读取待压缩的文本文件,读取过程可以通过使用文件输入流进行操作。

读取的文本内容将用于构建哈夫曼树和编码表。

2、构建哈夫曼树:哈夫曼树是通过给定文本中的字符出现频率来构建的,出现频率更高的字符将拥有更短的编码。

构建哈夫曼树的过程可以通过使用优先队列和二叉树来实现。

3、编码表:在构建哈夫曼树的过程中,每个字符都会有一个唯一的编码。

根据哈夫曼树的特性,左子树的编码为0,右子树的编码为1,根据这个规则可以通过遍历哈夫曼树来编码表。

4、压缩文本文件:在编码表后,可以利用编码表来对文本文件进行压缩操作。

遍历文本文件中的每个字符,通过编码表将字符转换为对应的哈夫曼编码,并将编码存储在一个压缩文件中。

5、解压缩文本文件:解压缩操作是压缩操作的逆过程。

根据编码表将压缩文件中的哈夫曼编码逐个解码为字符,并将解码后的字符写入解压缩文件中。

附件说明:本文档的附件包括以下内容:1、源代码文件:- HuffmanEncoder:java:包含了哈夫曼编码器的主要实现代码。

- Mn:java:包含了测试哈夫曼编码器的主函数。

2、示例文本文件:- input:txt:用于测试的示例文本文件。

法律名词及注释:本文档中涉及的法律名词及注释如下:1、哈夫曼编码:用于数据压缩的一种编码方式,旨在通过减少字符的编码长度来节省存储空间。

2、压缩:将原始文件经过编码转换为较短的文件,从而减小存储空间的占用。

3、解压缩:将压缩文件经过解码转换为原始文件,恢复原始文件的过程。

全文结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【关键字】报告课程设计题目哈夫曼编码学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2010 年07 月02 日课程设计任务书学生姓名:拉巴珠久专业班级:计算机0806指导教师:姚寒冰工作单位:计算机科学系题目: 哈夫曼编码初始条件:输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

(1)I:初始化(Initialization)。

对输入的一段英文中的每个字符统计其权值,建立哈夫曼树;(2)E:编码(Encoding)。

利用已建好的哈夫曼树,对每个字符进行编码。

(3)D:译码(Decoding)。

利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4)P:印代码文件(Print)。

将每个字符编的哈夫曼码和译码结果显示在终端上。

尝试用例见题集p149。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1、问题描述简述题目要解决的问题是什么。

2、设计存储结构设计、主要算法设计(用类C语言或用框图描述)、尝试用例设计;3、调试报告调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4、经验和体会(包括对算法改进的设想)5、附源程序清单和运行结果。

源程序要加注释。

如果题目规定了尝试数据,则运行结果要包含这些尝试数据和运行输出,6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

时间安排:1、第18周(至)完成。

2、日08:30到计算中心检查程序、交课程设计报告、源程序(CD盘)。

指导教师签名:年月日系主任(或责任教师)签名:年月日目录哈夫曼编码1 设计题目哈夫曼编码2 问题描述输入一段英文字符,试为该文中的每个字符编制相应的哈夫曼码。

(1)I:初始化(Initialization)。

对输入的一段英文中的每个字符统计其权值,建立哈夫曼树;(2)E:编码(Encoding)。

利用已建好的哈夫曼树,对每个字符进行编码。

(3)D:译码(Decoding)。

利用已建好的每个编码,对输入的一个由0、1组成的序列进行译码;(4)P:印代码文件(Print)。

将每个字符编的哈夫曼码和译码结果显示在终端上。

3.设计3.1数据结构设计抽象数据类型二叉树的定义如下:ADT BinaryTree{数据对象D:D是具有相同特性的数据元素的集合。

数据关系R:基本操作P:InitBiTree(&T);操作结果:构造空二叉树T。

DestroyBiTree(&T);初始条件:二叉树T存在。

操作结果:销毁二叉树T。

CreateBiTree(&T,definition);初始条件:definition给出二叉树T的定义。

操作结果:按definition构造二叉树T。

ClearBiTree(&T);初始条件:二叉树T存在。

操作结果:将二叉树T清为空树。

BiTreeEmpty(T);初始条件:二叉树T存在。

操作结果:若T为空二叉树。

则返回TRUE,否则FALSE。

BiTreeDepth(T);初始条件:二叉树T存在。

操作结果:返回T的深度。

Root(T);初始条件:二叉树T存在。

操作结果:返回T的根。

Value(T,e);初始条件:二叉树T的存在,e是T中某个结点。

操作结果:返回e的值。

Assign(T,&e,value);初始条件:二叉树T存在,e是T中某个结点。

操作结果:结点e赋值为value。

Parent(T,e);初始条件:二叉树T存在,e是T 中某个结点。

操作结果:若e是T的非根结点,则返回它的双亲,否则返回“空”。

DeleteChild(T,p,LR);初始条件:二叉树T存在,p指向T中某个结点,LR为0或1。

操作结果:根据LR为0或1,删除T中p所指结点的左或右子树。

InsertChild(T,p,LR,c);初始条件:二叉树的T存在,p指向T中某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空。

操作结果:根据LR为0或1,插入c为T中p所指结点的左或右子树。

P所指结点的原有左或右子树则成为c的右子树。

}3.2主要算法设计程序中一共定义了一个结构体和三个函数如下:struct Huffman//定义指向结点的结构体{int weight;//权值int parent,lchild,rchild;//父亲结点和左右结点的位置};void select(Huffman * ht,int i,int & s1,int & s2){//选择权值较小的两个作为新的叶子结点,用于huffman的构造。

int j,k;k=s1;for(j=0;j<i+1;j++)if(s1!=j&&j!=s2&&ht[j].parent==0){s1=j;break;}for(j=0;j<i+1;j++)if(s2!=j&&s1!=j&&j!=k&&ht[j].parent==0){s2=j;break;}for(j=1;j<=i;j++)if(ht[j].weight<ht[s1].weight&&ht[j].parent==0)s1=j;if(s1==s2){for(j=0;j<i+1;j++)if(s2!=j&&s1!=j&&j!=k&&ht[j].parent==0){s2=j;break;}}for(j=0;j<=i;j++)if(ht[j].weight<ht[s2].weight&&ht[j].parent==0&&j!=s1) s2=j; }void Huffmancoding(Huffman * ht,char * *&hc,int k){//对haffman进行编码int m,s1=0,s2=0,start,c,i,f,j;char * cd;m=2*k-1;for(i=k;i<m;i++)//构建huffman树{select(ht,i-1,s1,s2);//调用selec t函数ht[s1].parent=i;ht[s2].parent=i;ht[i].lchild=s1;ht[i].rchild=s2;ht[i].weight=ht[s1].weight+ht[s2].weight;}for(i=0;i<=k-1;i++)//对每个叶子结点进行编码{cd=new char[k];hc[i]=" ";for(j=0;j<k;j++)cd[j]=' ';start=k-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]=&cd[start+1];}}void frequency(int * & w,char str[100],int * & c,int n,int & k){//涵数用于统计输入的字符的权w(出现的次数)。

int i,j,m;for(i=0;i<n;i++){if(i==0){c[0]=0;continue;}for(j=0;j<i;j++)if(str[j]==str[i]){c[i]=c[j];break;}if(j= =i){c[i]=++k;}}for(j=0;j<=k;j++){for(m=0;m<n;m++)if(c[m]= =j)w[j]++;}}3.3测试用例设计已知某系统在通信联络中只可能出现八种字符,其概率分别为0.05;0.29;0.07;0.08;0.14;0.23;0.03;0.11,试设计哈夫曼编码。

设权w=(5,29;7;8;14;23;3;11),n=8,则m=15,构造哈夫曼树。

如下图:哈夫曼编码:4调试报告程序调试:(1.)当01序列解码成字符串时,要注意是否与已得出的字符串的编码匹配,如果不匹配,就把它后面的01序列截掉,不进行解码。

(2.)&表示函数的参数是按地址传递的,当函数有多个返回值而无法用return实现时,通常使用这种。

比如:void frequency(int * & w,char str[100],int * & c,int n,int & k)5结束语经验和体会:通过一个星期的努力,总算把课程设计给完成了,这是一个坚苦而又漫长的过程。

是啊,读了那么多年的书,课程设计可是第一次。

看着劳动成果,很欣慰!通过这次课程设计之后我觉得自己对书上知识的掌握有很大的欠缺,看了题目都不知道怎么下手,一点头绪都没有,之后自己认真看了一遍书上的知识,查阅了一些网上资料,我能熟练掌握了二叉树,然后在此基础上掌握理解haffman树和编码,熟知了二叉树的性质。

可是这点小进展远远不够,这只是一个小小的开始,只能程序的大概轮廓可以写出来了。

但是有很多的细节和特殊情况没法写上去,例如:用于huffman的构造;用于对haffman进行编码;用于统计输入的字符的权w(出现的次数);实现这些的程序不知道该怎么写。

后来经过同学的帮助和指导慢慢地程序里用到的函数通过哪些语句来实现它,那些关键的函数怎样把它们有机结合起来等等,总之,在同学的多次指导下一个完整的程序写出来了,我也努力地去读懂它,发现自己隐约读懂了它!真正的收获更多是思想上的,让我认识程序的复杂,自己的微不足道,“学无止境”头一次认识的这么深刻,察觉自己的不足。

在这次编程中,同学帮了我很多,我一个人是不能完成的。

查书,查资料,请教同学的过程就是我提高的过程,总之,通过这次的课程设计,我发现程序设计最重要的就是上机实践,以前只是看书,觉得看懂了,但是真正到机子上写程序时感觉无从下手,没有什么头绪,可能就是因为实际上机操作的太少了,以后需要在这方面好好地加强了。

以后的学习生活真的要踏踏实实,自己的计算机生涯必定是坎坷的,信心受挫了。

六、课程设计参考资料[1]《数据结构(STL框架)》,王晓东编著,清华大学出版社,出版或修订时间:2009年9月[2]《数据结构(C语言版)》,严蔚敏,吴伟民编著,出版社:清华大学出版社,出版或修订时间:1997年4月[3]《数据结构习题集(C语言版)》,严蔚敏,吴伟民,米宁编著,清华大学出版社,出版或修订时间:1999年2月起草人:杨克俭2010-6-22附录F1 源代码#include <iostream>using namespace std;struct Huffman//定义指向结点的结构体{int weight;//权值int parent,lchild,rchild;//父亲结点和左右结点的位置};void select(Huffman * ht,int i,int & s1,int & s2){//选择权值较小的两个作为新的叶子结点,用于huffman的构造。

相关文档
最新文档