当前位置:文档之家› Huffman编码报告

Huffman编码报告

Huffman编码报告
Huffman编码报告

《数据结构》课程设计上机实习报告

课设题目Huffman编码和解码

班级

学生姓名

学号

指导教师

时间2015.12-2015.1

一、设计目的

1.进一步熟悉C语言开发环境,熟悉用C语言完成一个应用程序的设计过程,掌握有关编辑、调试和整合程序的方法和技巧。

2.通过此设计,了解《数据结构》课程中霍夫曼编码的的有关内容,明确其操作,熟悉其设计,同时学习到有关位向量的内容,对文件掌握加深

二、设计内容

Huffman编码与解码 (必做)(Huffman编码、二叉树)

[问题描述]

对一篇英文文章(大于2000个英文字符),统计各字符出现的次

数,实现Huffman编码,以及对编码结果的解码。

[基本要求]

(1)输出每个字符出现的次数和编码,其中求最小权值要求用堆实

现。

(2)在Huffman编码后,要将编码表和英文文章编码结果保存到文

件中,编码结果必须是二进制形式,即0 1的信息用比特位表示,不

能用字符’0’和’1’表示。

(3)提供读编码文件生成原文件的功能。

三、数据结构说明

在该程序中我仅仅使用了两个结构体来完成编码,用位域来实现bite流存储:const int MAXSIZE=300;//定义一次分配的Huffman储存单词最大量为500 const int OVERFLOW = 0;

const int ERROR = 0;

const int LineCountNum=500;

typedef struct WordCount

{

char Word;//存放字符

int freq;

int parent , lchild , rchild;//存放亲子节点位置

int place;//用来保存第一次堆排序后,建立霍夫曼表前的相对位置

char *HuffmanCode;//存放霍夫曼编码

}WordCount , *WC;//存放单词结点的结构体

typedef struct HuffmanTree

{

WC w;

int Number;//存储有多少数据存入

}HuffmanTree , *HTree;

typedef struct

{

unsigned int a:1;

}bite;//设置位段,存储一个bite

//**************操作函数声明***********

void InitHuffmanTree(HTree &H);//初始化霍夫曼树

void HeapSort(WC &W , int Number , int choice);//堆排序核心函数

void HeapAdjust(WC &W , int down , int up , int choice);//堆排序调整函数,实现两种排序

void HuffmanCoding(HTree &H , WC &HT); //求霍夫曼树和霍夫曼编码表

void ShowHuffmanTree(HTree H);//输出霍夫曼树

void Select(WC &W , int i , int &s1 , int &s2);//选择1-i-1之间最小的两个数,且parent为0,用s1,s2返回

void GetTheDeCode(HTree H);//将编码结果写入函数

void PutTheDeCode(FILE *fp1 , FILE *fp2);//将编码结果解码得到文章

void CountTheWord(HTree &H , FILE *fp);//记录单词权值

void ShowTheEassy(FILE *wp);//展示文章

四、详细设计

1.首先我给出了编码和解码的菜单供其选择

2.在编码功能中,我先通过CountTheWord()函数进行单词权值记录,然后

进入编码功能,值得一提的是,编码时我给堆排序设计了两种排序形式——对权值的排序和对位置的排序,以达到选择两个最小的权值结点的最优时间复杂度的目的,此功能通过switch实现,但要给编码结构体中放置一个place 空间,这也从侧面反映了时间和空间矛盾的地方(值得一提的是,有些编码并不可见且有特殊含义,如换行符,所以将字符放入文件中时,并不对其进行处理,读出是进行顺序读出)

3.编码结束后将编码结果,对应字符分别存放在文件中,然后对整篇文章进行

编码

4.解码时依据霍夫曼编码的唯一性进行比较求解,遇到同样的字符即返回对应

的字母并写入解码文件中

五、调试与测试(测试数据:献给艾米莉的玫瑰)

1.首先打开文件进行字符权值统计并输出结果(有些符号不可见,所以无法显示)

2.然后对其进行堆排序

3.输出编码表,及其对应亲子关系(#号代表为父结点)

4.输出编码结果(可以轻易看出编码具备唯一性)

5.将编码写入文件,一下显示文件部分内容

位域存储的bite编码文档

换行符的存在,自动换行了)

6.解码(将文章在命令行显示,也写入了翻

译文档(以doc格式保存))

六、课程设计总结

本次程序设计过程中遇到过许多大大小小的问题,也在设计思路上遇到过难题,但都在各方面的努力下得到了解决。

一些问题如下:

1.Bite形式保存

由于以前没学到过位向量的内容,有一段时间无法实现这个功能,后来

在网络上偶然接触到位域的内容,认识到其可行性,于是解决了此问题

2.选择最小的两个权值

一开始我认识的这个可能很复杂,又联想到堆排序可以对其有序输出,

但我又不想改变其位置,所以增设一个place记录一开始的编码表位置,进行编码时改变后可以轻易还原

总结:

霍夫曼编码在通信领域内是十分重要的内容,对其的掌握既能帮助我们理解二叉树的重要性,也能为我们未来工作提供一个更广阔的舞台

七、附录

/*

*题目:Huffman编码的编码和解码

*作者:杨欢

*学号:161420325

*完成时间:2015-12-30

算法思想:以书上的霍夫曼算法为核心进行文章(所有内容,包括标点,换行符,

所以命令行可能无法显示部分字符)编码和解码。

对于比特位的存储,我选择用位域进行简单方便的操作。文件的读写都以最基本的方式进行。

测试文章上,我选择艾米莉的玫瑰这一小说测试,数据量大,可以验证程序的正确性

*/

#include

#include

#include

const int MAXSIZE=300;//定义一次分配的Huffman储存单词最大量为500 const int OVERFLOW = 0;

const int ERROR = 0;

const int LineCountNum=500;

typedef struct WordCount

