实验三 Huffman编码和译码
更新时间:2024-03-18 05:01:01 阅读量: 综合文库 文档下载
- 实验三中推荐度:
- 相关推荐
实验三 Huffman编码和译码
一、需求分析
1、 用户必须先从键盘输入字符和相应字符的权值,在执行相应的操作。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。 3、程序执行的命令包括:
(1)输入字符和相应的权值(2)程序运行,求解字符的编码并输出运算结果。 (3)输入一个字符串,生成码流。 4、测试数据
A 0.3 B 0.2 C 0.05 D 0.05 E 0.1 F 0.3 ABFEDEFAD 二、概要设计
构造Huffman树的方法——Huffman算法根据给定的n个权值{w1,w2,??wn},构造n棵只有根 结点的二叉树,令初始权值为wj;在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和;在森林中删除这两棵树,同时将新得到的二叉树加入森林中重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。哈弗曼树建成后,求编码需要从叶子节点出发走一条从叶子到根的路径。译码需从走一条从根到叶子的路径。 本程序的设计思路是: 1.建立huffman编码树 2.编码指定字符串
3.译码指定码流为字符串 主函数
int main CreatHuffman Tree Huffman Coding编码 Yima 译码 结束 三、详细设计
1、定义头文件 #include
int m=2*n-1;
2、元素类型、节点类型和辅助变量 typedef struct{
char* HfmCode;/*动态分配数组,存储哈夫曼编码*/ char ch;
}code, *HuffmanCode; typedef struct {
unsigned int weight ; /* 用来存放各个结点的权值*/ char ch;
unsigned int parent, LChild,RChild ; /*指向双亲、孩子结点的指针*/ }HTNode, * HuffmanTree; 3,建立哈弗曼树
void CreatHuffmanTree(HuffmanTree *ht , int *w, char *st,int n) { /* w存放已知的n个权值,构造哈夫曼树ht */
/*由于是用数组的结构来存储树,故ht放的是数组的头指针*/ int m,i;
int s1,s2; /*在select函数中使用,用来存储最小权的结点的序号*/
*ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /*0号单元未使用*/ for(i=1;i<=n;i++)
{/*1-n号放叶子结点,初始化*/ (*ht)[i].weight = w[i]; (*ht)[i].ch=st[i]; (*ht)[i].LChild = 0; (*ht)[i].parent = 0; (*ht)[i].RChild = 0; } for(i=n+1;i<=m;i++) {
(*ht)[i].weight = 0; (*ht)[i].LChild = 0; (*ht)[i].parent = 0; (*ht)[i].RChild = 0; } /*非叶子结点初始化*/
for(i=n+1;i<=m;i++) /*创建非叶子结点,建哈夫曼树*/
{ /*在(*ht)[1]~(*ht)[i-1]的范围内选择两个parent为0且weight最小的结点,其序号分别赋值给s1、s2返回*/
select(ht,i-1,&s1,&s2); (*ht)[s1].parent=i;
(*ht)[s2].parent=i; /*设置这两个最小的权的结点的父结点为i*/ (*ht)[i].LChild=s1;
(*ht)[i].RChild=s2; /*设置这个父结点的子结点*/
(*ht)[i].weight=(*ht)[s1].weight+(*ht)[s2].weight; /*设置这个父结点权*/ }
}/*哈夫曼树建立完毕*/ 4.,select函数
void select(HuffmanTree *ht,int n, int *s1, int *s2)
{ /*ht,为树所在数组的头指针,n叶子节点数,s1,s2,返回最小的两个序号*/ int p1=MAX;
int p2=MAX; /*p1, p2用来记录最小的两个权, 要求p1 int pn2=0, i; /*pn1, pn2 用来记录这两个权的序号*/ for(i=1;i<=n;i++) if((*ht)[i].weight {/*如果当前结点的权比p1小,那么p2的权赋为p1的权, p1的权为当前权,同时修改n1, pn2*/ /*查找的结点要求没有父结点*/ pn2=pn1; p2=p1; p1=(*ht)[i].weight; pn1=i; } else if((*ht)[i].weight {/*如果当前结点的权比p2小(由第一个if,当前权不比p1小),那么p2的权赋为当前权,同时修改pn2*/ p2=(*ht)[i].weight; pn2=i; } *s1=pn1; *s2=pn2; /*赋值返回*/ } 5求解哈佛曼编码 void HuffmanCoding(HuffmanTree *ht, HuffmanCode *hc, int n) /*从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码*/ { char *cd; int i; unsigned int c; int start; int p; *hc=(HuffmanCode)malloc((n+1)*sizeof(code)); /*分配n个编码的头指针*/ cd=(char * )malloc(n * sizeof(char )); /*分配求当前编码的工作空间*/ cd[n-1]='\\0'; /*从右向左逐位存放编码,首先存放编码结束符*/ for(i=1;i<=n;i++) /*求n个叶子结点对应的哈夫曼编码*/ { (*hc)[i].ch=(*ht)[i].ch; start=n-1; /*初始化编码起始指针*/ /*通过c是current的意思,表示向根结点靠拢的当前结点,序号从i开始 p是parent,始终指向c的父结点, p==0时c就是根结点*/ for(c=i,p=(*ht)[i].parent; p!=0; c=p,p=(*ht)[p].parent) /*从叶子到根结点求编码*/ if( (*ht)[p].LChild == c) cd[--start]='0'; /*左分支标0*/ else cd[--start]='1'; /*右分支标1*/ /*for循环结点条件为 *p=0表示c是根结点了,而每循环一次又由cd[--start]倒序记录了 每一步是父结点的左或右结点,也就是形成了H编码,并放在cd中*/ (*hc)[i].HfmCode=(char *)malloc((n-start)*sizeof(char)); /*为第i个编码分配空间*/ /*复制编码到对应的结点(当然是所有的需要编码的结点)*/ strcpy((*hc)[i].HfmCode,&cd[start]); } free(cd); } 6译码指定字符串为码流 void Yima(HuffmanTree *ht, HuffmanCode *hc,char sh1[]) //将字符串转换为码流 { ofstream fout(\定义输出文件流 if(!fout) { cout<<\文件打开失败\ return; } for(int i=0;i if(!fout) { cout<<\文件打开失败\ return; } char shs[100]; while(fin>>shs[i]) cout< 8,主函数部分 int main() { HuffmanTree HT; HuffmanCode HC; int *w; /*各字符的权重*/ char *st; /* 字符集,和st[i]和s[i]对应*/ float wei; /* the weight of a element;*/ char ch;//临时变量用来输入字符 char str[20]; w=(int *)malloc((n+1)*sizeof(int)); // 开辟空间 st=(char *)malloc((n+1)*sizeof(int));//开辟空间 for(int i=1;i<=n;i++) /*输入元素及其权重,存储在w,st中*/ { cout<<\ element and it's weight:\ cin>>ch;cin>>wei; st[i]=ch;w[i]=wei; } CreatHuffmanTree(&HT,w,st,n); /*构造H树*/ HuffmanCoding(&HT,&HC,n); /*根据H树,求每个字符的编码,放在HC中*/ for(i=1;i<=n;i++) /*输出编码*/ cout< 四、调试分析 语法错误很容易发现和弄明白,但是遇到逻辑上的错误就很难调试出来。这次同样遇到了一
正在阅读:
实验三 Huffman编码和译码03-18
数据结构和算法11-02
二次函数与三角形的存在性问题的解法11-21
今天我们应该怎么学雷锋08-09
中医基础理论试题08-14
计算机拆装实训报告11-02
我希望我是孙悟空作文400字06-26
跨境融资租赁及售后回租业务操作指引04-06
MSO5000D系列示波器说明书2012.11.3 - 图文03-03
环水保方案03-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 译码
- 编码
- Huffman
- 实验
- 党校第四十七期培训班教学计划
- 省级智慧粮仓综合管理平台建设方案 智慧粮库综合管理平台建设方
- 研修总结作业 - 图文
- 环境监测收费标准苏价费2006(397)
- 中国文化概论总复习1
- (2017版)超星尔雅通识课《大学生心理健康教育》及期末考试答案
- 高考数学二轮专题复习与测试练习题 专题1 第5课时 导数及其应用
- 公务员考试面试备考说话能力须过三关
- 2.民事主体
- 七峰路北延说明
- 美团网商业模式及经营策略分析
- 第4课时 选择合理的计算方法 峄城 马铭良
- (穗人社发〔2012〕9号)关于印发《申报评审、认定专业技术资格
- 甲级单位编制一次性纸杯项目可行性报告(立项可研+贷款+用地+201
- 垃圾清运可行性报告
- 社区矫正实施办法讲座
- 最新人教版二年级下测数学《万以内数的认识》练习题
- 和政县富强供暖有限公司绩效自评报告
- 近年大学生杀人案例集锦
- 中班(下)幼儿发展水平评价分析表