Huffman编码解码Word格式.docx
- 文档编号:20572345
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:15
- 大小:101.65KB
Huffman编码解码Word格式.docx
《Huffman编码解码Word格式.docx》由会员分享,可在线阅读,更多相关《Huffman编码解码Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
需要编码的文章为{d1,d2,…,dn},哈弗曼编码树,规定哈夫曼编码树的左分支代表0,右分支代表1,则从根结点到每个叶子结点所经过的路径组成的0和1的序列便为该叶子结点对应字符的编码,称为哈夫曼编码(HuffmanCode).
在哈夫曼编码树中,数的带权路径长度的含义是各个字符的码长与其出现次数的乘积之和,所以采用哈夫曼树构造的编码是一种能使字符串的编码总长度最短的不等长编码.由于哈夫曼编码树的每个字符结点都是叶子结点,它们不可能在根结点到其他字符结点的路径上,所以一个字符的哈夫曼编码不可能是另一个字符的哈夫曼编码的前缀,从而保证了解码的唯一性.构建一颗哈夫曼解码树对编码表进行解码并输出解码文章。
2.专周目的
利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。
现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。
本课程设计的目的是使学生学会分析待加工处理数据的特性,以便选择适当的逻辑结构、存储结构以及进行相应的算法设计。
学生在学习数据结构和算法设计的同时,培养学生的抽象思维能力、逻辑推理能力和创造性的思维方法,增强分析问题和解决问题的能力。
此次设计的哈夫曼编码译码系统,实现对给定报文的编码和译码,并且任意输入报文可以实现频数的统计,建立哈夫曼树以及编码译码的功能。
这是一个拥有完备功能的系统程序,对将所学到的知识运用到实践中,具有很好的学习和研究价值.
3.背景知识
在这个信息高速发展的时代,每时每刻都在进行着大量信息的传递,到处都离不开信息,它贯穿在人们日常的生活生产之中,对人们的影响日趋扩大,而利用哈夫曼编码进行通信则可以大大提高信道利用率,缩短信息传输时间,降低传输成本。
在生产中则可以更大可能的降低成本从而获得更大的利润,这也是信息时代发展的趋势所在。
文字处理是现代计算机应用的重要领域。
文本由字符组成,字符以某种编码形式存储在计算机中。
每个字符的编码可以是相等长度的,也可以是不等长度的。
ASCII编码是等长编码。
为了提高存储和处理文本的效率,在一些计算机应用场合,如数据通信,常采用不等长的编码,对常用的字符用较少的码位,不常出现的字符用较多的码位编码,从而减少文本的存储长度。
哈夫曼编码就是用于此目的的不等长编码方法。
4.设计与实现
4.1设计简介
所以本次设计就是通过构造哈夫曼树来生成哈夫曼编码,最终完成设计要求。
4.2设计方案论述
哈夫曼编码/译码程序主要由主函数、哈夫曼树类和各种功能函数组成,程序运行时首先进入主函数,对各种功能函数进行调用,从而实现了整个程序的运行。
将各种不同的函数分别包含在各自的结构体中,使整个程序结构更加的清晰明了,各功能相互独立且紧密联系,有利于编程的实现,同时也体现了面向对象设计语言的封装性。
在主菜单中运用了switch()函数和“case”语句,便于对整个程序操作和控制;
对数据保存在文档中,则运用了文件I/O流和C语言的文件处理方式,进行文件与内存之间输入,输出数据。
5、概要设计
5.1第一部分功能的实现
在主函数声明HuffmanTree类的结构体,然后用函数调用它的各类函数此函数能读在主函数中输入并统计每个单词出现的频率,然后建立哈夫曼树并对各个字符编码和保存相关信息。
然后对编码表进行译码,并保存翻译得到的信息。
5、2存储结构
在由哈夫曼算法构造的哈夫曼树中,非叶子结点的度均为2,根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1个结点,其中有n-1个非叶子结点,它们是在n-1次的合并过程中生成的.为了便于选取根结点权值最小的二叉树以及合并操作,数组元素的结点结构如图3-1所示.
weight
parent
lchild
rchild
图3-1哈夫曼树的结点结构
其中,
weight:
权值域,保存该结点的权值;
lchild:
指针域,保存该结点的左孩子结点在数组中的下标;
rchild:
指针域,保存该结点的右孩子结点在数组中的下标;
parent:
指针域,保存该结点的双亲结点在数组中的下标.
结构体申明如下:
typedefstruct
{
charwb[30];
intnum;
}wbs;
/*定义结构体,分别表单词,与单词个数*/
unsignedintweight;
unsignedintparent,lchild,rchild;
}HTNode,*HuffmanTree;
//动态分配数组存储哈夫曼树
intlchild,rchild;
};
六、
调试窗
七、专周小节
通过本次课程设计使我对哈夫曼树及哈夫曼编码有了更深刻的理解,同时对C,C++的编程以及算法的实现产生了比较大的兴趣。
还学到了许多在处理程序时的技巧和方法,这都对以后的学习大有裨益,以及感受到在编程设计中团队合作精神的重要性。
在这次程序设计中,我觉得重要的一点,那就是不要人云亦云,要有自己的主见,不管别人如何,一定要有自己的思想,并且始终不改变的去坚持,纵然,可能会遇到很多难以解决的困难,都要自始到终,相信自己能把这个程序做得出来。
当自己最终在自己的努力下完成任务的时候,那就会有更多属于自己的收获,包括成功的喜悦以及程序中体现的思想。
其次是我认为调试功能是整个编写程序过程中很重要的一个环节。
通过此次实验我对调试有了更加深刻的理解,懂得怎么样去调试程序,如何发现错误,如何更高效的改正,最终能把程序实现。
8、致谢
在本次课程设计的整个过程中,要特别感谢自始至终给我提供帮助和指导的X老师,是他耐心的指导才使得本次设计得以顺得完成,同时,也要感谢小组成员的不懈努力和互相配合,在此还要特别感谢为我们提供良好上机环境的学校.如果没有以上老师,同学和学校的帮助和支持,本次设计实难完成.再次感谢老师的精心辅导和同学的相互帮助,使我们顺利完成此次设计以及为学习以后的科目打下良好的基础.
参考文献
【1】C语言程序设计(第三版)谭浩强清华大学出版社2009.10
【2】数据结构(C版)。
杨剑主编清华大学出版社2011.11
附录:
程序代码如下:
/*
数据结构C语言版专周哈夫曼树
编译环境:
vC++6.0
作者:
1053104
成都电子高专计算机工程系
*/
#include<
malloc.h>
string.h>
stdio.h>
limits.h>
iostream.h>
//赫夫曼树和赫夫曼编码的存储表示
//动态分配数组存储哈夫曼树
typedefchar**HuffmanCode;
//动态分配数组存储哈夫曼编码表
typedefstructnode
intweight;
structnode*LChild,*RChild,*Parent;
structnode*next;
}HFMNode,*HFMTree;
/
#include"
hafuman.h"
intmin1(HuffmanTreet,inti)
{
intj,flag;
unsignedintk=UINT_MAX;
//取k为不小于可能的值
for(j=0;
j<
=i;
j++)
if(t[j].weight<
k&
&
t[j].parent==0)
k=t[j].weight,
flag=j;
t[flag].parent=1;
returnflag;
}
//s1为最小的两个值中序号小的那个
voidselect(HuffmanTreet,inti,int*s1,int*s2)
intj;
*s1=min1(t,i);
*s2=min1(t,i);
if(*s1>
*s2)
{
j=*s1;
*s1=*s2;
*s2=j;
//交换位置
}
//w存放n个字符的权值(均>
0),构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC
voidHuffmanCoding(HuffmanTree*HT,HuffmanCode*HC,int*w,intn)
intm,i,s1,s2,start;
unsignedc,f;
HuffmanTreep;
char*cd;
if(n<
=1)
return;
//空节点或者根节点
m=2*n-1;
//一颗有n个叶子结点的哈夫曼树共有2n-1个结点
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
//0号单元未用
for(p=*HT+1,i=1;
i<
=n;
++i,++p,++w)//初始化各结点的权值
(*p).weight=*w;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
for(;
=m;
++i,++p)//初始化双亲位置
for(i=n+1;
++i)//建哈夫曼树
//在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序
//号分别为s1和s2
select(*HT,i-1,&
s1,&
s2);
(*HT)[s1].parent=(*HT)[s2].parent=i;
(*HT)[i].lchild=s1;
(*HT)[i].rchild=s2;
(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
//从叶子到根逆向求每个字符的哈夫曼编码
*HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
//分配n个字符编码的头指针向量([0]不用)
cd=(char*)malloc(n*sizeof(char));
//分配求编码的工作空间
cd[n-1]='
\0'
;
//编码结束符
for(i=1;
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'
else
1'
(*HC)[i]=(char*)malloc((n-start)*sizeof(char));
//为第i个字符编码分配空间
strcpy((*HC)[i],&
cd[start]);
//从cd复制编码(串)到HC
free(cd);
//释放工作空间
intmain()
inti;
//OrderListlist;
char*p;
charfile[1000];
intx=1,y,m=0,n=0,sum;
intt,b;
intwb[100],j;
//PHNoderoot;
wbs*sz;
/*InitiList(&
list);
list.Compare=compareInt;
//装载比较回调函数
list.Vist=printInt;
//装载访问回调函数
for(i=0;
5;
AddElement(&
list,&
a[i]);
Tranverse(&
printf("
请输入一段英文:
\n"
);
gets(file);
p=file;
while(*p!
='
)
if(*p=='
'
x++;
//x表示单词个数
p++;
单词数:
%d\n"
x);
sum=x;
sz=(wbs*)malloc(sizeof(x));
for(y=0;
y<
x;
y++)
sz[y].num=1;
{
sz[m].wb[n]='
m++;
n=0;
p++;
//空格?
?
当作字符串结尾符
}
else
sz[m].wb[n]=*p;
//装单词入数组sz【m】
n++;
sz[m].wb[n]='
单词依次为:
"
puts(sz[y].wb);
//输出单词。
for(m=0;
m<
m++)
for(n=m+1;
n<
n++)
t=strcmp(sz[m].wb,sz[n].wb);
//比较是否有相同单词并以此计算权值
if(t==0)
{
sz[m].num++;
//相同的话单词权值加1
b=0;
while(sz[x-1].wb[b]!
=0)//最后的单词不为0
{
sz[n].wb[b]=sz[x-1].wb[b];
//拷贝最后的单词去覆盖相同的单词
b++;
}
sz[n].wb[b]='
//拷贝结束
x--;
//单词个数减一
n--;
//下标回指
}
b=0;
while(sz[y].wb[b]!
printf("
%c"
sz[y].wb[b]);
b++;
printf("
"
权值:
%5d\n"
sz[y].num);
HuffmanTreeHT;
HuffmanCodeHC;
int*w,k;
cout<
<
权值的个数为:
x<
endl;
w=(int*)malloc(x*sizeof(int));
哈夫曼编码为:
for(k=0;
k<
=x;
k++)
for(inta=0;
a<
200;
a++)
w=&
HuffmanCoding(&
HT,&
HC,w,x);
for(k=1;
puts(HC[k]);
哈夫曼译码为:
inty2=0;
intm2=2*x-1;
inti2;
intp2;
p2=m2;
for(i2=0;
i2<
m2;
i2++)
if(HT[p2].lchild!
=0&
HT[p2].rchild!
=0)
if(HC[i2]==0)
p2=HT[p2].lchild;
p2=HT[p2].rchild;
if(HT[p2].lchild==0)
{
sz[m].wb[n]='
for(y2=0;
y2<
y2++)//输出译码文章。
puts(sz[y2].wb);
printf("
p2=m2;
return0;
考核情况(由指导老师填写)
项目
考勤
(20%)
验收
(40%)
报告
总分
得分
记录
考勤日期
出勤记录
验
收
情
况
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Huffman 编码 解码