{

char Word;//存放字符

int freq;

int parent , lchild , rchild;//存放亲子节点位置

int place;//用来保存第一次堆排序后,建立霍夫曼表前的相对位置

char *HuffmanCode;//存放霍夫曼编码

}WordCount , *WC;//存放单词结点的结构体

typedef struct HuffmanTree

{

WC w;

int Number;//存储有多少数据存入

}HuffmanTree , *HTree;

typedef struct

{

unsigned int a:1;

}bite;//设置位段,存储一个bite

//**************操作函数声明***********

void InitHuffmanTree(HTree &H);//初始化霍夫曼树

void HeapSort(WC &W , int Number , int choice);//堆排序核心函数

void HeapAdjust(WC &W , int down , int up , int choice);//堆排序调整函数,实现两种排序

void HuffmanCoding(HTree &H , WC &HT); //求霍夫曼树和霍夫曼编码表

void ShowHuffmanTree(HTree H);//输出霍夫曼树

void Select(WC &W , int i , int &s1 , int &s2);//选择1-i-1之间最小的两个数,且

parent为0,用s1,s2返回

void GetTheDeCode(HTree H);//将编码结果写入函数

void PutTheDeCode(FILE *fp1 , FILE *fp2);//将编码结果解码得到文章void CountTheWord(HTree &H , FILE *fp);//记录单词权值

void ShowTheEassy(FILE *wp);//展示文章

//************主函数***************

int main()

{

FILE *fp , *wp;

HTree H;

WC HT;//存放编码表

printf("*************菜单**************************\n") ;

printf("*********1.编码文档********\n");

printf("*********2.解码文档********\n");

printf("*********0.退出****************************\n");

printf("请输入您的选择:");

int choice;

scanf("%d" ,&choice);

getchar();

while(choice != 0)

{

switch(choice)

{

case 1:

InitHuffmanTree(H);

if(!(fp = fopen("献给艾米莉的玫瑰.txt" , "r")))

{//以文本文件形式打开文件

printf("此文件不存在\n");

exit(ERROR);

}

printf("文件打开成功\n");

CountTheWord(H , fp);

printf("按任意键统计该文章各字符出现的频率为\n");

getchar();

ShowHuffmanTree(H);

printf("按任意键开始堆排序\n");

getchar();

HeapSort(H->w , H->Number , 1);//对频率排序

printf("按任意键输出堆排序后的情况\n");

getchar();

ShowHuffmanTree(H);

printf("现在开始进行霍夫曼树的构建和霍夫曼编码的构建\n");

HuffmanCoding(H , HT);

printf("输入任意键输出霍夫曼编码表:");

getchar();

printf("字符位置权值左孩子右孩子父亲\n");

for(int i=1 ; i<=2*H->Number ; ++i)

{

printf("%c %d %d %d %d %d\n" , HT[i].Word , i ,

HT[i].freq ,HT[i].lchild , HT[i].rchild , HT[i].parent);

}

printf("按任意键输出构建的霍夫曼编码结果:");

getchar();

for(int i=1 ; i<=H->Number ; ++i)

{

printf("%c 对应的编码为%s\n" , H->w[i].Word ,

H->w[i].HuffmanCode);

}

printf("按任意键将结果写入文件\n");

getchar();

GetTheDeCode(H);

free(H);//释放空间,避免影响

break;

case 2:

PutTheDeCode(fp , wp);

printf("该英文文章为\n");

ShowTheEassy(wp);

printf("\n");

fclose(fp);

break;

case 0:

break;

}

printf("请输入您的选择:");

scanf("%d" ,&choice);

getchar();

}

return 0;

}

//*********操作函数实现**********

void InitHuffmanTree(HTree &H)

{

if(!(H = (HuffmanTree *)malloc(sizeof(HuffmanTree))))

exit(OVERFLOW);

if(!(H->w = (WC)malloc(sizeof(WordCount)*MAXSIZE))) exit(OVERFLOW);//创建结点

H->Number = 0;

}

//****************将结果写入文件******************** void GetTheDeCode(HTree H)

