实验二、Huffman编码
优秀Huffman编码 实验报告

实验二:Huffman 编码的实现实验学时:3实验类型:(演示、验证、综合、√设计、研究)实验要求:(√必修、选修)一、 实验目的 理解和掌握huffman 编码的基本原理和方法,实现对信源符号的huffman 编码。
二、 实验内容1. 理解和掌握huffman 编码的基本原理和方法2. 通过MATLAB 编程实现对单信源符号的huffma 编码3. 计算信源的信息熵、平均码长以及编码效率三、 实验原理1.Huffman 编码按信源符号出现的概率而编码,其平均码长最短,所以是最优码。
2.无失真信源编码定理:对于熵为H (X )的离散无记忆的平稳信源,必存在一种无失真编码,使每符号的平均码长满足不等式:()()1log log H S H S L r r≤<+ 3.二元Huffman 编码:若将编码设计为长度不等的二进制编码,即让待传字符串中出现概率大的字符采用尽可能短的码字,而把长的码字分配给概率小的信源符号。
构造方法如下:(a ) 将信源概率分布按大小以递减次序排列;合并两概率最小者,得到新信源;并分配0/1符号。
(b ) 新信源若包含两个以上符号返回(a ),否则到(c )。
(c ) 从最后一级向前按顺序写出每信源符号所对应的码字。
四、 实验数据源1.12345[]:0.40.20.20.10.1s s s s s X P ⎧⋅⎨⎩:{0,1}X2.123456[]:0.240.200.180.160.140.08s s s s s s X P ⎧⋅⎨⎩:{0,1}X 五、实验组织运行要求以学生自主训练为主的开放模式组织教学六、实验条件(1)微机(2)MATLAB 编程工具七、实验原理七、实验代码clear% S=[0.4,0.2,0.2,0.1,0.1]; S=[0.24,0.20,0.18,0.16,0.14,0.08];% S=[0.20,0.19,0.18,0.17,0.15,0.10,0.01];S0=sort(S); %将序列进行升序排列S1=fliplr(S0); %将升序排列的概率进行左右翻转得到降序排列t=length(S1); %得到信源符号的个数coding_table=[S1']; %创建编码过程表,第一列for i=1:length(S1)-1s=coding_table(t,i)+coding_table(t-1,i); %最小两个值相加S1(t-1)=s;S1(t)=0;t=t-1;S1=fliplr(sort(S1)); %进行重新降序排列coding_table=[coding_table,S1']; %排序结果加入到编码过程表for j=1:length(S1)if s==S1(j)b(i)=j; %记录两个最小概率相加得到的值在新排序中的位置。
数据结构实验实验报告Huffman赫夫曼编码及应用

