- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
南理工多媒体技术霍夫曼编码的C实现
课程:多媒体技术
任教老师:康其桔
学生:缪 菊
学号:1104210329
班级:电光11级电信3班
联系方式 完成时间:2014年3月24日
霍夫曼编码
一.实验内容:
从键盘输入一字符串,设计C++程序,统计字符串的长度,涉及的字母,字母的权值,进行字母的HUFFMAN编码,输出字符串的HUFFMAN编码,并统计平均码长。
问题描述:
1、读入sum个字符,算出字符出现的频率,根据字母数组和权值数组,建立一棵HUFFMAN树。
2、对生成的HUFFMAN树,求每个字符进行HUFFMAN编码。求出每个字符的HUFFMAN编码,形成码表,对应码表输出字符串的HUFFMAN编码。
三.算法设计:
HUFFMAN编码的算法:
A.统计输入字符串的长度,涉及的字母,字母的权值。形成字母表和对应的权值表。
B.用select函数遍历n个字符,找出权值最小的两个S1和S2,构造一个新的节点Hi,将S1和S2连接到Hi的lchild和rchild节点上,Hi节点的weight为S1和S2的weight之和。
C.将新建立的节点Hi替换S1和S2,继续步骤b(这时的字符数为n-i,i=1,2,…),直到只剩下一个节点为止。至此,HUFFMAN树构造完成。
D.给HUFFMAN的HT分配编码,形成每个字符的编码形成码表。对应字符串输出编码串。
四.具体实例:
步骤1:输入A—E的字符,统计出相应的字符表和权值表如下,构造子节点如下,构造备用的父节点如下。(n个字符的HUFFMAN编码,需要(2n-1)个节点)
节点序号 1 2 3 4 5 6 7 8 9 字符 A B C D E H1 H2 H3 H4 权值 3 5 2 4 1 0 0 0 0 图形表示状态如下:
步骤2和3:
步骤4:
于是得到最后的霍夫曼编码为:
字符 A B C D E 霍夫曼编码 00 11 010 10 011 程序的实现
字符的统计程序
构造存有26个字母的字母表b[],用26个字母扫描字符串,在相应的位置b[]中的内容加一。最后将字母表存入chstrl[],权值表存入wstrl[]。
(2)HUFFMAN树节点的存储表示
typedef struct{
unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree; //动态分配数组存储霍夫曼树
霍夫曼树节点的图形表示:
具体实现见源代码注释。
附上全部源代码:
#include iostream
#includestdio.h
using namespace std;
//***************************************动态分配数组存储霍夫曼树*******************************
typedef struct{
int weight; //字符的权值
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
//***************************************动态分配数组存储霍夫曼树*******************************
//*****************************************动态分配数组存储霍夫曼编码*****************************
typedef char* *HuffmanCode;
//*****************************************动态分配数组存储霍夫曼编码*****************************
//********************************选择n个(这里是k=n)节点中权值最小的两个结点**********************
//调用HuffmanTree数组,k是结点,S1,S2
void Select(HuffmanTree HT,int k,int s1,int s2)
{ int i;
i=1;
while(i=k HT[i].paren
您可能关注的文档
- 普通地质学复习资料..docx
- 普通外科病历..doc
- 普通心理学复习大纲..docx
- 普通心理学笔记..doc
- 普通心理学自考试题带答案..doc
- 普通心理学讲义..doc
- 普通心理学试题及答案详解..docx
- 普通心理学重点华东师范大学..doc
- 普通心理学题库..doc
- 普通昆虫学试题库..doc
- 人教版九年级英语全一册单元速记•巧练Unit13【速记清单】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit9【速记清单】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit11【速记清单】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit14【单元测试·提升卷】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit8【速记清单】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit4【单元测试·提升卷】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit13【单元测试·基础卷】(原卷版+解析).docx
- 人教版九年级英语全一册单元速记•巧练Unit7【速记清单】(原卷版+解析).docx
- 苏教版五年级上册数学分层作业设计 2.2 三角形的面积(附答案).docx
- 人教版九年级英语全一册单元速记•巧练Unit12【单元测试·基础卷】(原卷版+解析).docx
文档评论(0)