{

FILE *fp , *wp;

//********将编码表写出********

if(!(fp = fopen("编码表文档.txt" , "w")))

{//以二进制方式写出文章编码

printf("此文件不存在\n");

clearerr(fp);

exit(ERROR);

}

for(int i=1 ; i<=H->Number ; ++i)

fprintf(fp , "%s\n" , H->w[i].HuffmanCode);

fclose(fp);

if(!(fp = fopen("编码表对应单词文档.txt" , "w")))

{//以二进制方式写出文章编码

printf("此文件不存在\n");

clearerr(fp);

exit(ERROR);

}

for(int i=1 ; i<=H->Number ; ++i)

fprintf(fp , "%c" , H->w[i].Word); //因为存在换行符,需要进行读取换行符,所以不进行分行存储

fclose(fp);

//********将编码文档写出***********

if(!(fp = fopen("献给艾米莉的玫瑰.txt" , "r")))

{//打开文章进行对比写出编码结果

printf("此文件不存在\n");

clearerr(fp);

exit(ERROR);

}

if(!(wp = fopen("编码文档.txt" , "wb")))

{//以二进制形式写出编码文档

printf("此文档不存在\n");

clearerr(wp);

exit(ERROR);

}

bite Save;

while(!feof(fp))

{

char Count;

fscanf(fp , "%c" , &Count);

for(int i=1 ; i<=H->Number ; ++i)

{

if(Count == H->w[i].Word)

{//寻找到匹配的,得到其字符编码,现在将其以Bite位写出到文件for(int j=0 ; jw[i].HuffmanCode) ; ++j)

{

if(H->w[i].HuffmanCode[j] == '1')

Save.a = 1;

else

Save.a = 0;

fwrite(&Save , sizeof(bite) , 1 , wp);//用位段写进文件}

break;

}

}

}

fclose(fp);

fclose(wp);

printf("写出成功\n");

}

//***********将编码文件翻译成英文************

void PutTheDeCode(FILE *fp , FILE *wp)

{

HTree H;

InitHuffmanTree(H);

//*************读取编码文件********

if(!(fp = fopen("编码表文档.txt" , "r")))

{

printf("此文件不存在\n");

clearerr(fp);

exit(ERROR);

}

int Num = 1;

char Count[MAXSIZE];//存放出来的0 1字符串

memset(Count , 0 , MAXSIZE*sizeof(char));

while(!feof(fp))

{

fscanf(fp , "%s" , Count);

if(strlen(Count) != 0)

{

if(!(H->w[Num].HuffmanCode = (char

*)malloc((strlen(Count)+1)*sizeof(char))))

exit(OVERFLOW);

strcpy(H->w[Num].HuffmanCode , Count);

memset(Count , 0 , strlen(Count)*sizeof(char));//清零

++Num;

}

}//将编码导出

fclose(fp);

if(!(fp = fopen("编码表对应单词文档.txt" , "r")))

{

printf("此文件不存在\n");

clearerr(fp);

exit(ERROR);

}

Num = 1;

while(!feof(fp))

{

H->w[Num].Word = fgetc(fp);

++Num;

}

fclose(fp);

//**************翻译**********

if(!(fp = fopen("编码文档.txt" , "rb")))

{//以二进制读取编码文档

printf("此文件不存在\n");

clearerr(fp);

exit(ERROR);

}

if(!(wp = fopen("翻译文档.doc" , "w")))

{//写出文章编码

printf("此文件不存在\n");

clearerr(wp);

exit(ERROR);

}

bite Put;//位段,用来将字符读出

Num = Num-2;//存储了多余的换行符并且多加了一次,还原真实数目

int NumberCount = strlen(H->w[Num].HuffmanCode);//存放最小的霍夫曼编码数,减小后面的比较次数

int CT , i=0 ,j=1;

while(!feof(fp))

数据结构哈夫曼编码译码器课程设计报告

JAVA语言实验报告 学院计算机工程学院班级计算1013 姓名佐伊伦学号 201081xxxx 成绩指导老师 xxxx 2012年09月03日

目录 目录 (1) 1 课程设计的目的和意义 (2) 2 需求分析 (3) 3 系统(项目)设计 (5) ①设计思路及方案 (5) ②模块的设计及介绍 (5) ③主要模块程序流程图 (8) 4 系统实现 (11) ①主调函数 (12) ②建立HuffmanTree (12) ③生成Huffman编码并写入文件 (15) ④电文译码 (16) 5 系统调试 (17) 参考文献 (21) 附录源程序 (22)

1 课程设计的目的和意义 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。 哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个对应的字符的编码,这就是哈夫曼编码。 通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度尽可能最短,即采用最短码。 作为信息管理专业的学生,我们应该很好的掌握这门技术。在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。 在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。 在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见。同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。 数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。课程设计是一个重要的教学环节。我们在一般情况下都能够重视实验环节,但是容易忽略实验的总结,忽略实验报告的撰写。通过这次实验让我们明白:作为一名大学生必须严格训练分析总结能力、书面表达能力。需要逐步培养书写科学实验报告以及科技论文的能力。只有这样,我们的综合素质才会有好的提高。

哈夫曼树编码译码实验报告(DOC)

数据结构课程设计设计题目:哈夫曼树编码译码

目录 第一章需求分析 (1) 第二章设计要求 (1) 第三章概要设计 (2) (1)其主要流程图如图1-1所示。 (3) (2)设计包含的几个方面 (4) 第四章详细设计 (4) (1)①哈夫曼树的存储结构描述为: (4) (2)哈弗曼编码 (5) (3)哈弗曼译码 (7) (4)主函数 (8) (5)显示部分源程序: (8) 第五章调试结果 (10) 第六章心得体会 (12) 第七章参考文献 (12) 附录: (12)

在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是哈夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。 第二章设计要求 对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,∑WiLi 恰好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码。设计实现的功能: (1) 哈夫曼树的建立; (2) 哈夫曼编码的生成; (3) 编码文件的译码。

JPEG编码器实验报告代码分析

实验报告 1.实验目的 通过阅读JPEG编码器代码,了解编码原理、编码过程和代码实现。 2.实验要求 (1)详细阅读JPEG编码器代码,结合编码原理,了解整个代码实现的过程(2)输入bmp文件,在VC6.0下跑通代码,查看编码器的压缩倍数 (3)对有些模块进行单步跟踪调试,详细了解其过程 3.实验原理 JPEG编码的基本过程如下 (1)像素阵列分块(分为8*8小块) (2)进行DCT离散余弦变换 (3)进行Z字形扫描,将二维阵列变为一维数列 (4)进行量化 (5)熵编码(Huffman编码) (6)封装为JPG文件 本次试验所用bmp转jpg编码器的编码步骤 (1)读取bmp文件信息,创建并打开jpg文件 (2)8*8分块及色彩空间变换(RGB转YCbCr) (3)快速离散余弦变换FDCT (4)量化 (5)Z字形扫描 (6)使用差分脉冲编码调制对直流系数DC进行编码 (7)使用游程长度编码对交流系数AC编码 (8)霍夫曼熵编码 4.代码分析 整个代码过程可分为三个部分 (1)文件操作 (2)对编码所用信息表进行初始化(int_all) (3)主编码器进行编码(main_encoder) 主函数分析 int main(int argc, char *argv[]) { char BMP_filename[64];

char JPG_filename[64]; WORD width_original,height_original; //the original image dimensions, // before we made them divisible by 8 BYTE len_filename; bitstring fillbits; //filling bitstring for the bit alignment of the EOI(end of image) marker if (argc>1) { strcpy(BMP_filename,argv[1]); if (argc>2) strcpy(JPG_filename,argv[2]); else { // replace ".bmp" with ".jpg" strcpy(JPG_filename, BMP_filename); len_filename=strlen(BMP_filename); strcpy(JPG_filename+(len_filename-3),"jpg");//从后三位开始拷贝jpg. } } else exitmessage("Syntax: enc fis.bmp [fis.jpg]"); //BMP_filename=""; load_bitmap(BMP_filename, &width_original, &height_original);//加载bmp文件信息 fp_jpeg_stream = fopen(JPG_filename,"wb");//创建jpg文件流 init_all();//初始化函数,初始化量化、霍夫曼及亮度色差转换表等,为编码做准备 SOF0info.width = width_original; SOF0info.height = height_original;//写入图像的宽和高 writeword(0xFFD8); // SOI,写入图像开始标志 write_A PP0info(); // write_comment("Cris made this JPEG with his own encoder"); write_DQTinfo();//写入量化表 write_SOF0info();//写入帧开始 write_DHTinfo();//写入霍夫曼表 write_SOSinfo();//写入扫描开始信息 // init global variables bytenew = 0; // current byte bytepos = 7; // bit position in this byte main_encoder();//主编码函数 // Do the bit alignment of the EOI marker if (bytepos >= 0) {

数据结构 哈夫曼编码实验报告

实验报告 实验课名称:数据结构实验 实验名称:文件压缩问题 班级:20132012 学号:姓名:时间:2015-6-9 一、问题描述 哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。 二、数据结构设计 首先定义一个结构体: struct head { unsigned char b; //记录字符 long count; //权重 int parent,lch,rch; //定义双亲,左孩子,右孩子 char bits[256]; //存放哈夫曼编码的数组 } header[512],tmp; //头部一要定设置至少512个,因为结 点最多可达256,所有结点数最多可 达511 三、算法设计 输入要压缩的文件读文件并计算字符频率根据字符的频率,利用Huffman 编码思想创建Huffman树由创建的Huffman树来决定字符对应的编码,进行文件的压缩解码压缩即根据Huffman树进行译码 设计流程图如图1.1所示。

图1.1 设计流程图 (1)压缩文件 输入一个待压缩的文本文件名称(可带路径)如:D:\lu\lu.txt 统计文本文件中各字符的个数作为权值,生成哈夫曼树;将文本文件利用哈夫曼树进行编码,生成压缩文件。压缩文件名称=文本文件名.COD 如:D:\lu\lu.COD 压缩文件内容=哈夫曼树的核心内容+编码序列 for(int i=0;i<256;i++) { header[i].count=0; //初始化权重 header[i].b=(unsigned char)i; //初始化字符 } ifstream infile(infilename,ios::in|ios::binary); while(infile.peek()!=EOF) { infile.read((char *)&temp,sizeof(unsigned char)); //读入一个字符 header[temp].count++; //统计对应结点字符权重 flength++; //统计文件长度 } infile.close(); //关闭文件 for(i=0;i<256-1;i++) //对结点进行冒泡排序,权重大的放在上面,编码时效率高 for(int j=0;j<256-1-i;j++) if(header[j].count

哈夫曼编码译码系统实验报告,数据结构课程设计报告

v .. . .. 安徽大学 数据结构课程设计报告项目名称:哈弗曼编/译码系统的设计 与实现 姓名:鉏飞祥 学号:E21414018 专业:软件工程 完成日期 2016/7/4 计算机科学与技术学院

1 .需求分析 1.1问题描述 ?问题描述:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(解码)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站设计一个哈夫曼编译码系统。 1.2基本要求 (1)输入的形式和输入值的范围; (2)输出的形式; (3)程序所能达到的功能。 1.基本要求 (1)初始化(Initialzation)。从数据文件DataFile.data中读入字符及每个字符的权值,建立哈夫曼树HuffTree; (2)编码(EnCoding)。用已建好的哈夫曼树,对文件ToBeTran.data中的文本进行编码形成报文,将报文写在文件Code.txt中; (3)译码(Decoding)。利用已建好的哈夫曼树,对文件CodeFile.data中的代码进行解码形成原文,结果存入文件Textfile.txt中; (4)输出(Output)。输出DataFile.data中出现的字符以及各字符出现的频度(或概率);输出ToBeTran.data及其报文Code.txt;输出CodeFile.data

及其原文Textfile.txt; 2. 概要设计 说明本程序中用到的所有抽象数据类型的定义。主程序的流程以及各程序模块之间的层次(调用)关系。 (1)数据结构 哈夫曼树的节点 struct huff { int weight; int parent; int l; int r; }; 哈夫曼编码的存储 struct huff *hufftree; (2)程序模块 选择1到i-1中parent为0且权值最小的两个下标 void Select(struct huff *HT, int n, int &s1, int &s2) 构建哈夫曼树: void huffmancoding(struct huff *ht,int *w,int n)

哈夫曼编码与译码的实现

数据结构课程设计评阅书

2011—2012学年第一学期 专业:信息管理与信息系统学号: 1021024016 姓名:万永馨 课程设计名称:数据结构课程设计 设计题目:哈夫曼编码与译码的实现 完成期限:自 2012 年 2 月 20 日至 2012 年 3 月 2 日共 2 周 设计依据、要求及主要内容(可另加附页): 该设计题目将按以下要求完成: 哈夫曼编码与译码是信息传输中应用的经典算法,运用C或VC++结合数据结构等基础知识,按 以下要求编程实现各种进制的转换。 任务要求:1)阐述设计思想,画出流程图;2)需要对哈夫曼编码/译码的相关原理有所了解,设计数 据结构,建立必要的信息数据文件(最好存储成外部文件),并分析完成用户所需的基本操作功能;3)实现给定信息的编码和译码功能;4)应有较好的界面设计,说明程序测试方法;5)按照格式要 求完成课程设计说明书。 设计要求: 1)问题分析和任务定义:根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么?(而不是怎么做?)限制条件是什么?确定问题的输入数据集合。 2)逻辑设计:对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的 原则划分模块,定义主程序模块和各抽象数据类型。逻辑设计的结果应写出每个抽象数据类型的定 义(包括数据结构的描述和每个基本操作的功能说明),各个主要模块的算法,并画出模块之间的调 用关系图; 3)详细设计:定义相应的存储结构并写出各函数的伪码算法。在这个过程中,要综合考虑系统 功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基 本操作的规格说明尽可能明确具体。详细设计的结果是对数据结构和基本操作做出进一步的求精, 写出数据存储结构的类型定义,写出函数形式的算法框架; 4)程序编码:把详细设计的结果进一步求精为程序设计语言程序。同时加入一些注解和断言, 使程序中逻辑概念清楚; 5)程序调试与测试:能够熟练掌握调试工具的各种功能,设计测试数据确保程序正确。调试正 确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果; 6)结果分析:程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。算 法的时间、空间复杂性分析; 7)编写课程设计报告; 以上要求前三个阶段的任务完成后,将设计说明书的草稿交指导老师面审,审查合格方可进入 后续阶段的工作。设计工作结束,经指导老师验收合格后将设计说明书装订,并答辩。

