搜档网
当前位置:搜档网 › 哈夫曼编码译码器实验报告

哈夫曼编码译码器实验报告

哈夫曼编码译码器实验报告
哈夫曼编码译码器实验报告

中北大学

数据结构

课程设计说明书

学生姓名:学号:10210109

学院: 软件学院

专业: 软件开发与测试

题目: 哈夫曼编码/译码器

指导教师康珺

2011年12月20日

目录

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

2 需求分析.............................................................. 错误!未定义书签。

3 概要设计 (1)

3.1抽象数据类型定义 (1)

3.2总体框图以及功能描述 (2)

4 详细设计 (2)

4.1数据类型的定义 (2)

4.2主要模块的算法描述 (3)

5 测试分析 (4)

6 课程设计总结 (6)

附录(源程序清单) (7)

1 问题描述

1.设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

(1) 将权值数据存放在数据文件(文件名为data.txt,位于当前目录中);

(2) 分别采用动态和静态存储结构; 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;

(3) 编码:利用建好的哈夫曼树生成哈夫曼编码;输出编码;

设计要求:

(1) 符合课题要求,实现相应功能;

(2) 要求界面友好美观,操作方便易行;

(3) 注意程序的实用性、安全性。

2 需求分析

编写此软件是为了实现一个利用哈夫曼算法的编码和译码系统。比如,再利用电报进行通讯时,需要将文字转换成由二进制的字符组成的字符串。比如需传送的电文为“A B A C C D A”假设将A,B,C,D分别编码为00、01、10、11.则上述电文遍为00010010101100,总长度为14位。但是在传送过程中,总希望长度能够尽可能的短,于是我们想采用长度不等的编码。但是这种编码必须遵循:任何一个字符的编码都不是另一个字符编码的前缀。

对此软件的要求:能够正确的使得对于输入的字符进行编码以及译码,并且是的在译码过程中不会出错,同时能够将编码以及译码的结果正确的存入文件当中。

3 概要设计

3.1抽象数据类型定义

