信息论三种编码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LZW编码

LZW压缩算法的基本原理:

提取原始文本文件数据中的不同字符,基于这些字符创建一个编译表,然后用编译表中的字符的索引来替代原始文本文件数据中的相应字符,减少原始数据大小。看起来和调色板图象的实现原理差不多,但是应该注意到的是,我们这里的编译表不是事先创建好的,而是根据原始文件数据动态创建的,解码时还要从已编码的数据中还原出原来的编译表.

LZW编码的流程图:

LZW编码的源代码:

#include

#include

void copy1(char *prefix,char *s,int i,int j)

{ int k;

for(k=0;k<20;k++)

prefix[k]=0;

for(k=i;k

prefix[k-i]=s[k];

}

void main()

{int i ,j,k,n,t,m;

char s[30],prefix[30],dic[20][30]={"A","B","C"},c[20]; k=3;m=0;j=1;i=0;

printf(“Please input some words:\n");

gets(s);

while(i

{

copy1(prefix,s,i,j);

for(n=0;n

{

if(strcmp(prefix,dic[n])==0) //比较两字符串

{ j++; m=n;

if( (i+j)<=strlen(s) )

copy1(prefix,s,i,j);

else

strcpy(prefix,"");

}

}

printf(“%d\n",m);

if(strlen(prefix)!=0)//求字符串长度

{strcpy(dic[k],prefix);//把后面的字符复给到前面

printf("%s\n",dic[k]);}

k=k+1;

i=i+j-1;

j=1;

}

getch();

}

实验结果:

Huffman编码

Huffman编码原理简介:

霍夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。属于无损压缩编码。霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。

Huffman编码过程的几个步骤:

l)将信号源的符号按照出现概率递减的顺序排列。

2)将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。

3)重复进行步骤1和2直到概率相加的结果等于1为止。

4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。

5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。

Huffman编码源代码:

#include

#include

#define sy_max 100

#define sy_max2 30

#define sy_max3 59

#define DEEP 10 /*定义sycode1类*/

typedef struct{

float weight;

int flag;int father;

int leftchilde;

int rightchilde;

}sycode1; /*定义类sycode2类*/

typedef struct{ int sy_array[sy_max2];int start;}sycode2; int main(void)

{sycode1 sy1[sy_max3];

sycode2 sy2[sy_max2],cd;

int i,j,x1,x2,n,c,p;

float m1,m2,temp,hx=0,KL=0;

printf("please input the signal's length\n");

scanf("%d",&n); /*根据输入长度,初始化编码变量*/

for(i=0;i<=2*n-1;i++)

{sy1[i].weight=0;

sy1[i].father=0;

sy1[i].flag=0;

sy1[i].leftchilde=-1;

sy1[i].rightchilde=-1;

}

printf("input the probability for every signal:\n");

/*根据输入长度,接收相应数目的概率数*/

for(i=0;i

{ printf("input %dth probability:",i+1);

scanf("%f",&temp);

sy1[i].weight=temp;

hx=hx-temp*3.332*log10(temp);

}

for(i=0;i

{

m1=m2=sy_max;

x1=x2=0;

for(j=0;j

相关文档
最新文档