游程编码实验报告

实验二游程编码 一、实验目的 1、掌握游程编码原理; 2、理解数据编码压缩和译码输出编码的实现。 二、实验要求 实现游程编码和译码的生成算法。 三、实验内容 输入一幅二值图像,先统计要压缩编码的文件中的字符字母出现的次数,按字符字母和空格出现的概率对其进行哈夫曼编码,然后读入要编码的文件,编码后存入另一个文件;接着再调出编码后的文件,并对其进行译码输出,最后存入另一个文件中。 四、实验原理 1、xx 树的定义: 假设有n 个权值,试构造一颗有n 个叶子节点的二叉树,每个叶子带权值为wi ,其中树带权路径最小的二叉树成为哈夫曼树或者最优二叉树; 2、xx 树的构造: weight为输入的频率数组,把其中的值赋给依次建立的HT Node对象中的data属性,即每一个HT Node对应一个输入的频率。然后根据data属性按从小到大顺序排序,每次从data取出两个最小和此次小的HT Node,将他们的data 相加,构造出新的HTNode作为他们的父节点,指针pare nt,leftchild,rightchild 赋相应值。在把这个新的节点插入最小堆。 按此步骤可以构造出一棵XX树。 通过已经构造出的哈夫曼树,自底向上,由频率节点开始向上寻找parent, 直到parent 为树的顶点为止。这样,根据每次向上搜索后,原节点为父节点的