ADT BinaryTree{

数据对象:D={ai|ai∈ElemSet,i=1,2,...,n, n≥0}

数据关系:

若D为空集,则称为空树。

若D仅为一个数据元素,则R为空集,否则R={H},H是如下的二元关系:(1)再D中存在唯一的称为根的数据元素root,它在关系H下无前驱。

(2)若D-{root}<>空集,则存在一个划分D1,D2,···,Dm(m>0)。

(3)对应于D-{root}的划分,H-{} 有唯一的一个划分H1,H2,···,Hm(m>0)。

基本操作:

InitTree(&T)

操作结果:构造空树T。

DestroyTree(&T)

初始条件:树T已存在。

操作结果:树T被销毁。

ClearTree(&T)

初始条件:树T已存在。

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

TreeEmpty(T)

初始条件:树T已存在。

操作结果:若树T为空,则返回TRUE,否则FALSE。

TreeDepth(T)

初始条件:树T已存在。

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

Root(T)

初始条件:树T已存在。

操作结果:返回树T的根。

3.2总体框图以及功能描述

4 详细设计

4.1数据类型的定义

(1)哈夫曼树节点类型

struct hufmtreenode{ //哈弗曼树结点数据类型 char data;

float weight; //结点权值

int parent,lchild,rchild; //父结点,左、右孩子结点

};

(2)哈夫曼树类型

struct hufmtree{ //哈弗曼树数据类型 hufmtreenode *node; //结点数组(根据n的值动态分配) int n; //叶子结点数

};

(3)哈夫曼编码数据类型

struct Codetype{ //哈弗曼编码数据类型 char *bits; //编码流数组,

int start;//编码实际在编码流数组里的开始位置

}

4.2主要模块的算法描述

(1)主函数:

void main()

{

printf("哈夫曼编码译码系统\n");

tree=CreateHuffmanTreeFromSourceFile();//读取文件建立哈树tree=CreateHuffmanTreeByInput(); //手动输入建立哈夫曼树

HuffmanCode(tree); //打印字符集的哈夫曼编码

tree=Encoding(tree); //对文本文件编码

Decoding(tree); //对代码文件译码

}

(2)构造哈夫曼树

hufmtree* BuildHuffmanTree(hufmtree *tree){//构建叶子结点已初始化的哈夫曼树

For(p=HT,i=1;i<=n;++i,++p,++w)

*p={0,0,0,0};

For(;i<=m;++i,++p)

*p={0,0,0,0);

For(i=n+1;i<=m;i++)

{

Select(HT,i-1,s1,s2);

HT[s1].parent=i; HT[s2].parent=i;

HT[s1].parent=s1; HT[s1].parent=s2;

HT[i].weight=HT[s1].weight+HT[s2].weight; }

}

(3)利用哈夫曼编码算法哈夫曼编码

HuffmanCode(tree){

hc=(HuffmanCode)malloc((n+1*sizeof(char *))

cd=(char *)malloc(n*sizeof(char));

cd[n-1]="\0";

for(c=i;i<=n;++i)

start=n-1;

for(c=i;f=HT[i].parent;f!=0;c=f,f =HT[f].parent)

If(HT[f].lchild==c) cd[--start]='\0';

HC[i]=(car *)malloc((n-start)*sizeof(char));

Strcpy(HC[i],&cd[start]);

}

5 测试分析

(1)打开源文件统计各字符及权值信息并存入data.txt文件中

(2)将统计出的权值信息进行哈夫曼编码

(3)将编码内容存入CodeFile.txt文件中

(4)将CodeFile.txt文件中的内容译码

(5)成功译码把原字符信息存入DeCodeFile.txt文件中

(6)输入各字符及其权值

(7)将各字符的权值信息进行哈夫曼编码

(7)根据编码再进行译码工作

6 课程设计总结

课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握计算机开发技术是十分重要的。

回顾起此次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有

理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,这毕竟独立做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在谢老师的辛勤指导下,终于游逆而解。同时,在李玉蓉老师的《软件工程导论》课上我学得到很多实用的知识,在次我表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

附录(源程序清单)

#include

#include

#include

#define MAXVAL 10000.0

struct hufmtreenode{//哈弗曼树结点数据类型

char data;

double weight;//结点权值

int parent,lchild,rchild;//父结点,左、右孩子结点

};

struct hufmtree{//哈弗曼树数据类型

hufmtreenode *node;//结点数组(根据n的值动态分配)

int n;//叶子结点数

};

struct Codetype{//哈弗曼编码数据类型

char *bits;//编码流数组,n为为哈夫曼树中叶子结点的数目,编码的长度不可能超过n

int start;//编码实际在编码流数组里的开始位置

};

void SortHufmtree(hufmtree *tree){//将哈夫曼树n个叶子结点由大到小排序int i,j,k;

hufmtreenode temp;

if (tree==NULL)

return;

for (i=0;in;i++)

{

k=i;

for(j=i+1;jn;j++)

if (tree->node[j].weight>tree->node[k].weight)

k=j;

if (k!=i)

{

temp=tree->node[i];

tree->node[i]=tree->node[k];

tree->node[k]=temp;

}

}

}

Codetype* HuffmanCode(hufmtree *tree){//哈弗曼编码的生成int i,j,p,k;

Codetype *code;

if (tree==NULL)

return NULL;

code=(Codetype*)malloc(tree->n*sizeof(Codetype));

for (i=0;in;i++)

{

printf("%c ",tree->node[i].data);//打印字符信息

code[i].bits=(char*)malloc(tree->n*sizeof(char));

code[i].start=tree->n-1;

j=i;

p=tree->node[i].parent;

while(p!=-1){

if (tree->node[p].lchild==j)

code[i].bits[code[i].start]='0';

else

code[i].bits[code[i].start]='1';

code[i].start--;

j=p;

p=tree->node[p].parent;

}

for (k=code[i].start+1;kn;k++)//打印字符编码

printf("%c",code[i].bits[k]);

printf("\n");

}

return code;

}

hufmtree* BuildHuffmanTree(hufmtree *tree){//构建叶子结点已初始化的哈夫曼树

//tree中所有叶子结点已初始化

int i,j,p1,p2,m;

float small1,small2;

m=2*(tree->n)-1;

for (i=tree->n;i

{

tree->node[i].parent=-1;

tree->node[i].lchild=-1;

tree->node[i].rchild=-1;

tree->node[i].weight=0.0;

}

for (i=tree->n;i

{

small1=small2=MAXVAL;

for (j=0;j<=i-1;j++)

{

if (tree->node[j].parent==-1 &&

tree->node[j].weight<=small1)

{

small1=tree->node[j].weight;

p1=j;

}

}

for (j=0;j<=i-1;j++)

{

if (tree->node[j].parent==-1 && tree->node[j].weight<=small2 && (j!=p1))

{

small2=tree->node[j].weight;

p2=j;

}

}

tree->node[p1].parent=tree->node[p2].parent=i;

tree->node[i].weight=tree->node[p1].weight+tree->node[p2].weight;

tree->node[i].lchild=p1;

tree->node[i].rchild=p2;

}

return tree;

}

hufmtree* CreateHuffmanTreeFromSourceFile(){//通过解析源文件建立哈夫曼树

FILE *textfile,*datafile;

char ch,sourcefilename[100];

int i,j=0,n=0;

float count[128]; //用于统计字符在源文件中出现的次数,27表示26个英文字母和1个空格字符

hufmtree *tree;

//打开一个源文件

printf("\n请输入源文件所在路径:\n");

scanf("%s",sourcefilename);

if ((textfile=fopen(sourcefilename,"r"))==NULL){

printf("\n找不到文件%s\n",sourcefilename);

return NULL;

}

for(i=0;i<128;i++)

count[i]=0;

//对源文件中各字符的个数统计

ch=fgetc(textfile);

while(!feof(textfile)){

for(i=0;i<128;i++)

if (ch==char(i)){

count[i]++;

break;

}

ch=fgetc(textfile);

}

//将统计结果写入权值信息文件data.txt中,并构建哈夫曼树

datafile=fopen("f:\\data.txt","w");

for (i=0;i<128;i++)

if (count[i]!=0)

n++;

fprintf(datafile,"%d\n",n);

tree=(hufmtree*)malloc(sizeof(hufmtree));

tree->node=(hufmtreenode*)malloc((2*n-1)*sizeof(hufmtreenode)); tree->n=n;

printf("\n源文件的字符集及其权值信息如下:\n");

for(i=0;i<128;i++)

if (count[i]!=0)

{

//fprintf(datafile,"%c%f\n",char(i),count[i]);

fprintf(datafile,"%c %.0f\n",char(i),count[i]);

printf("%c %.0f\n",char(i),count[i]);

tree->node[j].data=char(i);

tree->node[j].weight=count[i];

tree->node[j].parent=-1;

tree->node[j].lchild=-1;

tree->node[j].rchild=-1;

j++;

}

SortHufmtree(tree);

BuildHuffmanTree(tree);

fclose(textfile);

fclose(datafile);

printf("\n哈夫曼树建立完毕,已将权值信息保存至data.txt\n");

return tree;

}

hufmtree* CreateHuffmanTreeByInput(){//通过用户输入建立哈夫曼树int n;

hufmtree *tree;

int i,m;

FILE *datafile;

tree=(hufmtree*)malloc(sizeof(hufmtree));

datafile=fopen("f:\\data.txt","w");

//由用户输入字符与权值信息并将其写入data.txt,同时进行哈夫曼树初始化

printf("请输入字符数:");

scanf("%d",&n);

if (n<=0)

{

printf("\n您的输入有误。\n");

return NULL;

}

tree->node=(hufmtreenode*)malloc((2*n-1)*sizeof(hufmtreenode));

tree->n=n;

m=2*n-1;

for (i=0;i

{

tree->node[i].parent=-1;

tree->node[i].lchild=-1;

tree->node[i].rchild=-1;

tree->node[i].weight=0.0;

}

fprintf(datafile,"%d\n",n);

for (i=0;i

{

printf("\n输入第%d个字符及其权值:",i+1);

tree->node[i].data=getche();

tree->node[i].weight=getche();

fprintf(datafile,"%c,%.0f\n",tree->node[i].data,tree->node[i].wei ght-48);

}

fclose(datafile);

//哈夫曼树构建

SortHufmtree(tree);

BuildHuffmanTree(tree);

printf("\n哈夫曼树建立完毕,已将权值信息保存至data.txt\n");

return tree;

}

hufmtree* CreateHuffmanTreeFromDataFile(){//通过读取权值信息文件建立哈夫曼树

FILE *datafile;

int i,n;

hufmtree *tree;

if ((datafile=fopen("f:\\data.txt","r"))==NULL){

printf("\n哈夫曼树尚未建立\n");

return NULL;

}

//哈夫曼树初始化

fscanf(datafile,"%d",&n);

fgetc(datafile);

tree=(hufmtree*)malloc(sizeof(hufmtree));

tree->node=(hufmtreenode*)malloc((2*n-1)*sizeof(hufmtreenode));

tree->n=n;

for (i=0;i

tree->node[i].data=fgetc(datafile);

fscanf(datafile,"%f\n",&tree->node[i].weight);

tree->node[i].parent=-1;

tree->node[i].lchild=-1;

tree->node[i].rchild=-1;

}

fclose(datafile);

//哈夫曼树构建

SortHufmtree(tree);

BuildHuffmanTree(tree);

return tree;

}

hufmtree* Encoding(hufmtree *tree){//对源文件进行编码并将其输出至新文

FILE *textfile,*codefile;

char ch,sourcefilename[50];

int i,j;

Codetype *code;

if (tree==NULL)//如果内存中尚未建立哈夫曼树

{//试从data.txt中读取权值信息并建立哈夫曼树tree=CreateHuffmanTreeFromDataFile();

if (tree==NULL)

return NULL;

}

//读取源文件

printf("\n请输入源文件所在路径:\n");

scanf("%s",sourcefilename);

if ((textfile=fopen(sourcefilename,"r"))==NULL){ printf("\n找不到文件%s\n",sourcefilename);

return NULL;

}

//打印源文件内容

printf("\n源文件的原文如下:\n");

ch=fgetc(textfile);

while(!feof(textfile)){

printf("%c",ch);

ch=fgetc(textfile);

}

//编码

printf("\n字符集的哈夫曼编码如下:\n");

code=HuffmanCode(tree);

//将源文件中各字符编码并写入codefile

codefile=fopen("f:\\CodeFile.txt","w");

fseek(textfile,0,SEEK_SET);

ch=fgetc(textfile);

while (!feof(textfile))

{

for(i=0;in;i++)

if (ch==tree->node[i].data){

for(j=code[i].start+1;jn;j++)

fputc(code[i].bits[j],codefile);

break;

}

if (i==tree->n)//在哈夫曼树树中找不到与文本内容里对应的字符{

printf("\n字符%c不在哈夫曼树中,不能正确编码。\n",ch);

fclose(codefile);

return NULL;

}

ch=fgetc(textfile);

}

fclose(codefile);

//提示成功信息并打印代码

printf("\n编码成功,已将代码写入CodeFile.txt,代码如下:\n"); codefile=fopen("f:\\CodeFile.txt","r");

哈夫曼树编码译码实验报告(DOC)

数据结构课程设计设计题目:哈夫曼树编码译码

目录 第一章需求分析 (1) 第二章设计要求 (1) 第三章概要设计 (2) (1)其主要流程图如图1-1所示。 (3) (2)设计包含的几个方面 (4) 第四章详细设计 (4) (1)①哈夫曼树的存储结构描述为: (4) (2)哈弗曼编码 (5) (3)哈弗曼译码 (7) (4)主函数 (8) (5)显示部分源程序: (8) 第五章调试结果 (10) 第六章心得体会 (12) 第七章参考文献 (12) 附录: (12)

在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。 第二章设计要求 对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,∑WiLi 恰好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。设计实现的功能: (1) 哈夫曼树的建立; (2) 哈夫曼编码的生成; (3) 编码文件的译码。

哈夫曼编码实验报告

中南大学数据结构课程 姓名:刘阳 班级:信息0703 学号:0903070312 实验时间: 08.11.14 指导老师:赵颖

一、实验内容 根据输入的n 个带权结点,构造出哈夫曼树,并且把构造结果输出到屏幕。 二、实验说明 哈夫曼数,也称最优二叉树,是指对于一组带有确定权值的叶结点,构造的具有最小带权路径长度的二叉树。 设二叉树具有n 个带权值的叶结点,那么从根结点到各个叶结点的路径长度与相应结点权值的乘积之和叫做二叉树的带权路径长度WPL ,记作: WPL=k n k k L W *∑=1。在给定一组具有确定权值的叶结点,可以构造出不同的带权二 叉树。根据哈夫曼树的定义,一棵二叉树要使其WPL 值最小,必须使权值越大的叶结点越靠近根结点,而权值越小的叶结点越远离根结点。 在数据通讯中,经常需要将传送的文字转换成由二进制字符0,1组成的二进制串,我们称之为编码。例如,假设要传送的电文为ABACCDA ,电文中只含有A ,B ,C ,D 四种字符,若这四种字符采用下表所示的编码,则电文的代码为000010000100100111 000,长度为21。 在传送电文时,我们总是希望传送时间尽可能短,这就要求电文代码尽可能短。如果在编码时考虑字符出现的频率,让出现频率高的字符采用尽可能短的编码,出现频率低的字符采用稍长的编码,构造一种不等长编码,则电文的代码就可能更短。并且在建立不等长编码时,必须使任何一个字符的编码都不是另一个字符编码的前缀,以避免反译成原文时,编码出现多义性。 在哈夫曼编码树中,树的带权路径长度的含义是各个字符的码长与其出现次数的乘积之和,也就是电文的代码总长,所以采用哈夫曼树构造的编码是一种能使电文代码总长最短的不等长编码。 采用哈夫曼树进行编码,也不会产生上述二义性问题。因为,在哈夫曼树中,每个字符结点都是叶结点,它们不可能在根结点到其它字符结点的路径上,所以一个字符的哈夫曼编码不可能是另一个字符的哈夫曼编码的前缀,从而保证了译码的非二义性。

数据结构实验报告哈夫曼树

数据结构实验报告实验题目: Huffman编码与解码 姓名: 学号: 院系:

实验名称: Huffman编码与解码实验 问题描述: 本实验需要以菜单形式完成以下功能: 1、输入电文串 2、统计电文串中各个字符及其出现的次数 3、构造哈弗曼树 4、进行哈弗曼编码 5、将电文翻译成比特流并打印出来 6、将比特流还原成电文 数据结构的描述: 逻辑结构: 本实验可用二叉树实现,其逻辑结构为一对二的形式,即一个结点对应两个结点。在实验过程中我们也应用到了栈的概念。 存储结构: 使用结构体来对数据进行存储: typedef struct { int weight; int parent,lc,rc; }HTNode,*HuffmanTree; typedef struct LNode { char *elem; int stacksize; int top; }SqStack; 在main函数里面定义一个哈弗曼树并实现上述各种功能。 程序结构的描述: 本次实验一共构造了10个函数: 1.void HuffTree(HuffmanTree &HT,int n[],int mun); 此函数根据给定的mun个权值构建哈弗曼树,n[]用于存放num个权值。 2、void Select(HuffmanTree &HT,int n,int i,int &s1,int &s2);

此函数用于在HT[1,i-1]中选择parent为0且weight为最小的两个结点,其下标分别为s1,s2、 3.void HuffmanCoding(HuffmanTree HT,char **&HC,int n); 此函数从哈弗曼树HT上求得n 个叶子结点的哈弗曼编码并存入数组HC中。 4.void Coding(HuffmanTree HT,char **HC,int root,SqStack &S); 此函数用于哈弗曼编码,先序遍历哈弗曼树HT,求得每个叶子结点的编码字符串,存入数组HC,S为一个顺序栈,用来记录遍历路径,root就是哈弗曼数组HT中根结点的位置下标。 5.void InitStack(SqStack &S); 此函数用于初始化一个栈。 6.void Pop(SqStack &S,char e); 此函数为出栈操作。 7.void Push(SqStack &S,char e); 此函数为进栈操作。 8.int StackLength(SqStack S); 此函数用于求栈长,返回一个int型的值。 9.int Find(char a,char s[],int num); 此函数用于查找字符a在电文串中的位置。 10.int Recover(HuffmanTree HT,char **HC,char string[],char a[],char b[],int n); 此函数用于将比特流还原成电文。 调试分析: 输入任意一个字符串,如输入welcometoustc:运行结果如下:

霍夫曼树实验报告

实验二二叉树的遍历及霍夫曼编码 班级:计科1101班 学号:0909101605 姓名:杜茂鹏 2013年5月22日

一、实验目的 掌握二叉树的建立及遍历操作,霍夫曼编码基本操作及存储结构表示 二、实验内容 1. 系统要求包含以下功能 1)初始化:从终端读入字符集大小n,以及n个字符和n个权值(或者读入字符集和频度数据文件),建立哈夫曼树,并将哈夫曼树存入到文件HfmTree 中。 2)编码:利用已建好的哈夫曼树(如果不在内存中,则从文件中读入),从文件ToBeTran中读入原文,对原文进行编码,将编码后的结果存入文件CodeFile 中。 3)译码:利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 4)打印:打印输出哈夫曼树,显示ToBeTran, TextFile和CodeFile文件的内容。 三、实验要求 1.在上机前写出全部源程序; 2.能在机器上正确运行程序; 3.用户界面友好。 四、概要设计 1)首先动态分配数组存储霍夫曼树及存储霍夫曼编码表,然后从终端或文件读入霍夫曼树的字符变量及其频度,初始化建立霍夫曼树并将其写入文件HfmTree.txt中。 2)从指定的文件succe.txt中读入原文,利用已经编好的霍夫曼树对其编码,将编码结果写入文件Coding.txt保存。 3)利用已建好的哈夫曼树将文件Coding.txt中的代码进行译码,结果存入文件decoding.txt中。

