作业|LZW编解码思想分析

LZW编解码基本思想

LZW编码是围绕称为词典的转换表来完成的。LZW编码器通过管理这个词典完成输入与输出之间的转换。LZW编码器的输入是字符流,字符流可以是用8位ASCII字符组成的字符串,而输出是用n位(例如12位)表示的码字流。

编码思想

在这里插入图片描述
EG:编码 abccbc
映射关系:

符号字符
0a
1b
2c

编码过程:

stepsPCP+CP+C是否在词典里new P新映射关系out
1-aaVa--
2ababXbab:30
3bcbcXcbc:41
4ccccXccc:52
5cbcbXbcb:62
6bcbcVbc--
7bc-----4

输出结果:01224 即 abccc
更新后映射关系:

符号字符
0a
1b
2c
3ab
4bc
5cc
6cb

解码思想

在这里插入图片描述
解码:01224
映射关系:

符号字符
0a
1b
2c

编码过程:

stepsPwCwCw是否在词典里actionout
1-0VP=aa
201VP=a,C=b,P+C=ab,ab:3b
312VP=b,C=c,P+C=bc,bc:4c
422VP=c,C=c,P+C=cc,cc:5c
524VP=c,C=ab,P+C=cab,cab:6bc

输出为:abccbc

出现重复情况

假设输入是abababa,就会出现Cw不在词典里的情况,因为其编码应该为0146,而输出时,输出ab后,再进来的Cw=6,此时Cw在词典里是没有的(词典里此时只有symbol为0,1,2,3,4,5的映射),这时候应该把aba->6(ab为Str(Pw)+P的首字符串)写入词典并把aba输出。
Cw不存在在词典里的情况只会是在编码时刚把该字符串存入字典又马上来了一个相同的字符串时出现。


POINT:
1.一边解码,一边重建词条。
2.比编码器晚一个字符。

实验过程

解释程序

void LZWEncode( FILE *fp, BITFILE *bf){
	int character;
	int string_code;
	int index;
	unsigned long file_length;

	fseek( fp, 0, SEEK_END);
	file_length = ftell( fp);
	fseek( fp, 0, SEEK_SET);
	BitsOutput( bf, file_length, 4*8);
	InitDictionary();
	string_code = -1;
	while( EOF!=(character=fgetc( fp))){
		index = InDictionary( character, string_code);
		if( 0<=index){	// string+character in dictionary
			string_code = index;
		}else{	// string+character not in dictionary
			output( bf, string_code);
			if( MAX_CODE > next_code){	// free space in dictionary
				// add string+character to dictionary
				AddToDictionary( character, string_code);
			}
			string_code = character;
		}
	}
	output( bf, string_code);
}

//进行LZW解码
void LZWDecode( BITFILE *bf, FILE *fp){
	int character; 
	int new_code, last_code=-1;
	int phrase_length; 
	unsigned long file_length; 

	file_length = BitsInput( bf, 4*8);//BitsInput是根据bf和代号的长度,计算出有多少个字符,返回个数给filelength
	if( -1 == file_length) file_length = 0; 
	/*需填充*/
	InitDictionary(); //先初始化词典
	while (file_length > 0) {
		new_code = input(bf); //读入一个代号
		if (new_code >= next_code) {//读入的这个代号比字典代号最大值大,不在字典里
			d_stack[0] = character; // 当前字符代号先记录在栈里,也就是这个字符串的尾部是当前字符
			phrase_length = DecodeString(1, last_code);//解出字符,存入d_stack栈里
		}
		else //如果在字典里
		{
			phrase_length = DecodeString(0, new_code);//解出字符,存入d_stack栈里
		}
		character = d_stack[phrase_length-1]; // 更新下一个字符为当前字符串首字符
		while (0 < phrase_length)//输出 {
			phrase_length--;
			fputc(d_stack[phrase_length],fp); 
			file_length--;
		}
		if (MAX_CODE > next_code) {//当字典还有词条空间的时候
			AddToDictionary(character, last_code);//将字符加入到字典中
		}
		last_code = new_code;//更新字典条数last_code为最新的new_code
	}
}

文本文件压缩

在这里插入图片描述
请添加图片描述

压缩文件大小对比

在这里插入图片描述

文件类型压缩前大小(kb)压缩后大小(kb)压缩效率(%)
xls241729.2
txt23-50.0
psd35216952.0
ppt1521520
png9188.9
mp41097630.3
mp37528.6
jpg24030617.3
gif12131492-23.0
docx1525-66.7

经过实验我们可以得到并不是所有文件用LZW压缩都可以达到较好的压缩效果,甚至有些文件压缩后更大了,我觉得是因为文件内容的重复率问题,重复率越高,所建字典越小,则压缩效率越高。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值