左孩子还是右孩子,来记录 1 或0,这样,每个频率都会有一个01 编码与之唯一对应,并且任何编码没有前部分是同其他完整编码一样的。 五、实验程序 #include #include #define NUM 1000 char dat,flag,str[NUM],b[NUM]; printf("( 请输入待编码的字符串)\n\n"); printf(" 原字符串为: "); gets(str);// 输入待编码的字符串 flag=str[0];// 记下第一个字符值作为flag 游程编码的起始值 /************************ 编码部分**********************************************/ printf("\n 游程编码为: "); for(i=0;i

huffman编码译码实现文件的压缩与解压.

数据结构 课程设计 题目名称:huffman编码与解码实现文件的压缩与解压专业年级: 组长: 小组成员: 指导教师: 二〇一二年十二月二十六日

目录 一、目标任务与问题分析 (2) 1.1目标任务 (2) 1.2问题分析 (2) 二、算法分析 (2) 2.1构造huffman树 (2) 2.1.1 字符的统计 (2) 2.1.2 huffman树节点的设计 (2) 2.2构造huffman编码 (3) 2.2.1 huffman编码的设计 (3) 2.3 压缩文件与解压文件的实现 (3) 三、执行效果 (4) 3.1界面 (4) 3.2每个字符的编码 (4) 3.3操作部分 (5) 3.4文件效果 (6) 四、源程序 (7) 五、参考文献 (16)