五、测试数据: 2.原文内容“THIS IS MY PROGRAM” 六、详细设计 实验内容(原理、操作步骤、程序代码) //建立霍夫曼树,对原文进行编码、译码 #include #include #include #include typedef struct tree { char ch; int weight;//权值 int parent,lchild,rchild; }HTNode,*HuffmanTree;//动态分配数组存储霍夫曼树typedef char **HuffmanCode;//动态分配数组存储霍夫曼编码表void Select(HuffmanTree &HT,int* s1,int* s2,int n) { int j; int min1=10000; for(j=1;j<=n;j++) { if(HT[j].parent==0&&min1>HT[j].weight)

哈夫曼树实验报告

哈夫曼树实验报告 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】

计算机科学与技术学院数据结构实验报告 班级 2014级计算机1班学号姓名张建华成绩 实验项目简单哈夫曼编/译码的设计与实现实验日期一、实验目的 本实验的目的是进一步理解哈夫曼树的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 二、实验问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此实验即设计这样的一个简单编/码系统。系统应该具有如下的几个功能: 1、接收原始数据。 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件中。 2、编码。 利用已建好的哈夫曼树(如不在内存,则从文件中读入),对文件中的正文进行编码,然后将结果存入文件中。 3、译码。 利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。 4、打印编码规则。 即字符与编码的一一对应关系。 5、打印哈夫曼树, 将已在内存中的哈夫曼树以直观的方式显示在终端上。 三、实验步骤 1、实验问题分析 1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。 在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1,描述结点的数据类型为: Typedef strcut { Int weight;/*结点权值*/ Int parent; Int lchild; Int rchild; }HNodeType; 2、求哈夫曼编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。 求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,没回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路

