- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哈夫曼编译码器
哈夫曼编/译码器
任务:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接受端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。
功能要求:
(1) 初始化(readdata)。从终端读入字符集大小n,以及n个字符和n个权值。
(2) 建立哈夫曼树(createhuff)。根据n个字符和n个权值建立哈夫曼树,并可以将建好的哈夫曼树显示在终端上。
(3) 编码(encoding)。利用已建好的哈夫曼树,对输入(或文件file1.txt中)的正文进行编码,然后将结果在终端输出(或存入文件file2.txt)。
(4) 译码(decoding)。利用已建好的哈夫曼树将内存(或文件file2.txt)中的代码进行译码,结果在终端输出(或存入文件file3.txt)。
测试数据
用下表给出的字符集和频度的实际统计数据建立哈夫曼树
字符 空格 a b c d e f g h i j k l m
频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20
字符 n o p q r s t u v w x y z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1
算法设计思想:
设w存放n个字符和n个权值,可用顺序存储结构(也可用链式存储结构)ht存储哈夫曼树,用hc存储n个字符的哈夫曼编码。根据w中存放的数据,可以用课本上的算法建立哈夫曼树,也可用其他的方法建立哈夫曼树;对于编码,可以对已建立的哈夫曼树,求出n个字符的编码,存放于hc,这过程可以从每一叶子结点开始到根结点的顺序来生成。然后,对要编码的报文根据hc中的码表进行编码并输出(也可存于一文件);对于译码,可以根据输入(或从文件读入)的代码,根据哈夫曼树来译码,其方法是,从哈夫曼树的根结点开始,碰到为‘0’的代码转向左孩子,碰到‘1’的代码转向右孩子,直至叶子结点,该叶子结点的有关数据就是一个所要译的码,这样重复进行,到代码译完为止。
源代码:
#includeiostream
#includefstream
#includeiomanip
#includecstring
#includecstdio
using namespace std;
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef struct
{
char ch;
char *hufCh;
}HuffmanCode;
typedef struct
{
char ch;
int wt;
}wElem;
void Select(HuffmanTree HT,int i,int s1, int s2)
{
unsigned int sm1,sm2;
s1=1;s2=1;
int m=0;
for(m=1;m=1;m++)
{
if(HT[m].parent!=0)continue;
else
{
sm1=HT[m].weight;
s1=m;break;
}
}
for(int j=m+1;j=i;j++)
{
if(HT[j].parent!=0)continue;
else
{
if(sm1HT[j].weight)
{
sm1=HT[j].weight;
s1=j;
}
}
}
for(m=1;m=i;m++)
{
if(HT[m].parent!=0)continue;
else
{
sm2=HT[m].weight;
s2=m;
if(s2==s1)continue;
else break;
}
}
for(int k=m+1;k=i;k++)
{
if(HT[k].parent!=0)continue;
else
{
if((HT[k].weightsm2)(k!=s1))
{
sm2=HT[k].weight;
s2=k;
}
}
}
}
void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,wElem *w,int n)
{
if(n=1)return;
int m=2*n-1;
HT=(HuffmanTree)ma
您可能关注的文档
最近下载
- 2023海南省邮政业安全保障中心招聘事业编制工作人员12人笔试备考题库及答案解析.docx VIP
- 第2章红外谱图解析习题课第章红外谱图解析习题课第2章红外谱图解析习题课第2章红外谱图解析习题课.ppt VIP
- 第七届全市职业技能大赛整理收纳师技术文件.docx VIP
- 化工污染物石油化工清洁生产94课件.pptx VIP
- 北京-LITE-产品使用说明书-引力版-BJ7000KPCC-BEV-LITE纯电动汽车产品使用说明书.pdf VIP
- 公共资源考试试题及答案.doc VIP
- 红外谱图解析习题课.pptx VIP
- CNAS-GL047-2021 医学实验室定量检验程序结果可比性验证指南.docx VIP
- 2025海南省邮政业安全保障中心招聘事业编制人员4人(第1号)笔试备考试题及答案解析.docx VIP
- 绿色化学与清洁生产.pptx VIP
文档评论(0)