huffman编码与解码实现文件的压缩与解压 一、目标任务与问题分析 1.1目标任务 采用huffman编码思想实现文件的压缩和解压功能,可以将任意文件压缩,压缩后也可以解压出来。这样即节约了存储空间,也不会破坏文件的完整性。 1.2问题分析 本问题首先应该是利用哈夫曼思想,对需要压缩的文件中的个字符进行频率统计,为了能对任意的文件进行处理,应该所有的文件以二进制的方式进行处理,即对文件(不管包含的是字母还是汉字)采取一个个的字节处理,然后根据统计的频率结果构造哈夫曼树,然后对每个字符进行哈夫曼编码,然后逐一对被压缩的文件的每个字符构建的新的哈夫曼编码存入新的文件中即得到的压缩文件。解压过程则利用相应的哈夫曼树及压缩文件中的二进制码将编码序列译码,对文件进行解压,得到解压文件。 二、算法分析 2.1构造huffman树 要利用哈夫曼编码对文本文件进行压缩,首先必须知道期字符相应的哈夫曼编码。为了得到文件中字符的频率,一般的做法是扫描整个文本进行统计,编写程序统计文件中各个字符出现的频率。由于一个字符的范围在[0-255]之间,即共256个状态,所以可以直接用256个哈夫曼树节点即数组(后面有节点的定义)空间来存储整个文件的信息,节点中包括对应字符信息,其中包括频率。 2.1.1 字符的统计 用结构体huffchar来存放文件字符的信息。其中有文件中不同字符出现的种类Count、字符data。 struct huffchar{ //存放读入字符的类; int Count;//字符出现的个数; char data;//字符; }; 函数实现: bool char_judge(char c)//判断字符出现的函数; void char_add(char c)//添加新出现的字符; void read_file_count() //文件的读取 2.1.2 huffman树节点的设计 用结构体huff_tree来存储结点信息,其中有成员频率weight、父亲节点parent、左儿子节点lchild、右儿子节点rchild。

哈夫曼树的编码和译码

#include"stdafx.h" #include"stdio.h" #include"conio.h" #include #include #include using namespace std; #define maxbit 100 #define Maxvalue 2000//最大权值整数常量#define Maxleaf 100//最大叶子结点数 #define size 300//0、串数组的长度 static int n;//实际的叶子结点数 struct HNodeType { int weight; int parent; int lchild; int rchild; int ceng;//结点相应的层数 char ch;//各结点对应的字符 }; struct HCodeType { int bit[maxbit];//存放编码的数组 int start;//编码在数组中的开始位置}; static HNodeType *HuffNode;//定义静态指针HNodeType *init()//初始化静态链表 { HuffNode=new HNodeType[2*n-1]; for(int i=0;i<2*n-1;i++) { HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; HuffNode[i].ceng=-1; HuffNode[i].ch='0'; } return HuffNode; }

压缩技术实验编码

压缩技术实验编码 实验一统计编码 实验目的 1.熟悉统计编码的原理 2.掌握r元Huffman编码的方法; 3.了解Huffman编码效率及冗余度的计算; 二、实验原理 霍夫曼编码,又称最佳编码,根据字符出现概率来构造平均长度最短的变长编码。 Huffman编码步骤: (1)把信源符号x i(i=1,2,…按出现概率的值由大到小的顺序排列; (2)对两个概率最 小的符号分别分配以“ 0和“ 1,'然

后把这两个概率相加作为一个新的辅助符号的概率; (3)将这个新的辅助符号与其他符号一起重新按概率大小顺序排列; ⑷跳到第2步,直到出现概率相加为1为止; (5)用线将符号连接起来,从而得到一个码树,树的N个端点对应N个信源符号; (6)从最后一个概率为1的节点开始,沿着到达信源的每个符号,将一路遇到的二进制码“ 0或“ 1顺序排列起来,就是端点所对应的信源符号的码字。 以上是二元霍夫曼编码。如果是r元霍夫曼编码,则应该如何做呢? 在HUFFMAN 编码方案中,为出现概率较小的信源输出分配较长的码字,而对那些出现可能性较大的信源输出分配较短的码字。为此,首先将r 个最小可能的信源输出合并成为一个新的输出,该输出的概率就是上述的r 个输出的概率之和。重复进行该过程直到只剩下一个输出为止。信源符号的个数q 与r 必须满足如下的关系式: q = (r-1) n + r n 为整数如果不满足上述关系式,可通过添加概率为零的信源符号来满足。这样就生成了一个树,从该树的根节点出发并将0、1 分别分配给任何r 个来自于相同节点的 分支,生成编码。可以证明用这种方法产生的编码在前向树类

哈夫曼编码译码的设计与实现数据结构课程设计

《数据结构》课程设计题目--哈夫曼编码/译码的设计与实现 班级:13数据库一班 学号:1315925280 姓名:吴松 指导教师:王超

目录 目录 (1) 一、需求分析 (2) 二、设计要求 (2) 三、概要设计 (2) 1、流程图 (2) 2、设计包含的几个部分 (4) 四、详细设计 (2) 五、显示结果………………………………………………9. 六、心得体会 (10) 七、参考文献 (11) 哈夫曼编码译码 一、需求分析

在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。哈夫曼编码是一种编码方式,以哈夫曼树—即最优二叉树,带权路径长度最小的二叉树,经常应用于数据压缩。哈弗曼编码使用一张特殊的编码表将源字符(例如某文件中的一个符号)进行编码。这张编码表的特殊之处在于,它是根据每一个源字符出现的估算概率而建立起来的(出现概率高的字符使用较短的编码,反之出现概率低的则使用较长的编码,这便使编码之后的字符串的平均期望长度降低,从而达到无损压缩数据的目的)。赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码称为赫夫曼编码。树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和各个叶子对应的字符的编码,这就是赫夫曼编码。哈弗曼译码输入字符串可以把它编译成二进制代码,输入二进制代码时可以编译成字符串。 二、设计要求 对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生成的代码串进行译码,输出电文字符串。通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。电报通信是传递文字的二进制码形式的字符串。但在信息传递时,总希望总长度能尽可能短,即采用最短码。假设每种字符在电文中出现的次数为Wi,编码长度为Li,电文中有n种字符,则电文编码总长度为∑WiLi。若将此对应到二叉树上,Wi为叶结点的权,Li为根结点到叶结点的路径长度。那么,∑WiLi 恰好为二叉树上带权路径长度。因此,设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作权,构造一棵赫夫曼树,此构造过程称为赫夫曼编码。设计实现的功能: (1) 赫夫曼树的建立; (2) 赫夫曼编码的生成; (3) 编码文件的译码。 三、概要设计 哈夫曼编\译码器的主要功能是先建立哈夫曼树,然后利用建好的哈夫曼树生成哈夫曼编码后进行译码。 在数据通信中,经常需要将传送的文字转换成由二进制字符0、1组成的二进制串,称之为编码。构造一棵哈夫曼树,规定哈夫曼树中的左分之代表0,右分支代表1,则从根节点到每个叶子节点所经过的路径分支组成的0和1的序列便为该节点对应字符的编码,称之为哈夫曼编码。 最简单的二进制编码方式是等长编码。若采用不等长编码,让出现频率高的字符具有较短的编码,让出现频率低的字符具有较长的编码,这样可能缩短传送电文的总长度。哈夫曼树课用于构造使电文的编码总长最短的编码方案。 (1)其主要流程图如图1-1所示。

哈夫曼编码与译码器_数据结构课程设计报告

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:实现哈夫曼编码和译码器 院(系):计算机学院 专业:计算机科学与技术 班级:24010102 学号:2012040101082 姓名:尹伟和 指导教师:徐蕾

此页为任务书

目录 1.题目分析 (1) 1.1.题目重述 (1) 1.1.1.系统功能需求分析 (1) 2.程序设计 (2) 2.1.系统功能模块说明 (2) 2.1.1.系统功能模块结构 (2) 2.1.2.系统模块功能说明 (3) 2.2.数据结构说明 (3) 2.2.1.结构体定义说明 (3) 2.2.2.哈夫曼树 (4) 2.2.3.字符-哈夫曼编码对照表 (4) 2.3.函数说明 (4) 3.算法描述 (6) 3.1.哈夫曼树的构建 (6) 3.2.字符-哈夫曼编码对照表 (6) 3.3.编码 (6) 3.4.译码 (7) 4.程序测试 (9) 4.1.字符集输入 (9) 4.2.编码测试 (10) 4.3.译码测试 (11) 参考文献 (13) 附录(程序清单) (14)

沈阳航空航天大学课程设计报告 1.题目分析 1.1.题目重述 本次课程设计的目标是实现一个哈夫曼编码和译码器。该哈夫曼编码和译码器需要根据用户输入的字符集及相应字符出现的频率,对字符集所包含的字符进行哈夫曼编码。同时,作为编码器需要其对用户提供的明文字符串进行编码,使明文字符串变为二进制密文;作为译码器需要对用户提供的二进制密文进行译码,使二进制密文变为字符明文。 1.1.1.系统功能需求分析 通过对课程设计的题目分析,可以得出哈夫曼编码和译码器的功能需求,需求如下: 1)读取用户输入的字符集和相应字符出现的频率; 2)根据用户输入构建哈夫曼树; 3)根据哈夫曼树构建字符-哈夫曼编码对照表; 4)根据字符-哈夫曼编码对照表对明文字符串进行编码; 5)根据哈夫曼树对二进制密文进行译码。