哈夫曼树 实验报告

计算机科学与技术学院数据结构实验报告 班级 2014级计算机1班学号姓名张建华成绩 实验项目简单哈夫曼编/译码的设计与实现实验日期一、实验目的本实验的目的是进一步理解哈夫曼树的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。 二、实验问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码,此实验即设计这样的一个简单编/码系统。系统应该具有如下的几个功能: 1、接收原始数据。 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件中。 2、编码。 利用已建好的哈夫曼树(如不在内存,则从文件中读入),对文件中的正文进行编码,然后将结果存入文件中。 3、译码。 利用已建好的哈夫曼树将文件中的代码进行译码,结果存入文件中。 4、打印编码规则。 即字符与编码的一一对应关系。 5、打印哈夫曼树,

将已在内存中的哈夫曼树以直观的方式显示在终端上。 三、实验步骤 1、实验问题分析 1、构造哈夫曼树时使用静态链表作为哈夫曼树的存储。 在构造哈夫曼树时,设计一个结构体数组HuffNode保存哈夫曼树中各结点的信息,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,所以数组HuffNode的大小设置为2n-1,描述结点的数据类型为:Typedef strcut { Int weight;/*结点权值*/ Int parent; Int lchild; Int rchild; }HNodeType; 2、求哈夫曼编码时使用一维结构数组HuffCode作为哈夫曼编码信息的存储。 求哈夫曼编码,实质上就是在已建立的哈夫曼树中,从叶子结点开始,沿结点的双亲链域回退到根结点,没回退一步,就走过了哈夫曼树的一个分支,从而得到一位哈夫曼码值,由于一个字符的哈夫曼编码是从根结点到相应叶子结点所经过的路径上各分支所组成的0、1序列,因此先得到的分支代码为所求编码的低位码,后得到的分支代码位所求编码的高位码,所以设计如下数据类型: #define MAXBIT 10

