- 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
- 2024至2030年中国人造棉面料行业投资前景及策略咨询报告.docx
- 重庆市渝中区遴选公务员2024年国家公务员考试考试大纲历年真题10340笔试历年典型考题及解题思路附.docx
- 2024至2030年中国甲基苯乙酮行业深度调研及发展预测报告.docx
- 2024至2030年中国羚羊角类饮片行业深度调查与前景预测分析报告.docx
- 重庆市面向中国农业大学定向选调2024届大学毕业生2024年国家公务员考试考试大纲历年真题14笔试历.docx
- 重庆市面向西北工业大学定向选调2024届大学毕业生00笔试历年典型考题及解题思路附答案详解.docx
- 中国不动杆菌感染治疗药行业市场现状分析及竞争格局与投资发展研究报告2024-2029版.docx
- 2024至2030年全球与中国ETL软件市场现状及未来发展趋势.docx
- 初中八年级(初二)生物下册期末考试1含答案解析.docx
- 干簧式继电器项目申请报告.docx
文档评论(0)