游程编码实验报告材料

交通大学信息科学与工程学院综合性设计性实验报告 专业:通信工程专业11级 学号: 2 姓名:徐国健 实验所属课程:移动通信原理与应用 实验室(中心):信息技术软件实验室 指导教师:益才 2014年5月

一、题目 二值图像的游程编码及解码 二、仿真要求 对一幅图像进行编码压缩,然后解码恢复图像。 三、仿真方案详细设计 实验过程分为四步:分别是读入一副图象,将它转换成为二进制灰度图像,然后对其进行游程编码和压缩,最后恢复图象(只能恢复为二值图像)。 1、二值转换 所谓二值图像,就是指图像上的所有像素点的灰度值只用两种可能,不为“0”就为“1”,也就是整个图像呈现出明显的黑白效果。 2、游程编码原理 游程编码是一种无损压缩编码,对于二值图有效。游程编码的基本原理是:用一个符号值或串长代替具有相同值的连续符号,使符号长度少于原始数据的长度。据进行编码时,沿一定方向排列的具有相同灰度值的像素可看成是连续符号,用字串代替这些连续符号,可大幅度减少数据量。游程编码分为定长行程编码和不定长行程编码两种类型。游程编码是连续精确的编码,在传输过程中,如果其中一位符号发生错误,即可影响整个编码序列,使行程编码无法还原回原始数据。 3、游程编码算法 一般游程编码有两种算法,一种是使用1的起始位置和1的游程长度,另一种是只使用游程长度,如果第一个编码值为0,则表示游程长度编码是从0像素的长度开始。这次实验采

用的是前一种算法。两种方法各有优缺点:前一种存储比第二种困难,因此编程也比较复杂。而后一种需要知道第一个像素值,故压缩编码算法中需给出所读出的图的第一个像素值。 压缩流程图: 解压流程图:

PCM编码 实验报告

实验二十三 时分复用与解复用实验 实验项目一 256K 时分复用帧信号观测 (1)帧同步码观测:用示波器连接复用输出,观测帧头的巴克码。 (2)帧内PN 序列信号观测:用示波器接复用输出,利用储存功能观测3个周期 中的第一时隙的信号。 实验项目二 256K 时分复用及解复用 (1)帧内PCM 编码信号观测:将PCM 信号输入DIN2,观测PCM 数据。以帧同 思考题:PN15序列的数据是如何分配到复用信号中的? 分析分时复用的实质,可知,在模拟传送时,一位用户的数据根据复用划分的时隙以一帧为周期,逐次将8位数据插入每个帧相同的时隙处。对于此次实验中的PN15序列,检测到帧同步信号的帧头时,便插入第一帧数据,在第二次检测到帧头时插入第二帧数据,以此类推,将信号分配到复用信号中,以达到提高信道利用率的目的。 对比观测实验出现的码元,发现为01110010,根据所学知识可知,这串码即为帧头的观测码。

步为触发分别观测PCM编码数据和复用输出的数据。 (2)解复用帧同步信号观测:PCM对正弦波进行编译码。观测复用输出与FSOUT, 观测帧同步上跳沿与帧同步信号的时序关系。 思考题:PCM数据是如何分配到复用信号中去的? 时分多路复用以时间作为信号分割的参量,将各路输入变为变为并行数据,然后按照给端口数据所在的时隙进行帧的拼接,完成一个完整的数据帧。而在本实验中,PCM 的数据输入到DIN2,将其插入到复用信号的第2个时隙,与其它3个时隙拼接为一帧,从而实现了PCM信号分配到复用信号中。 上图分别为PCM编码输入和复用输出的波形。仔细观察可知,对比复用输入信号,复用输出有2帧的延时,且在复用输出的第0时隙为帧头的巴克码,第1时隙没有数据,第2时隙有了数据的存放,即PCM复用编码时被插在了一帧的第2时隙中,在解复用时先寻找巴克码,再按照每一帧的数据存放的相应的时隙进行解复用,之后拼接起来,便实现了PCM的数据恢复。