哈夫曼树的实验报告1

一、需求分析 1、本演示程序实现Haffman编/译码器的作用,目的是为信息收发站提供一个编/译系统, 从而使信息收发站利用Haffman编码进行通讯,力求达到提高信道利用率,缩短时间,降低成本等目标。系统要实现的两个基本功能就是:①对需要传送的数据预先编码; ②对从接收端接收的数据进行译码; 2、本演示程序需要在终端上读入n个字符(字符型)及其权值(整形),用于建立Huffman 树,存储在文件hfmanTree.txt中;如果用户觉得不够清晰还可以打印以凹入表形式显示的Huffman树; 3、本演示程序根据建好的Huffman树,对文件的文本进行编码,结果存入文件CodeFile 中;然后利用建好的Huffman树将文件CodeFile中的代码进行译码,结果存入文件TextFile中;最后在屏幕上显示代码(每行50个),同时显示对CodeFile中代码翻译后的结果; 4、本演示程序将综合使用C++和C语言; 5、测试数据: (1)教材例6-2中数据:8个字符,概率分别是0.05,0.29,0.07,0.08,0.14,0.23,0.03, 0.11,可将其的权值看为5,29,7,8,14,23,3,11 (2)用下表给出的字符集和频度的实际统计数据建立Haffman树,并实现以下报文的编码和 一、概要设计 1、设定哈夫曼树的抽象数据类型定义 ADT Huffmantree{ 数据对象:D={a i| a i∈Charset,i=1,2,3,……n,n≥0} 数据关系:R1={< a i-1, a i >| a i-1, a i∈D, i=2,3,……n} 基本操作: Initialization(&HT,&HC,w,n,ch) 操作结果:根据n个字符及其它们的权值w[i],建立Huffman树HT,用字符数组ch[i]作为中间存储变量,最后字符编码存到HC中; Encodeing(n) 操作结果:根据建好的Huffman树,对文件进行编码,编码结果存入到文件CodeFile 中 Decodeing(HT,n) 操作结果:根据已经编译好的包含n个字符的Huffman树HT,将文件的代码进行翻译,结果存入文件TextFile中 } ADT Huffmantree

