信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx

上传人:b****6 文档编号:8488942 上传时间:2023-05-11 格式:DOCX 页数:21 大小:25.95KB
下载 相关 举报
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第1页
第1页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第2页
第2页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第3页
第3页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第4页
第4页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第5页
第5页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第6页
第6页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第7页
第7页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第8页
第8页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第9页
第9页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第10页
第10页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第11页
第11页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第12页
第12页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第13页
第13页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第14页
第14页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第15页
第15页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第16页
第16页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第17页
第17页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第18页
第18页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第19页
第19页 / 共21页
信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx

《信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx(21页珍藏版)》请在冰点文库上搜索。

信息论与编码课程设计哈夫曼编码的分析与实现Word文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2