哈夫曼编码和译码系统

通达学院 算法与数据结构程序设计 题目:哈夫曼编码和译码系统 专业 学生姓名 班级学号 指导教师 指导单位 日期

教师评语 同学出勤率(满勤、较高、一般,较低),学习态度(端正、较端正、一般、较差),程序设计基础(好、较好、一般、较差),演示程序(已经、没有)达到了基本要求,算法设计(好、较好、一般),界面友好程度(好、较好、一般),答辩过程中回答问题(准确、较准确、错误率较高),撰写报告格式(规范、一般)、内容(丰满、简单)、表述(清晰、一般、不清楚),(圆满、较好、基本)完成了课题任务。 教师签名: 年月日 成绩评定 备注

一、题目要求: 题 目 :哈夫曼编码和译码系统 基本要求: (1) 能输入字符集和各字符频度建立哈夫曼树; (2) 产生各字符的哈夫曼编码,并进行解码。 提高要求: (1) 能设计出简捷易操作的窗口界面; (2) 编码和译码存储在文件中。 二、需求分析: 2.1基本思想 根据,哈夫曼的定义,一棵二叉树要使其带权路径长度最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点.依据这个特点便提出了哈夫曼算法,其基本思想是: (1) 初始化:由给定的n 个权值{w 1, w 2,…, w n }构造n 棵只有一个根结点的二叉树,从而得到一个二叉树集合F={ T 1,T 2,…,T n }; (2) 选取与合并:在F 中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一颗新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点的权值之和; (3) 删除与加入:在F 中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F 中; (4) 重复(2)、(3)两步,当集合F 中只剩下一棵二叉树时,这棵二叉树便是哈夫曼树. 2.2存储结构 在由哈夫曼算法构造的哈夫曼树中,非叶子结点的度均为2,根据二叉树的性质可知,具有n 个叶子结点的哈夫曼树共有2n-1个结点,其中有n-1个非叶子结点,它们是在n-1次的合并过程中生成的.为了便于选取根结点权值最小的二叉树以及合并操作,设置一个数组HuffmanNode[2n-1]保存哈夫曼树中各结点的信息,数组元素的结点结构如图所示. 图 哈夫曼树的结点结构 其中: weight parent lchild rchild i nf

《数字高程模型》实验讲义[1]

数字高程模型 实验讲义 南阳师范学院环旅学院 地理信息系统教研室编 2011年2月

前 言 Miller于1958年提出首次提出了数字高程模型(Digital Elevation Model,DEM)的概念。经过40多年的发展,DEM的诸多基础理论问题都得到了深入的研究,基于DEM的数字地形分析理论与方法体系正在形成,DEM在许多领域的工作中得到了成功应用。DEM已成为各类GIS数据库的核心数据之一。国家测绘部门将DEM作为国家空间数据基础设施(National Spatial data Infrastructure,NSDI)的重要建设项目之一。在理论研究方面,DEM的不确定性、DEM的尺度效应、DEM的地学分析、基于DEM的数据挖掘都取得了很大的突破。在应用方面,也从一般的地形因子提取、支持三维漫游等简单应用向更多样的形式、更广泛的领域发展。可以说,DEM所代表的已经不仅仅是一种记录海拔的空间数据,更代表着一种地学处理的方法。 适应于学科发展和实践需要,各高等院校的有关专业,特别是地理信息系统、空间信息与数字工程、测绘工程等专业都纷纷将数字高程模型作为本科和研究生课程。我学院办有地理信息系统和测绘工程等专业,数字高程模型一直是此二专业的重要课程。在多年教学经验的基础上,我们编写了本实验讲义,供地理信息系统专业、测绘工程专业的本科教学使用。本实验讲义中,以验证、探索理论知识和传授技能作为基础目标,另外还注重意识和能力的培养。当代教育理论认为,如果说知识和技能是人才素质的基础,意识则决定了运用知识和技能的动机,能力则是运用知识和技能的方法。当代地学人才不仅需要具有充足的专业知识和技能,而且应该具备一系列意识和能力。虽然,高校通常设置培养意识和能力的公共课程;但是,专业课教学也应该将其作为教学目标之一。这样以来,可以根据专业课程的特点有目的地培养特定的意识和能力。本课程所涉及的意识和能力主要包括科学精神、团队意识、创新能力和统合能力等。 本讲义共7个实验,需要16个实验课时。实验类型包括基础型、综合型和设计型。每个实验都有明确的实验目的,有实验原理的详细介绍,实验过程中的必要之处作了解释和提示。实验后安排了思考题,要求学生们通过在实验中的探索来回答这些问题,有助于学生更好地理解和掌握DEM的理论和方法。

信息论与编码实验报告.

本科生实验报告 实验课程信息论与编码 学院名称信息科学与技术学院 专业名称通信工程 学生姓名 学生学号 指导教师谢振东 实验地点6C601 实验成绩 二〇一五年十一月二〇一五年十一月

实验一:香农(Shannon )编码 一、实验目的 掌握通过计算机实现香农编码的方法。 二、实验要求 对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。 三、实验基本原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列 )()()(21n x p x p x p ≥≥≥ 2、确定满足下列不等式的整数码长K i ; 1)(l o g )(l o g 22+-<≤-i i i x p K x p 3、为了编成唯一可译码,计算第i 个消息的累加概率 ∑ -== 1 1 )(i k k i x p p 4、将累加概率P i 变换成二进制数。 5、取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。 四、源程序: #include #include #include #include #include using namespace std; int main() { int N; cout<<"请输入信源符号个数:";cin>>N; cout<<"请输入各符号的概率:"<

int i,j; for(i=0;i

相关主题
文本预览
相关文档 最新文档