哈夫曼树实验报告

数据结构实验报告 实验名称:实验三哈夫曼树 学生姓名: 班级: 班内序号: 学号: 日期: 程序分析: 存储结构:二叉树 程序流程: template class BiTree { public: ) 1.初始化链表的头结点

2.获得输入字符串的第一个字符,并将其插入到链表尾部,n=1(n记录的是链 表中字符的个数) 3.从字符串第2个字符开始,逐个取出字符串中的字符 将当前取出的字符与链表中已经存在的字符逐个比较,如果当前取出的 字符与链表中已经存在的某个字符相同,则链表中该字符的权值加1。 如果当前取出的字符与链表中已经存在的字符都不相同,则将其加入到 链表尾部,同时n++ =n(tSize记录链表中字符总数,即哈夫曼树中叶子节点总数) 5.创建哈夫曼树 6.销毁链表 源代码: void HuffmanTree::Init(string Input) { Node *front=new Node; 建哈夫曼树(void HuffmanTree::CreateCodeTable(Node *p)) 算法伪代码: 1.创建一个长度为2*tSize-1的三叉链表 2.将存储字符及其权值的链表中的字符逐个写入三叉链表的前tSize个结点 的data域,并将对应结点的孩子域和双亲域赋为空 3.从三叉链表的第tSize个结点开始,i=tSize 3.1从存储字符及其权值的链表中取出两个权值最小的结点x,y,记录其 下标x,y。 3.2将下标为x和y的哈夫曼树的结点的双亲设置为第i个结点 3.3将下标为x的结点设置为i结点的左孩子,将下标为y的结点设置为 i结点的右孩子,i结点的权值为x结点的权值加上y结点的权值,i 结点的双亲设置为空 4. 根据哈夫曼树创建编码表

数据结构实验三哈夫曼树实验报告

数据结构实验三哈夫曼树实验报告

题目:哈夫曼编/译码器 一、题目要求: 写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0. 二、概要设计: 数据结构: typedef struct { int bit[MAXBIT]; int start; } HCodeType; /* 编码结构体 */

typedef struct { int weight; int parent; int lchild; int rchild; char value; } HNode; /* 结点结构体 */ 函数: void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n) 作用:构造一个哈夫曼树,并循环构建 int main () 作用:运用已经构建好的哈弗曼树,进行节点的处理,达到成功解码编译 三、详细设计: 哈夫曼树的建立: void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n) { int i = 0, j, m1, m2, x1, x2; char x;

/* 初始化存放哈夫曼树数组HuffNode[] 中的结点*/ while (i

哈夫曼树及其操作-数据结构实验报告(2)

电子科技大学 实验报告 课程名称:数据结构与算法 学生姓名:陈*浩 学号:************* 点名序号: *** 指导教师:钱** 实验地点:基础实验大楼 实验时间: 2014-2015-2学期 信息与软件工程学院

实验报告(二) 学生姓名:陈**浩学号:*************指导教师:钱** 实验地点:科研教学楼A508实验时间:一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法—树 三、实验学时:4 四、实验原理: 霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的。 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。 例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个比特。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。 霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。 可以证明霍夫曼树的WPL是最小的。

数据结构实验三哈夫曼树实验报告

题目:哈夫曼编/译码器 一、题目要求: 写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0. 二、概要设计: 数据结构: typedef struct { int bit[MAXBIT]; int start; } HCodeType; /* 编码结构体 */ typedef struct { int weight; int parent; int lchild; int rchild; char value; } HNode; /* 结点结构体 */ 函数: void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n) 作用:构造一个哈夫曼树,并循环构建 int main () 作用:运用已经构建好的哈弗曼树,进行节点的处理,达到成功解码编译 三、详细设计: 哈夫曼树的建立: void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n) { int i = 0, j, m1, m2, x1, x2; char x; /* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */ while (i

HuffNode[i].rchild =-1; scanf("%c",&x); scanf("%c",&HuffNode[i].value); //实际值,可根据情况替换为字母 i++; } /* 输入 n 个叶子结点的权值 */ scanf("%c",&x); for(i=0;i

实验报告(哈夫曼编码)

一.实验内容描述 1.实验名称: 哈夫曼编码译码器 2.实验内容: 利用哈夫曼树实现电文和比特流互相转换的功能。 二.存储结构分析 1.存储需编码字符的字符型数组 chars[N] 2.哈夫曼树的结点元素存储结构 typedef struct { int weight,parent,left,right; }HTNode; 3.哈夫曼树存储结构 typedef struct { HTNode *Htree; int root; }HuffmanTree; 4.存储每个字符对应的编码的二维数组 HC[N][N]; 三.数据结构分析 1.宏定义 OK为1,Error为0 ,定义Status为int型,N为100,方便调节。 2.自定义结点结构:包括整型变量weight,parent,left,right;字符型变量等。 3.定义数组HC[N][N],二维数组,可实现编码的存储。 四.程序功能 ======Huffman编码解码器====== 1----------输入字符创建编码 2----------输出统计结果 3----------打印哈夫曼树 4----------打印哈夫曼编码 5----------电文->比特流 6----------比特流->电文 五.各函数分析 1.主函数 (1)问题描述 显示功能菜单,等待选择。

1,输入字符创建编码:输入一段字符串,存储到字符型数组中。 2,输出统计结果:对1中读取的字符串进行统计,输出字符及相应个数。 3,打印哈夫曼树:生成哈夫曼树,并打印其存储数组。 4,打印哈夫曼编码:利用哈夫曼树对字符编码,输出字符及相应编码。 5,电文->比特流:输入一段字符,完成对其的编码,输出。 6,比特流->电文:输入一段编码,完成对其的译码,输出相应字符串。 2.统计字符函数 (1)问题描述:从主函数读取输入的字符串,统计个数,完成输出相应字符串及个数。(2)算法分析:依次读取字符,先判断读取的字符是否出现过,循环比较,出现过则对应个数加1,未出现过填入chars[N]数组,个数为1。 算法的时空分析:时间复杂度0(n):最低,当所有字符重复。 时间复杂度O(n2):n*(1+n)/2 最高,当所有字符不相同。 (3)数据结构:用chars[]字符型数组存储字符,num[]存储各字符相应个数。 (4)程序结构:从主函数直接调用。 (5)调试分析:输入字符串 aabbbbbccddddefffggh (6)测试结果:如图为输入、输出结果 3. 查找最小权值点函数 (1)问题描述:访问哈夫曼树组结点,在结点parent值为0的节点中,挑选最小权值的点。(2)算法分析:min初始化为0,依次读取数组结点元素,当parent值为0时,权值与最小值相比较,小则赋值给最小值,用k记录节点位置,全部比较完后,返回最小值点k。 算法的时空分析:时间复杂度0(n) (3)数据结构:二维数组存储哈夫曼树,整型变量min。 (4)程序结构:从生成哈夫曼树函数中调用。 4.创建哈夫曼树函数 (1)问题描述:读取字符串,生成哈夫曼树. (2)算法分析:读取字符及个数,个数作为权值填入哈夫曼数组中,parent,left,right 初始化为0.选择两个最小值点,生成新结点,三个结点的parent,left,right值依次填写。再选择最小值点,以此循环,直至除最后一个所有结点parent值不为0. 算法的时空分析:时间复杂度O(n2):2*(n+n+1+n+2+…+2n-1)=3*n2-n (3)数据结构:二维数组存储哈夫曼树,整型变量weight,parent,left,right。 (4)程序结构:从主函数中调用,调用了查找最小权值点函数。 (5)调试分析:用输入的字符串创建哈夫曼树,打印数组。 (6)测试结果:如图为输入、输出结果,

哈夫曼树实验报告(付原C语言程序)

哈夫曼树实验报告 需求分析: 从终端读入一串字符,利用建立好的哈夫曼树对其进行编码,储存到文件当中去,然后从文件读入哈夫曼编码,针对每个字母对其进行译码,翻译为原来的信息。 二、概要设计 程序分为以下几个模块: 1、从终端读入字符集大小,n个字符和n个权值,建立哈夫曼树,写入文件hfmTree中去。 2、对hfmTree进行编码,建立hfm编码表。 3、从文件ToTran读入信息,根据hfm编码表对其进行hfm编码,将编码后的信息写入文件Codefile 中去 4、对Codefile文件反向译码,结果储存在Textfile中去。 5、将建立的hfmTree打印在终端上,并储存于相应的Treeprint文件中去。 抽象的数据定义如下: 哈夫曼树结构 typedef struct //定义哈夫曼树的结构 { int weight; //权值 int parent; //双亲 int lchild; //左孩子 int rchild; //右孩子 }htnode,huffmantree[M+1]; 建立哈夫曼树 void crthuffmantree(huffmantree ht,int w[],int n) //初始化哈夫曼树 { int i,s1,s2,m; for(i=1;i<=n;i++) { ht[i].weight=w[i]; ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } m=2*n-1; for(i=n+1;i<=m;i++) { ht[i].weight=0; ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } for(i=n+1;i<=m;i++) { select(ht,i-1,&s1,&s2); ht[i].weight=ht[s1].weight+ht[s2].weight; ht[s1].parent=i;

哈夫曼编码实验报告

哈夫曼编码: 哈夫曼编码,又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码。 发展历史: 1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者香农共同研究过类似编码的导师。 1952年,David A. Huffman在麻省理工攻读博士时发表了《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文,它一般就叫做Huffman编码。 Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的这种编码思想提出了一种不定长编码的方法,也称霍夫曼(Huffman)编码。霍夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。编码后的

图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。 赫夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就称Huffman 编码。下面引证一个定理,该定理保证了按字符出现概率分配码长,可使平均码长最短。

树和哈夫曼树实验报告

树和哈夫曼树实验报告 一.实验目的 练习树和哈夫曼树的有关操作,和各个算法程序,理解哈夫曼树的编码和译码 二.实验环境 Microsoft visual c++ 三.实验问题描述 1. 问题描述:建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。 基本要求:从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立),并将此二叉树按照“树状形式”打印输出,然后对其进行遍历(先序、中序和后序),最后将遍历结果打印输出。在遍历算法中要求至少有一种遍历采用非递归方法。 测试数据: ABC??DE?G??F???(其中?表示空格字符) 输出结果为: 先序:ABCDEGF 先序:CBEGDFA 先序:CGEFDBA 2. 问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接受端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编/译码系统。 基本要求:(至少完成功能1-2) 一个完整的系统应具有以下功能: I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 基本要求: E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 D:译码(Decoding )。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。 T:印哈夫曼树(TreePrinting)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。 测试数据: 设权值w=(5,29,7,8,14,23,3,11),n=8。 按照字符‘0’或‘1’确定找左孩子或右孩子,则权值对应的编码为: 5:0001,29:11,7:1110,8:1111 14:110,23:01,3:0000,11:001 用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FAVORITE”。 四.实验主要程序流

数据结构课程设计实验报告哈夫曼树的应用

计算机学院信管专业 数据结构课程设计 题目:哈夫曼树的应用班级: 姓名:学号: 同组人姓名: 起迄日期: 课程设计地点: 指导教师: 评阅意见: 成绩评定: 评阅人:日期: 完成日期:2012年12月

目录 一、需求分析 (3) 二、概要设计 (4) 三、详细设计 (6) 四、调试分析和测试结果 (7) 五、心得体会和总结 (10) 六、参考文献 (10) 七、附录 (11)

一、需求分析 (一)实验要求 要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。 要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。 问题是将输入的信息保存入文件和从文件输出。这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。 综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C++知识(本次我将使用C++实现),以及丰富的程序调适经验。 (二)实验任务 一个完整的系统应具有以下功能: 功能1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上; 功能2.利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式先是在终端上,每行50个代码。同时将此字符形式的编码文件写入文件CodePrint中。 功能3.利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。 (三)实验步骤 分步实施: 1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2)完成最低要求:完成功能1; 3)进一步要求:完成功能2和3。有兴趣的同学可以自己扩充系统功能。要求: 1)界面友好,函数功能要划分好 2)总体设计应画一流程图 3)程序要加必要的注释 4) 要提供程序测试方案 5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。

