多语言展示
当前在线:503今日阅读:57今日分享:41

哈夫曼编码/译码系统(树应用)

利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息,源代码在最后。
工具/原料
1

vc2010

2

电脑

方法/步骤
1

在本例中设置发送者和接受者两个功能,发送者的功能包括:①输入待传送的字符信息;②统计字符信息中出现的字符种类数和各字符出现的次数(频率);②根据字符的种类数和各自出现的次数建立哈夫曼树;③利用以上哈夫曼树求出各字符的哈夫曼编码;④将字符信息转换成对应的编码信息进行传送。接受者的功能包括:①接收发送者传送来的编码信息;②利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。从以上分析可发现,在本例中的主要算法有三个:(1)哈夫曼树的建立;(2)哈夫曼编码的生成;(3)对编码信息的翻译。

2

1.算法思想    输入字符串,建立求频率和即求权重函数,将数据返回到哈夫曼函数中,求出每个字符的编码,将数据返回到译码函数中进行运算得到编码。

3

.调试分析、测试结果先手动输入一段字符,将其先导入频率计算函数计算其权重, 然后返回到主函数里在被哈夫曼构造函数调用

4

接收信息,即调用译码函数

5

主函数调用frequence( r, m,n,t,R);求频率函数HuffmanCoding(HT,HC,n,t );哈夫曼编码函数change(r, R, m,HC, Z);译码函数

7

权重计算函数通过不断的比较循环求出每个字符的权重

8

源代码集合#include 'stdafx.h'#include# include # include # include # include using namespace std;typedef struct HTNode{ char zf; int weight; int parent,lchild,rchild;}*HuffmanTree; typedef char* * HuffmanCode; void select(HuffmanTree HT,int i,int& s1,int& s2) {  int j,k=1;                   while(HT[k].parent!=0)       k++;      s1=k;   for(j=1;j<=i;++j)          if(HT[j].parent==0&&HT[j].weightweight=*w; p->parent=0; p->lchild=0; p->rchild=0; } for(;i<=m;++i,++p) {  p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; }   for(i=n+1;i<=m;++i) {         int s1; int  s2; 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; HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]='\0'; for(i=1;i<=n;++i) {    int start=n-1;        HuffmanTree f;    for( int 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]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); cout<<'HT['<>v; if (v==2) cout<>v; char r[100]; if(v==1) { char r[100]; cout<<'请输入您要发送的信息'<

推荐信息