实验报告课程名称:数据结构实验名称:赫夫曼编码及应用院(系):计算机与通信工程学院专业班级:计算机科学与技术姓名:学号:指导教师:2020 年 5 月12 日一、实验目的掌握赫夫曼树和赫夫曼编码的基本思想和算法的程序实现。
二、实验内容及要求1、任务描述a.提取原始文件中的数据(包括中文、英文或其他字符),根据数据出现的频率为权重,b.构建Huffman编码表;c.根据Huffman编码表对原始文件进行加密,得到加密文件并保存到硬盘上;d.将加密文件进行解密,得到解码文件并保存点硬盘上;e.比对原始文件和解码文件的一致性,得出是否一致的结论。
2、主要数据类型与变量a.对Huffman树采用双亲孩子表示法,便于在加密与解密时的操作。
typedef struct Huffman* HuffmanTree;struct Huffman{unsigned int weight; //权值unsigned int p, l, r;//双亲,左右孩子};b.对文本中出现的所有字符用链表进行存储。
typedef struct statistics* List;struct statistics {char str; //存储此字符int Frequency; //出现的频率(次数)string FinalNum; //Huffman编码struct statistics* Next;};3、算法或程序模块对读取到的文本进行逐字符遍历,统计每个字符出现的次数,并记录在创建的链表中。
借助Huffman树结构,生成结构数组,先存储在文本中出现的所有字符以及它们出现的频率(即权值),当作树的叶子节点。
再根据叶子节点生成它们的双亲节点,同样存入Huffman树中。
在完成对Huffman树的创建与存储之后,根据树节点的双亲节点域以及孩子节点域,生成每个字符的Huffman编码,并存入该字符所在链表节点的FinalNum域。
huffman编码C语言实验报告

Huffman编码数学系李一鹏PB12001076 第五组1.实验题目:huffman编码2.实验目的:熟悉二叉树操作,掌握huffman编码思想。
3.实验内容:任盈盈要传授给令狐冲读心大法,她深色庄重地递给令狐冲一张貌似剑谱的那啥。
令狐冲一看,蒙了,这……这是啥?擦,01010001101010111010101001010010101011101110?任盈盈说,其实人类内心的微小波动都可以通过读心术转化为0和1,只是人类会想得太多,我们如果需要迅速辨认出别人所想,必先有一个简单的01序列。
令狐冲很想知道小师妹在想些什么,但是…令狐冲的脑袋你懂的,请大家编一个程序满足这人渣男主吧…4.算法思想:先把每个结点以树的形式储存在数组中,每次选择两个权值最小的两颗树合并成一个树加入数组,操作时只需要判断父结点是否为空即可判断其是否可合并。
5.程序清单:#include<stdio.h>#include<stdlib.h>#define new1 (ht*)malloc(sizeof(ht))typedef struct huffmantree{char data;int weight;struct huffmantree *left,*right,*parent;}ht;char s[20],a[128][128],b[128];int maxdepth;ht *huffmancreate(){//创建huffman树ht *p[256],*p1,*p2;FILE *f1;int c[128]={0},k=0,j,i,min1,min2;char d;f1=fopen("article.txt","r");while(1){d=fgetc(f1);if(feof(f1))break;c[d]++;}//统计字符数目fclose(f1);for(i=0;i<128;i++)//生成n个叶结点if(c[i]){p[k]=new1;p[k]->weight=c[i];p[k]->data=i;p[k]->left=0;p[k]->right=0;p[k]->parent=0;k++;}for(i=k;i<=2*(k-1);i++){//生成根结点和n-2个枝结点p[i]=new1;p[i]->parent=0;p[i]->data=6;//枝结点和根结点用黑桃表示min2=min1=32767;for(j=0;j<i;j++)if(!p[j]->parent)if(p[j]->weight<min1){min2=min1;p2=p1;min1=p[j]->weight;p1=p[j];}else if(p[j]->weight<min2){min2=p[j]->weight;p2=p[j];}p[i]->left=p1;p[i]->right=p2;p1->parent=p[i];p2->parent=p[i];p[i]->weight=min1+min2;}return p[i-1];//返回根结点}void fwh(ht *p,int i){//用递归进行huffman编码int j;char c;if(p->left){s[i]=48;fwh(p->left,i+1);s[i]=49;fwh(p->right,i+1);}else{putchar(p->data);putchar(9);//输出结点名c=p->data;b[c]=i;for(j=0;j<i;j++){putchar(s[j]);a[c][j]=s[j];}//输出编码putchar(10);}}void depth(int i,ht *p){//求一棵树的深度if(p){if(i>maxdepth)maxdepth=i;depth(i+1,p->left);depth(i+1,p->right);}}int forwardspace(ht *p){//求最左边结点到左屏幕的空格数int i,fs;for(i=0;p;p=p->left)i++;for(fs=0;i<maxdepth;i++)fs=fs*2+1;return fs;}void writeln(ht*p){//输出树int i,a[20],pow2[20],front,rear,fs,nowd,nown,num[200],d[200];//num[i]:第i 个结点在拓展二叉树中的序号,nown:前一个输出的结点序号,d[i]:第i个结点的层数,nowd:当前层数ht *queue[200];depth(1,p);a[maxdepth+1]=1;for(i=maxdepth;i>=1;i--) a[i]=2*a[i+1];//求第i行两结点的空格数+1pow2[1]=1;for(i=2;i<=maxdepth;i++) pow2[i]=pow2[i-1]*2;//2的i-1次方front=rear=0;fs=forwardspace(p);queue[++rear]=p;d[rear]=1;num[rear]=1;nowd=0;nown=0;while(front<rear){//层次遍历并输出二叉树p=queue[++front];//出队if(d[front]>nowd){nowd++;putchar(10);for(i=1;i<=a[nowd]/2-1+(num[front]-pow2[nowd])*a[nowd]-fs;i++)putchar(3 2);//输出每行的第一个结点}elsefor(i=1;i<=(num[front]-nown)*a[nowd]-1;i++)putchar(32);//输出该行的其余结点putchar(p->data);nown=num[front];if(p->left){queue[++rear]=p->left;d[rear]=nowd+1;num[rear]=nown*2;}//左结点入队if(p->right){queue[++rear]=p->right;d[rear]=nowd+1;num[rear]=nown*2+1;} //右结点入队}putchar(10);}void transfer(){//编码FILE *f1,*f2;char d,i;f1=fopen("article.txt","r");f2=fopen("transfer_article.txt","w");while(1){d=fgetc(f1);if(feof(f1))break;for(i=0;i<b[d];i++)fputc(a[d][i],f2);}fclose(f1);fclose(f2);}void antitransfer(ht *head){//解码FILE *f1;ht *p;char c;f1=fopen("transfer_article.txt","r");while(1){p=head;while(p->left){c=fgetc(f1);if(feof(f1))break;if(c==48)p=p->left;else p=p->right;}if(feof(f1))break;putchar(p->data);}putchar(10);fclose(f1);}main(){ht *head;head=huffmancreate();printf("These are the huffman code creating form the article.txt:\n");fwh(head,0);printf("Here is the huffman tree:");writeln(head);transfer();printf("Here is the article antitransfer from the transfer_article.txt:\n");antitransfer(head);}6.运行结果:(1):(2):7.调试分析:设计实验时在树的输出上用了较多时间,为了美观而靠左输出树,但叶结点一旦多于20个就没辙了,所以没给出第一个运行结果的树的输出。
Huffman编解码实验报告

Huffman编解码实验报告⽂本⽂件的⼆进制预统计Huffman编解码⼀、实验⽬的(1) 熟悉Huffman编解码算法;(2) 理解Huffman编码的最佳性。
⼆、实验内容1、编程思想霍夫曼(Huffman)编码是1952年为⽂本⽂件⽽建⽴,是⼀种统计编码。
属于⽆损压缩编码。
霍夫曼编码的码长是变化的,对于出现频率⾼的信息,编码的长度较短;⽽对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长⼀定⼩于实际信息的符号长度。
计算机编程实现时,⾸先统计带编码的⽂本⽂件中各个字符出现的概率,然后将概率作为节点的权值构建huffman树。
编码时从叶⼦节点出发,如果这个节点在左⼦树上,则编码0,否则编码1,直到根节点为⽌,所得到的01序列即为该叶⼦节点的编码。
所有叶⼦节点的编码构成⼀个码本。
有两种译码⽅法:(1)按位读⼊码字,从已建好的Huffman树的根节点开始,若码字为“0”,则跳到左⼦树,若为“1”则跳到右⼦树,直到叶⼦结点为⽌,输出叶⼦接点所表⽰的符号。
(2)由于Huffman编码是唯⼀码,还有另⼀种译码⽅法,每读⼊⼀位编码就去码本中去匹配相应的码字,若匹配不成功,则继续读⼊下⼀个编码,直到匹配成功为⽌。
显然前⼀种⽅法⽐较简便,本程序采⽤便是该⽅法。
2、程序流程图3、编程实现本实验采⽤⽤C 语⾔程序语⾔,VC++ 6.0编程环境。
(1)数据结构构造存放符号及其权值的存储结构如下 typedef struct {unsigned char symbol; //符号的ASCII 码值 int sweight; //权值}syml_weit;syml_weit *sw;构造huffman 树存储结构如下:typedef struct {int weit; //权值int lchd; //左孩⼦地址 int rchd; //右孩⼦地址 int part; //双亲地址 }hufmtree;hufmtree *htree;(2)函数本程序共包含5个函数:⼀个主函数:void main(), 4个⼦函数:void CountWeight(unsigned char *DataBuf,int FileLen); void BuildTree();void HufmCode(unsigned char *DataBuf,int FileLen); void HufmDCode(unsigned char *CDataBuf,int CDataLen); 其功能分别CountWeight----计算⽂本⽂件中各符号的权值; BuildTree-------构建Huffman 树,形成码本; HufmCode---------对⽂本⽂件进⾏编码; HufmDCode-------进⾏译码。
实验二 英文文本的Huffman编码压缩

福建农林大学计算机与信息学院实验报告系:信息与机电工程系专业:计算机科学与技术年级:2009姓名:黄伟河学号:092231048 实验室号__607 计算机号S48实验时间:指导教师签字:成绩:报告退发(订正、重做)实验名称:英文文本的Huffman编码压缩一、实验目的和要求了解Huffman编码的特点,掌握Huffman编码基本原理及编码算法的设计与程序实现。
二、实验内容和原理以任意选择一个纯英文文本为数据,设计出Huffman编码的压缩和解压缩算法,并写出程序予以实现。
霍夫曼(Huffman)编码是一种统计编码,属于无损压缩编码。
霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长一定小于实际信息的符号长度。
三、实验环境硬件:计算机软件:Windows 2000和MATLAB编程环境。
四、算法描述及实验步骤1、在matlab中输入代码:clear;x=input('输入一串字符串','s');k=length(x);t1=1;A(t1:k)=0;B(t1:k)=0;for i=1 :kkk=findstr(A,x(i));if isempty(kk)A(t1)=x(i);B(t1)=1;t1=t1+1;elset2=kk(1);B(t2)=B(t2)+1;endendfor i=1:t1-1c(i)=A(i);d(i)=B(i)/k;endt(1:t1-1,1)=0;t(1:t1-1,2)=0;for i=1:t1-1if i==1t(i,1)=0;t(i,2)=d(i);elsefor j=1:i-1t(i,1)=t(i,1)+d(j);endfor j=1:it(i,2)=t(i,2)+d(j);endendendl=0;r=1;d=r-l;for i=1:kkk=findstr(c,x(i)) ;t3=kk(1);pl=t(t3,1);pr=t(t3,2);l=l+d*pl;r=l+d*(pr-pl);strl=strcat('输入第',int2str(i),'符号的间隔左右边界:'); disp(strl);format longdisp(l);disp(r);d=r-l;endy1=input('请输入一个小数');n=input('请输入要解码的个数');s='';for i=1:nfor j=1:t1-1if y1<t(j,2) && y1>=t(j,1)s=strcat( s,c(j));y1=y1-t(j,1);y1=y1/(t(j,2)-t(j,1));break;endendends五、调试过程无错六、实验结果1、输入一串字符串sdjkgha2、请输入一个小数0.23、请输入要解码的个数44、s =djhg七、总结通过这次试验,认识了哈夫曼编码的特点,加深了书本的理论知识。
数据压缩实验报告(3篇)

第1篇一、实验目的1. 了解数据压缩的基本原理和方法。
2. 掌握常用数据压缩算法的应用。
3. 分析不同数据压缩算法的性能和适用场景。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 数据压缩工具:Huffman编码、LZ77、LZ78、RLE、JPEG、PNG三、实验内容1. Huffman编码2. LZ77编码3. LZ78编码4. RLE编码5. 图像压缩:JPEG、PNG四、实验步骤1. Huffman编码(1)设计Huffman编码树,计算每个字符的频率。
(2)根据频率构建Huffman编码树,为每个字符分配编码。
(3)将原始数据按照Huffman编码进行编码,得到压缩数据。
(4)解压缩:根据编码表还原原始数据。
2. LZ77编码(1)设计LZ77编码算法,查找匹配的字符串。
(2)将原始数据按照LZ77编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
3. LZ78编码(1)设计LZ78编码算法,查找匹配的字符串。
(2)将原始数据按照LZ78编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
4. RLE编码(1)设计RLE编码算法,统计连续字符的个数。
(2)将原始数据按照RLE编码进行编码,得到压缩数据。
(3)解压缩:根据编码表还原原始数据。
5. 图像压缩:JPEG、PNG(1)使用JPEG和PNG工具对图像进行压缩。
(2)比较压缩前后图像的质量和大小。
五、实验结果与分析1. Huffman编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为25KB。
(2)压缩效率:压缩比约为4:1。
2. LZ77编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为35KB。
(2)压缩效率:压缩比约为3:1。
3. LZ78编码(1)压缩前后数据大小:原始数据大小为100KB,压缩后大小为30KB。
(2)压缩效率:压缩比约为3.3:1。
试验2Huffman编码的实现用C++实现
实 验 3 Huffman 编码的实现一、实验内容与步骤:1. 给出单符号离散信源的信源符号的一阶概率分布。
2. 对信源符号按概率降序排列3. 将对应符号根据huffman 符号缩减方法进行信源编码;4. 给出每个符号的码字二、实验环境1. Windows 2000 或XP2. 高级编程语言,建议采用c ++上三、实验目的1. 掌握huffman 编码方法2. 复习排序算法四、实验要求1. 提前预习实验,认真阅读实验原理以及相应的参考书。
2. 认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。
3. 认真填写实验报告。
五、实验原理huffman 编码的原理与步骤:(1) 将q 个信源符号按概率分布的大小,以递减次序排列起来,设)()()(21q x p x p x p ≥≥≥(2) 用“0”和“1”码符号分别代表概率最小的两个信源符号,并将这两个概率最小的符号合并成一个符号,合并的符号概率为两个符号概率之和,从而得到只包含q-1个符号的新信源,称为缩减信源。
(3)把缩减信源的符号仍旧按概率大小以递减次序排列,再将其概率最小的两个信源符号分别用“0”和“1”表示,并将其合并成一个符号,概率为两符号概率之和,这样又形成了q –2 个符号的缩减信源。
(4)依此继续下去,直至信源只剩下两个符号为止。
将这最后两个信源符号分别用“0”和“1”表示。
(5)然后从最后一级缩减信源开始,向前返回,就得出各信源符号所对应的码符号序列,即对应的码字。
六、实验体会哈夫曼编码方法得到的码一定是即时码。
因为这种编码方法不会使任一码字的前缀为码字。
由于哈夫曼编码总是把概率大的符号安排在离根节点近的终端节点,所以其码长比较小,因此得到的编码整体平均码长就比较小。
哈夫曼编码得到的码不是唯一的,因为每次对缩减信源中两个概率最小的符号编码的时候,“0”和“1”的安排是任意的。
另外当两个符号的概率相同的时候,排列的次序也是随意的,所以可能导致不同的编码结果,但最后的平均码长一定是一样的。
霍夫曼树编码实验报告(3篇)
第1篇一、实验背景霍夫曼树编码是一种基于字符频率进行数据压缩的算法,由David A. Huffman在1952年提出。
该算法通过构建霍夫曼树,为不同频率的字符分配不同长度的编码,从而实现数据压缩。
本实验旨在通过C语言实现霍夫曼树编码,并验证其压缩和解压缩效果。
二、实验目的1. 理解霍夫曼树编码的基本原理和步骤。
2. 掌握C语言实现霍夫曼树编码的方法。
3. 评估霍夫曼树编码的压缩效果和解压缩准确性。
三、实验原理霍夫曼树编码的核心思想是构建一棵霍夫曼树,该树由字符和它们的频率构成。
霍夫曼树的构建过程如下:1. 统计输入数据中每个字符的频率。
2. 将字符和频率作为节点,构建最小堆(优先队列)。
3. 重复以下步骤,直到堆中只剩下一个节点:a. 从堆中取出两个频率最小的节点,作为左右子节点。
b. 将这两个节点合并为一个新节点,其频率为两个节点频率之和。
c. 将新节点插入堆中。
4. 最小堆中的最后一个节点即为霍夫曼树的根节点。
霍夫曼树的叶子节点代表字符,非叶子节点代表子节点的频率之和。
根据霍夫曼树的构建,可以生成每个字符的编码,频率高的字符分配较短的编码,频率低的字符分配较长的编码。
四、实验步骤1. 数据准备:选择一段文本数据作为实验对象。
2. 字符频率统计:统计文本数据中每个字符的出现次数。
3. 构建霍夫曼树:根据字符频率构建霍夫曼树。
4. 生成编码表:根据霍夫曼树生成字符编码表。
5. 编码数据:使用编码表对文本数据进行编码。
6. 解压缩数据:根据编码表对编码后的数据进行解压缩。
7. 结果分析:比较原始数据和压缩数据的差异,评估压缩效果和解压缩准确性。
五、实验结果1. 字符频率统计:统计结果显示,字符“e”、“t”、“a”等在文本中出现的频率较高。
2. 构建霍夫曼树:成功构建了霍夫曼树,树中包含了所有字符及其频率。
3. 生成编码表:根据霍夫曼树生成了字符编码表,频率高的字符分配了较短的编码。
4. 编码数据:使用编码表对文本数据进行编码,成功生成了压缩数据。
霍夫曼编码
1.复习C++代码基本语法(结构体、树等数据结构定义) 2.根据Huffman 编码源代码,学习算法实现流程,培养自己动手能 力,在C++编译器下按步调试跟踪算法。
三、实验仪器、设备
1.计算机-系统最低配置 256M 内存、P4 CPU。 2.C++ 编程软件 - Visual C++ 7.0 (Microsoft Visual Studio 2003)
步骤2: 在步骤1中得到的树林里找出频率值最小的两棵树,将他们 分别作为左、右子树连成一棵大一些的二叉树,该二叉树的频率值设为 两棵子树频率之和。
步骤3: 对上面得到的树林重复步骤2的做法,直到所有符号都连入 树中为止。
五、实验步骤
1.VC 环境下,建一个C++控制台应用程序,并把源代码考到该程序 目录下。
七、思考题
根据Huffman 算法的C++源程序,试着写出Huffman 编码的Matlab 程
序?
编码流程: 1. 读入一幅图像的灰度值; 2. 将矩阵的不同数统计在数组c的第一列中; 3. 将相同的数占站整个数组总数的比例统计在数组p中; 4. 找到最小的概率,相加直到等于1,把最小概率的序号存在tree第 一列中,次小放在第二列,和放在p像素比例之后; 5. C数组第一维表示值,第二维表示代码数值大小,第三维表示代码 的位数; 6. 把概率小的值为1标识,概率大的值为0标识; 7. 计算信源的熵 ; 8. 计算平均码长 ; 9. 计算编码效率';
10. 计算冗余度。
Huffman编码m文件及分析
function [h,l]=huffman(p) if (length(find(p<0))~=0)
Huffman编码软件实现培训资料
H u f f m a n编码软件实现信息与编码实验报告姓名:学号:专业班级:学院:联系方式:实验二:Huffman编码软件实现一、实验目的1.进一步熟悉Huffman编码过程;2.掌握Matlab程序的设计和调试技术。
二、实验要求1.输入:信源符号个数r、信源的概率分布P;2.输出:每个信源符号对应的Huffman编码的码字。
三、实验内容1)从键盘输入组成信源S的字符个数N;2)从键盘输入信源S和组成信源的字符所对应的概率数组P;3)对信源进行二进制Huffman编码。
四、实验报告1.简要总结Huffman编码的原理与特点霍夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。
属于无损压缩编码。
霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长一定小于实际信息的符号长度。
霍夫曼编码,有如下特征:a.它是一种分组码:各个信源符号都被映射成一组固定次序的码符号。
b.它是一种唯一可解的码:任何码符号序列只能以一种方式译码。
c.它是一种即时码:由于代表信源符号的节点都是终端节点,因此其编码不可能是其他终端节点对应的编码的前缀,即霍夫曼编码所得的码字为即时码。
所以,一串码符号中的每个码字都可不考虑其后的码符号直接解码出来。
2.写出Huffman编码的基本步骤,画出实现Huffman编码的程序流程图。
设信源s={s1,s2,…sq},其对应的概率分布为p(si)={p1,p2,…,pq},霍夫曼编码的编码步骤如下:a.将q个信源符号按概率递减的方式排列。
b.用0、1码符号分别表示概率最小的两个信源符号,并将这两个概率最小的信源符号合并成一个新的符号,其概率为两符号概率之和,从而得到只包含q-1个符号的新信源,称为s信源的缩减信源s1.c.将缩减信源s1中的符号仍按概率大小以递减次序排列,再将其最后两个概率最小的符号合并成一个符号,并分别用0、1码符号表示,这样又形成了由q-2个符号构成的缩减信源s2.d.依次继续下去,直到缩减信源只剩下两个符号为止,将最后两个字符分别用0、1码符号表示,从右向左读取相应的码字,即为对应信源符号的码字。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息论与编码实验报告
完成时间:2012 年 12 月 22 日1、简要总结Huffman编码的基本原理及特点;
哈夫曼码是用概率匹配方法进行信源编码。
它有两个明显的特点:一是哈夫曼的编码方
法保证了概率大的符号对应于短码,概率小的符号对应于长码,充分利用了短码;二是缩减
信源的最后两个码字总是最后一位不同,从而保证了哈夫曼码是即时码
特点:
(1)它是一种分组码;
(2)它是一种唯一可译码;
(3)它是一种即时码。
2、写出Huffman编码基本步骤,画出实现Huffman编码的程序流程图;
步骤进行:
1)将信号源的符号按照出现概率递减的顺序排列。
2)将两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。
3)重复进行步骤1和2直到概率相加的结果等于1为止。
4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。
5)记录下概率为1处到当前信号源符号之间的0,1序列,从而得到每个符号的编码。
3、实现二元Huffman码编码的Matlab源程序;
probabilities = [0.0856 0.0139 0.0279 0.0378 0.1304 0.0289 0.0199 0.0528 0.0627 0.0013 0.0042 0.0339 0.0249 0.0707 0.0797 0.0199 0.0012 0.0677 0.0607 0.1045 0.0249
0.0092 0.0149 0.0017 0.0199 0.0008];
probabilities = probabilities/sum(probabilities);
for index = 1:length(probabilities)
codewords{index} = [];
set_contents{index} = index;
set_probabilities(index) = probabilities(index);
end
disp('-------------------------------------------------------------------------');
disp('The sets of symbols and their probabilities are:')
for set_index = 1:length(set_probabilities)
disp([num2str(set_probabilities(set_index)),' ', num2str(set_contents{set_index})]);
end
while length(set_contents) > 1
[temp, sorted_indices] = sort(set_probabilities);
zero_set = set_contents{sorted_indices(1)};
zero_probability = set_probabilities(sorted_indices(1));
for codeword_index = 1:length(zero_set)
codewords{zero_set(codeword_index)} = [codewords{zero_set(codeword_index)}, 0];
end
one_set = set_contents{sorted_indices(2)};
one_probability = set_probabilities(sorted_indices(2));
for codeword_index = 1:length(one_set)
codewords{one_set(codeword_index)} = [codewords{one_set(codeword_index)}, 1];
end
disp('The symbols, their probabilities and the allocated bits are:');
for index = 1:length(codewords)
disp([num2str(index),' ',num2str(probabilities(index)),' ',num2str(codewords{index})]);
end
set_contents(sorted_indices(1:2)) = [];
set_contents{length(set_contents)+1} = [zero_set, one_set];
set_probabilities(sorted_indices(1:2)) = [];
set_probabilities(length(set_probabilities)+1) = zero_probability + one_probability;
disp('The sets and their probabilities are:')
for set_index = 1:length(set_probabilities)
disp([num2str(set_probabilities(set_index)),' ', num2str(set_contents{set_index})]);
end
end
disp('-------------------------------------------------------------------------');
disp('The symbols, their probabilities and the allocated Huffman codewords are:');
for index = 1:length(codewords)
disp([num2str(index), ' ', num2str(probabilities(index)),' ',num2str(codewords{index}(length(codewords{index}):-1:1))]);
end
entropy = sum(probabilities.*log2(1./probabilities));
av_length = 0;
for index = 1:length(codewords)
av_length = av_length + probabilities(index)*length(codewords{index});
end
disp(['The symbol entropy is: ',num2str(entropy)]);
disp(['The average Huffman codeword length is: ',num2str(av_length)]);
disp(['The Huffman coding rate is: ',num2str(entropy/av_length)]);
4、讨论不同的Huffman编码的平均码长如何变化,码字长度偏离平均码长对编码性能的影
响。
对于不同方式的huffman编码,其平均码长保持不变。
若码字长度偏离平均码长太大,
则需要大量的存储设备来缓冲码字长度的差异,若存储量不够时,可能有时取空,有时溢出。
不同的Huffman 编码的平均码长不变,码字长度偏离平均码长越小,那么这
种码长方差就越小,编码器和解码器就越简单。
在哈夫曼编码过程中,对缩减信
源符号按概率由大到小的顺序重新排列时,应使合并后的新符号尽可能排在靠前
的位置,这样可使合并后的新符号重复编码次数减少,使短码得到充分利用。