哈夫曼树及其操作-数据结构实验报告(2)

电子科技大学实验报告 课程名称:数据结构与算法学生姓名:陈*浩 学号:************* 点名序号:*** 指导教师:钱** 实验地点:基础实验大楼 实验时间:2015.5.7 2014-2015-2学期 信息与软件工程学院

实验报告(二) 学生姓名:陈**浩学号:*************指导教师:钱** 实验地点:科研教学楼A508实验时间:2015.5.7 一、实验室名称:软件实验室 二、实验项目名称:数据结构与算法—树 三、实验学时:4 四、实验原理: 霍夫曼编码(Huffman Coding)是一种编码方式,是一种用于无损数据压缩的熵编码(权编码)算法。1952年,David A. Huffman在麻省理工攻读博士时所发明的。 在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。 例如,在英文中,e的出现机率最高,而z的出现概率则最低。当利用霍夫曼编码对一篇英文进行压缩时,e极有可能用一个比特来表示,而z则可能花去25个比特(不是26)。用普通的表示方法时,每个英文字母均占用一个字节(byte),即8个比特。二者相比,e使用了一般编码的1/8的长度,z则使用了3倍多。倘若我们能实现对于英文中各个字母出现概率的较准确的估算,就可以大幅度提高无损压缩的比例。 霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是从树根到每一结点的路径长度之和,记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。 可以证明霍夫曼树的WPL是最小的。

