信息论与编码课程设计哈夫曼编码的分析与实现Word格式.docx
- 文档编号:18524756
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:21
- 大小:25.95KB
信息论与编码课程设计哈夫曼编码的分析与实现Word格式.docx
《信息论与编码课程设计哈夫曼编码的分析与实现Word格式.docx》由会员分享,可在线阅读,更多相关《信息论与编码课程设计哈夫曼编码的分析与实现Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
0.4
0.18
0.10.1
0.07
0.06
0.05
0.04
编码方法:
先将信源符号按其出现的概率大小依次排列,并取概率最小的字
母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这
两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。
并不断重复这一过程,直到最后两个符号配以0和1为止。
最后从最后一级开
始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。
哈夫曼编码方式得到的码并非唯一的。
在对信源缩减时,两个概率最小的
符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会
导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上
1
面,这样可获得较小的码方差。
四、设计原理
4.1哈夫曼编码步骤
(1)将信源消息符号按照其出现的概率大小依次排列为
p1p2pn
(2)取两个概率最小的字母分别配以0和1两个码元,并将这两个概率相
加作为一个新的概率,与未分配的二进制符号的字母重新排队。
(3)对重新排列后的两个最小符号重复步骤
(2)的过程。
(4)不断重复上述过程,知道最后两个符号配以0和1为止。
(5)从最后一级开始,向前返回得到的各个信源符号所对应的码元序列,即为相应的码字。
4.2哈夫曼编码特点
哈夫曼编码是用概率匹配的方法进行信源匹配方法进行信源。
它的特点是:
(1)哈夫曼的编码方法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分应用了短码。
(2)缩减信源的最后两个码字总是最后一位不同,从而保证了哈夫曼编码是即时码。
(3)哈夫曼编码所形成的码字不是唯一的,但编码效率是唯一的,在对最小的两个速率符号赋值时可以规定大的为“1”,小得为“0”,如果两个符号的出现概率相等时,排列时无论哪个在前都可以,所以哈夫曼所构造的码字不是
唯一的,对于同一个信息源,无论上述的顺序如何排列,他的平均码长是不会改变的,所以编码效率是唯一的。
(4)只有当信息源各符号出现的概率很不平均的时候,哈夫曼编码的效果才明显。
(5)哈夫曼编码必须精确的统计出原始文件中每个符号出现频率,如果没
有这些精确的统计将达不到预期效果。
哈夫曼编码通常要经过两遍操作,第一
遍进行统计,第二遍产生编码,所以编码速度相对慢。
另外实现电路复杂,各种长度的编码的编译过程也是比较复杂的,因此解压缩的过程也比较慢。
2
(6)哈夫曼编码只能用整数来表示单个符号,而不能用小数,这很大程度上限制了压缩效果。
哈夫曼所有位都是合在一起的,如果改动其中一位就可以使其数据变得面目全非。
五、设计步骤
5.1以框图形式画出哈夫曼编码过程(哈夫曼编码要求构建哈夫
曼树)。
表1哈夫曼编码
信源
概率
编码过程
编码
X1
0.6
01.0
0.19
0.23
0.37
00.4
X2
0.1
0.13
00.23
X3
X4
0.09
X5
X6
X7
X8
哈夫曼树:
码
码字
长
11
13
113
00004
01004
01014
000105
000115
给定n个实数w1,w2,......,wn(n2),求一个具有n个结点的二叉数,
使其带权路径长度最小。
所谓树的带权路径长度,就是树中所有的叶结点的权
值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度
为叶结点的层数)。
树的带权路径长度为
WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵
有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。
可以证明哈夫曼树的WPL是最小的。
(1)根据与n个权值{w1,w2wn}对应的n个结点构成具有n棵二叉树的
森林F={T1,T2Tn},其中第i棵二叉树Ti(1in)都只有一个权值为wi的
3
根结点,其左、右子树均为空。
(2)在森林F中选出两棵根结点的权值最小的树作为一棵新树的左、右子
树,且置新树的根结点的权值为其左、右子树上根结点权值之和。
(3)从F中删除构成新树的那两棵,同时把新树加入F中。
(4)重复第
(2)和第(3)步,直到F中只含有一棵为止,此树便为Huffman
树。
图1哈夫曼树
5.2计算平均码长、编码效率、冗余度。
平均码长为:
8
K=p(xi)Ki=0.4×
1+0.18×
3+0.1×
4+0.07×
4+0.06×
i1
4+
0.05×
5+0.04×
5=2.61(码元/符号)
信源熵为:
n
H(X)p(xi)logp(xi)-(0.4log0.4+0.18log0.18+0.1log0.1+
0.1log0.1+0.07+log0.07+0.06log0.06+0.05log0.05+0.04log0.04
)
4
=2.55bit/符号
信息传输速率为:
R=H(X)=2.55=0.977bit/码元
K2.61
编码效率为:
=H(X)=2.55=0.977
K2.61
冗余度为:
=1-=1-0.977=0.023
六、哈夫曼编码的实现
6.1软件介绍
VisualC++6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高
级语言”翻译为“机器语言(低级语言)”的程序。
VisualC++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。
VisualC++6.0由Microsoft开发,它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。
VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。
这些组件通过一个名
为DeveloperStudio的组件集成为和谐的开发环境。
Microsoft的主力软件产品。
VisualC++是一个功能强大的可视化软件开发工具。
VisualC++6.0以拥有“语法高亮”,自动编译功能以及高级除错功能而著称。
比如,它允许用户进行远程调试,单步执行等。
还有允许用户在调试期间重新
编译被修改的代码,而不必重新启动正在调试的程序。
其编译及创建预编译头
文件(stdafx.h)、最小重建功能及累加连结(link)著称。
这些特征明显缩短程序编
辑、编译及连结的时间花费,在大型软件计划上尤其显著。
(1)DeveloperStudio这是一个集成开发环境,我们日常工作的99%都是
在它上面完成的,再加上它的标题赫然写着“MicrosoftVisualC++”,所以很多
5
人理所当然的认为,那就是VisualC++了。
其实不然,虽然DeveloperStudio提
供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的
功能,真正完成这些工作的幕后英雄后面会介绍。
我们也知道,DeveloperStudio
并不是专门用于VC的,它也同样用于VB,VJ,VID等VisualStudio家族的
其他同胞兄弟。
所以不要把DeveloperStudio当成VisualC++,它充其量只是
VisualC++的一个壳子而已。
这一点请切记!
(2)MFC
从理论上来讲,MFC也不是专用于VisualC++,BorlandC++,C++Builder
和SymantecC++同样可以处理MFC。
同时,用VisualC++编写代码也并不意味着一定要用MFC,只要愿意,用VisualC++来编写SDK程序,或者使用STL,
ATL,一样没有限制。
不过,VisualC++本来就是为MFC打造的,VisualC++
中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC++而不用MFC就等于抛弃了VisualC++中很大的一部分功能。
但是,VisualC++也不等于
MFC。
(3)PlatformSDK
这才是VisualC++和整个VisualStudio的精华和灵魂,虽然我们很少能直
接接触到它。
大致说来,PlatformSDK是以MicrosoftC/C++编译器为核心(不
是VisualC++,看清楚了),配合MASM,辅以其他一些工具和文档资料。
上面说到DeveloperStudio没有编译程序的功能,那么这项工作是由谁来完成的呢?
是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成VisualStudio的基石。
6.2编程
//**哈夫曼编码**
#include<
iostream.h>
math.h>
string.h>
stdio.h>
stdlib.h>
vector>
usingnamespacestd;
6
structHuffman_InformationSource
{
charInformationSign[10];
doubleProbability;
charCode[10];
intCodeLength;
;
};
structHuffNode
HuffNode*LeftSubtree,*middleSubtree,*RightSubtree,*Next;
intCodeLength;
};
classCHuffman_2
public:
CHuffman_2()
ISNumber=0;
AvageCodeLength=0.0;
InformationRate=0.0;
CodeEfficiency=0.0;
Redundancy=0.0;
}
DestroyBTree(HuffTree);
7
voidHuffman_Input();
voidHuffman_Sort();
voidHuffman_Tree();
voidHuffman_Coding();
voidHuffman_CodeAnalyzing();
voidHuffman_Display();
voidDestroyBTree(HuffNode*TreePointer);
private:
vector<
Huffman_InformationSource>
ISarray;
intISNumber;
doubleAvageCodeLength;
doubleInformationRate;
doubleCodeEfficiency;
HuffNode*HuffTree;
private:
voidHuffman_Code(HuffNode*TreePointer);
//输入信源信息
voidCHuffman_2:
:
Huffman_Input()
Huffman_InformationSourcetemp1={"
x1"
0.40,"
"
0};
ISarray.push_back(temp1);
Huffman_InformationSourcetemp2={"
x2"
0.18,"
0};
ISarray.push_back(temp2);
Huffman_InformationSourcetemp3={"
x3"
0.10,"
ISarray.push_back(temp3);
Huffman_InformationSourcetemp4={"
x4"
ISarray.push_back(temp4);
Huffman_InformationSourcetemp5={"
x5"
0.07,"
ISarray.push_back(temp5);
Huffman_InformationSourcetemp6={"
x6"
0.06,"
ISarray.push_back(temp6);
Huffman_InformationSourcetemp7={"
x7"
0.05,"
ISarray.push_back(temp7);
Huffman_InformationSourcetemp8={"
x8"
0.04,"
ISarray.push_back(temp8);
ISNumber=ISarray.size();
//按概率“从大到小”排序
Huffman_Sort()
Huffman_InformationSourcetemp;
intI,j;
for(i=0;
i<
ISNumber-1;
i++)
for(j=i+1;
j<
ISNumber;
j++)
if(ISarray[i].Probability<
ISarray[j].Probability)
temp=ISarray[i];
ISarray[i]=ISarray[j];
ISarray[j]=temp;
Huffman_Tree()
intI;
HuffNode*ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;
ptr1=newHuffNode;
strcpy(ptr1->
InformationSign,ISarray[0].InformationSign);
ptr1->
Probability=ISarray[0].Probability;
9
Code,ISarray[0].Code);
LeftSubtree=NULL;
middleSubtree=NULL;
RightSubtree=NULL;
Next=NULL;
HuffTree=ptr1;
for(i=1;
ptr2=newHuffNode;
strcpy(ptr2->
InformationSign,ISarray[i].InformationSign);
ptr2->
Probability=ISarray[i].Probability;
Code,ISarray[i].Code);
Next=ptr1;
ptr1=ptr2;
intk;
ints;
k=ceil((double)(ISNumber-3)/(3-1));
s=3+k*(3-1)-ISNumber;
if(s==1)
ptr2=ptr1->
Next;
ptr4=newHuffNode;
strcpy(ptr4->
InformationSign,"
*"
);
ptr4->
Probability=ptr1->
Probability+ptr2->
Probability;
Code,"
10
LeftSubtree=NULL;
middleSubtree=ptr1;
RightSubtree=ptr2;
HuffTree=ptr2->
temp1=HuffTree;
while(temp1&
&
(ptr4->
Probability>
temp1->
Probability))
temp2=temp1;
temp1=temp1->
Next=temp1;
if(temp1==HuffTree)
HuffTree=ptr4;
else
temp2->
Next=ptr4;
ptr1=HuffTree;
while(ptr1->
Next)
//合并概率最小的结点
ptr3=ptr2->
Probability+ptr3->
LeftSubtree=ptr1;
middleSubtree=ptr2;
RightSubtree=ptr3;
HuffTree=ptr3->
//释放:
ptr1=NULL;
ptr2=NULL;
ptr3=NULL;
ptr4=NULL;
temp1=NULL;
temp2=NULL;
strcpy(HuffTree->
HuffTree->
CodeLength=0;
//生成哈夫曼码
Huffman_Code(HuffNode*TreePointer)
if(TreePointer==NULL)
return;
chartempstr[10]="
;
12
if(!
TreePointer->
LeftSubtree&
!
middleSubtree&
RightSubtree)
for(inti=0;
if(strcmp(ISarray[i].InformationSign,TreePointer->
InformationSign)==0)
strcpy(ISarray[i].Code,TreePointer->
Code);
ISarray[i].CodeLength=TreePointer->
CodeLength;
return;
if(TreePointer->
LeftSubtree)
strcpy(tempstr,TreePointer->
strcat(tempstr,"
2"
strcpy(TreePointer->
LeftSubtree->
Code,tempstr);
CodeLength=TreePointer->
CodeL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 编码 课程设计 哈夫曼 分析 实现