【数据压缩实验】LZW编解码算法实现与分析

本文详细介绍了LZW编码和解码原理,包括词典编码的基础、编码及解码过程。针对特殊情况,当当前码字在词典中不存在时,提出了解决方案:复制上一个码字的第一个符号到当前位置,以形成正确的新码字。通过实验,验证了LZW编码器在不同文件格式上的压缩效果,分析了压缩效率。
摘要由CSDN通过智能技术生成

一.实验目的

掌握词典编码的基本原理,用C/C++/Python等语言编程实现LZW解码器并分析编解码算法

二.实验原理

1.LZW编码原理

核心思想:

词典初始化为包含所有的单字符,当前前缀串P为空。

输入数据流中的下一个字符C,

判断P+C是否在词典中

(1)存在

         将P+C作为新的前缀串赋给P

(2)不存在

         输出P对应的码字CW,将P+C录入词典,再将C作为新的前缀串赋给P

2.LZW解码原理

解码算法中主要涉及两个变量:CW和PW

核心思想:

(1)读入码字流中的的第一个码字,赋给CW

(2)并将Dictionary[CW]赋给将要输出的字符流(解码)

(3)将CW赋给PW作为前缀串,同时CW接受码字流中的下一个新码字

(4)将Dictionary[PW]赋给P,将Dictionary[CW]赋给C

(5)判断P+C是否存在于词典中,如果不存在(且词典有足够的空间),就将P+C作为新词条写入

(6)将CW赋给PW作为新的前缀串,重复以上步骤

特殊情况:

若当前码字在词典中不存在时应如何处理?为什么?

首先分析当前码字在词典中不存在的原因:

在编码过程中,当遇到一个新的字符串时,要将该新字符串写入词典,然后读取下一个字符串,若下一个字符串正巧为刚刚新写入的字符串,则由于延时问题,解码端不能同步更新这个新字符串的索引号,所以会出现当前码字在词典中不存在。

但通过观察,我们会发现,在以上这种特殊情况中,新词条有一个明显特征:第一个字符与最后一个字符相同

因此,在解码端,我们可以通过将上个码字的第一个符号复制粘贴至最后一个符号的位置,则形成的新码字就是我们要解码的当前码字。

LZW解码代码如下:

void LZWDecode(BITFILE* bf, FILE* fp)
{
	int character;
	int new_code, last_code;
	int phrase_length;
	unsigned long file_length;
	file_length = BitsInput(bf, 4 * 8);
	if (-1 == file_length) file_length = 0;
	InitDictionary();//初始化字典
	last_code = -1;//pw=-1,作为字符串中的旧字符
	while (0 < file_length)
	{
		new_code = input(bf);//读入一个新的字符,即cw
		if (new_code >= next_code)//读入字符的索引号大于初始化词典最大的索引号,说明该字符不存在于词典中
		{ // this is the case CSCSC( not in dict)
			d_stack[0] = character;//character是pw代表的字符串
			phrase_length = DecodeString(1, last_code);//解码
		}
		else//新读入字符的索引号存在于初始化词典中
		{
			phrase_length = DecodeString(0, new_code);//直接解码
		}
		character = d_stack[phrase_length - 1];//将cw的第一个字符存入character
		while (0 < phrase_length)
		{
			phrase_length--;
			fputc(d_stack[phrase_length], fp);//输出当前码字对应的字符串
			file_length--;
		}
		if (MAX_CODE > next_code)//如果词典还有空间
		{// add the new phrase to dictionary
			AddToDictionary(character, last_code);//将不存在于原词典的字符串存入
		}
		last_code =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值