数据结构实验报告(哈夫曼树)

数据结构实验报告实验题目:Huffman编码与解码 姓名: 学号: 院系:

实验名称: Huffman编码与解码实验 问题描述: 本实验需要以菜单形式完成以下功能: 1.输入电文串 2.统计电文串中各个字符及其出现的次数 3.构造哈弗曼树 4.进行哈弗曼编码 5.将电文翻译成比特流并打印出来 6.将比特流还原成电文 数据结构的描述: 逻辑结构: 本实验可用二叉树实现,其逻辑结构为一对二的形式,即一个结点对应两个结点。在实验过程中我们也应用到了栈的概念。 存储结构: 使用结构体来对数据进行存储: typedef struct { int weight; int parent,lc,rc; }HTNode,*HuffmanTree; typedef struct LNode { char *elem; int stacksize; int top; }SqStack; 在main函数里面定义一个哈弗曼树并实现上述各种功能。 程序结构的描述: 本次实验一共构造了10个函数: 1.void HuffTree(HuffmanTree &HT,int n[],int mun); 此函数根据给定的mun个权值构建哈弗曼树,n[]用于存放num个权值。 2.void Select(HuffmanTree &HT,int n,int i,int &s1,int &s2);

此函数用于在HT[1,i-1]中选择parent为0且weight为最小的两个结点,其下标分别为s1,s2. 3.void HuffmanCoding(HuffmanTree HT,char **&HC,int n); 此函数从哈弗曼树HT上求得n 个叶子结点的哈弗曼编码并存入数组HC中。 4.void Coding(HuffmanTree HT,char **HC,int root,SqStack &S); 此函数用于哈弗曼编码,先序遍历哈弗曼树HT,求得每个叶子结点的编码字符串,存入数组HC,S为一个顺序栈,用来记录遍历路径,root是哈弗曼数组HT中根结点的位置下标。 5.void InitStack(SqStack &S); 此函数用于初始化一个栈。 6.void Pop(SqStack &S,char e); 此函数为出栈操作。 7.void Push(SqStack &S,char e); 此函数为进栈操作。 8.int StackLength(SqStack S); 此函数用于求栈长,返回一个int型的值。 9.int Find(char a,char s[],int num); 此函数用于查找字符a在电文串中的位置。 10.int Recover(HuffmanTree HT,char **HC,char string[],char a[],char b[],int n); 此函数用于将比特流还原成电文。 调试分析: 输入任意一个字符串,如输入welcometoustc:运行结果如下:

相关主题