LZW编码算法详解
无损压缩算法的比较和分析

无损压缩算法的比较和分析无损压缩算法是一种将文件或数据压缩成较小体积,而又能保持原始数据完整性的技术。
在实际应用中,有多种无损压缩算法可供选择,每种算法都有其独特的优点和适用场景。
以下是对三种常见的无损压缩算法,LZ77、LZ78和LZW算法,的比较和分析。
1.LZ77算法LZ77算法是一种基于滑动窗口的算法,通过将数据中的重复片段替换为指向该片段的指针,来实现数据压缩。
该算法具有简单高效的特点,适用于具有较多重复片段的数据。
LZ77算法在处理图片、视频等文件时表现出色,能够对重复的像素块进行有效压缩,但对于无重复的文件压缩效果较差。
2.LZ78算法LZ78算法是一种基于前缀编码的算法,通过构建一个字典来记录文件中的重复字串,并用索引指向字典中的相应位置,从而实现数据压缩。
与LZ77算法相比,LZ78算法在处理无重复文件时表现更好,由于引入了字典的概念,能够较好地处理无重复字串的情况。
然而,LZ78算法的压缩率相对较低,在对具有大量重复片段的文件进行压缩时,效果不如LZ77算法。
3.LZW算法LZW算法是一种基于字典的算法,与LZ78算法类似,通过构建字典来实现数据压缩。
LZW算法利用一个初始字典来存储单个字符,并逐渐增加字典的大小,以适应不同长度的字串。
该算法具有较好的压缩率和广泛的应用领域,可适用于文本、图像、音频等各类型文件的压缩。
然而,LZW算法的缺点是需要事先构建和传递字典,增加了存储和传输的复杂性。
综上所述,无损压缩算法的选择应考虑文件的特点和需求。
对于具有大量重复片段的文件,LZ77算法能够实现较好的压缩效果;对于无重复文件,LZ78算法表现更佳;而LZW算法则具有较好的通用性,适用于各类型文件的压缩。
当然,还有其他无损压缩算法可供选择,如Huffman编码、Arithmetic编码等,根据实际情况选用最适合的算法能够达到更好的压缩效果。
压缩的方法

压缩的方法随着互联网的发展和数据量的不断增加,压缩数据已经成为一种必要的手段。
压缩可以减少数据的存储空间,提高数据的传输速度,节省网络带宽和存储成本。
本文将介绍几种常见的压缩方法,包括无损压缩和有损压缩。
一、无损压缩方法无损压缩是一种压缩数据的方法,可以保证压缩后的数据与原始数据完全一致。
常见的无损压缩方法有以下几种:1. 霍夫曼编码:霍夫曼编码是一种基于频率的编码方法,通过将出现频率较高的字符用较短的编码表示,出现频率较低的字符用较长的编码表示,从而减少数据的存储空间。
霍夫曼编码广泛应用于无损压缩算法中。
2. LZW压缩算法:LZW压缩算法是一种基于字典的压缩算法,通过将连续出现的字符序列映射为固定长度的编码,从而减少数据的存储空间。
LZW压缩算法被广泛应用于GIF图像的压缩中。
3. DEFLATE压缩算法:DEFLATE压缩算法是一种综合了霍夫曼编码和LZ77算法的压缩算法,通过使用动态生成的霍夫曼编码表和滑动窗口的方式,实现了较高的压缩比。
DEFLATE压缩算法被广泛应用于ZIP文件的压缩中。
二、有损压缩方法有损压缩是一种压缩数据的方法,压缩后的数据与原始数据存在一定的差异,但在实际应用中往往可以接受。
有损压缩方法主要用于压缩音频、视频等多媒体数据。
常见的有损压缩方法有以下几种:1. MPEG压缩算法:MPEG压缩算法是一种基于人眼和耳朵感知特性的压缩算法,通过删除人眼或耳朵无法察觉的细节信息,从而减少数据的存储空间。
MPEG压缩算法广泛应用于音频和视频的压缩中。
2. JPEG压缩算法:JPEG压缩算法是一种基于人眼对颜色和细节敏感程度的压缩算法,通过减少图像的颜色深度和降低图像的细节信息,从而减小图像的存储空间。
JPEG压缩算法广泛应用于图像的压缩中。
3. H.264压缩算法:H.264压缩算法是一种高效的视频压缩算法,通过使用运动补偿、变换编码和熵编码等技术,实现了较高的压缩比和较好的图像质量。
单片机能用的压缩算法

单片机能用的压缩算法标题:单片机中常用的压缩算法简介:本文将介绍在单片机中常用的压缩算法,包括哈夫曼编码、LZW算法和RLE算法,旨在提供对于单片机压缩算法的基本理解和应用。
正文:在单片机应用中,由于资源的有限性和存储容量的限制,压缩算法成为一种重要的解决方案。
压缩算法可以通过减小数据的存储空间和传输带宽来优化单片机应用的性能。
首先介绍的是哈夫曼编码,这是一种经典的无损压缩算法。
它根据数据出现的频率来构建一棵哈夫曼树,将出现频率高的字符用较短的编码表示,而出现频率低的字符用较长的编码表示。
通过这种方式,可以有效地减少数据的存储空间。
在单片机中,可以利用哈夫曼编码对传感器采集的数据进行压缩,从而节省存储空间和传输带宽。
另一个常用的压缩算法是LZW算法。
LZW算法是一种字典压缩算法,它通过建立一个字典来记录出现的字符串,并用较短的编码替代较长的字符串。
在单片机中,LZW算法可以应用于图像压缩,将图像中的连续像素序列转换为较短的编码,从而减小图像的存储空间和传输带宽。
此外,还有一种简单且高效的压缩算法是RLE算法。
RLE算法是一种基于重复数据的压缩算法,它将连续出现的相同数据用一个计数值和该数据表示。
在单片机中,RLE算法可以应用于音频数据的压缩,将连续相同的音频采样数据用一个计数值表示,从而减小音频数据的存储空间和传输带宽。
综上所述,单片机中常用的压缩算法包括哈夫曼编码、LZW算法和RLE算法。
这些压缩算法可以在有限的资源条件下优化单片机应用的性能。
使用这些算法可以减小数据的存储空间和传输带宽,提高单片机应用的效率和响应速度。
通过合理选择和应用压缩算法,可以充分利用单片机的资源,并满足对存储和传输效率的要求。
在实际应用中,需要根据具体的场景和需求选择最适合的压缩算法,并根据实际情况进行参数调节和优化。
医疗影像数据压缩与传输的算法及性能分析

医疗影像数据压缩与传输的算法及性能分析医疗影像数据在临床诊断中起着重要的作用,如CT、MRI等各种影像技术已经成为诊断疾病、指导治疗的重要手段。
然而,由于医疗影像数据体积庞大,导致存储和传输都面临着巨大的挑战。
为了解决这一问题,医疗影像数据的压缩与传输算法应运而生。
本文将对医疗影像数据压缩与传输的算法及其性能进行分析。
首先,我们来探讨医疗影像数据压缩算法的原理及常用方法。
医疗影像数据压缩算法的目标是在尽可能保持影像质量的前提下,降低数据的存储和传输开销。
常见的医疗影像数据压缩算法分为有损压缩和无损压缩两种。
有损压缩算法通过降低像素值的精度或者去除冗余信息来实现压缩。
在医疗影像数据中,一些像素之间存在高度的相关性,因此分析和利用这种相关性可以达到有效压缩的目的。
如JPEG压缩算法就是一种典型的有损压缩算法,通过离散余弦变换(DCT)和量化操作来实现对图像的压缩。
然而,由于有损压缩算法会引入一定的信息丢失,因此在临床应用中需要根据具体需求进行权衡。
而无损压缩算法则通过利用影像数据中的冗余性来实现压缩,同时保证压缩后数据的精确恢复。
Huffman编码和Lempel-Ziv-Welch(LZW)编码是常用的无损压缩算法。
其中,Huffman编码通过构建霍夫曼树,将出现频率较高的符号编码为较短的码字,而出现频率较低的符号编码为较长的码字,从而实现压缩效果。
LZW编码则通过构建字典,并将连续出现的符号序列进行编码,提高了压缩效率。
除了压缩算法,医疗影像数据的传输也面临着技术挑战。
医疗影像数据的传输需要满足实时性、可靠性、安全性等要求。
为了提高数据传输的效率,通常会采用基于网络的传输方式。
常见的医疗影像数据传输协议有DICOM(Digital Imaging and Communications in Medicine)和HL7(Health Level Seven)等。
DICOM协议是医学影像领域广泛使用的标准,它定义了影像数据的格式以及传输的规范,使得不同设备和系统之间可以进行无缝交互。
LZW算法优化及在雷达数据压缩中的应用

总第231期2009年第1期计算机与数字工程Computer&D ig ital Eng ineer ingV o l.37No.132LZW算法优化及在雷达数据压缩中的应用*王志刚 常传文 茅文深(中国电子科技集团公司28研究所 南京 210007)摘 要 LZ W算法是一种性能优异的字典压缩算法,具有通用性强、字典在编解码过程中动态形成等优点,在无损压缩领域应用广泛。
介绍了其算法原理,给出了程序实现的编码步骤,并选取一个实例进行详细分析。
设计了一种哈希表对程序进行优化,显著降低检索字典时间,分别选取图片、雷达数据、文本文件进行编码速度对比,获得了较好的效果。
最后,使用不同的数据分段选取若干典型的真实雷达数据进行试验,并与游程编码进行了对比,得出若干结论。
关键词 LZ W;哈希表;优化;游程编码中图分类号 T P301.6L Z W Algorithm Optimizing and the A pplicatio nin Radar Data CompressionWang Z hig ang Ch ang Chuanwen M a o W enshen(T he28th R esear ch Institute of CET C,N anjing 210007)A bstract L Z W(L em pe l Z iv We lch)algo r ithm is an outstanding dict io nary co mpr ession alg or ithm,which has ma ny excelle nce s such as str ong univer sal ability and can fo rm the dictionar y dy namic ally in coding and e nco ding,and is w idely used in lo ssle ss compr essio n field.T his a rticle intro duces the elem ents of L Z W,sho ws its pr og ra m steps o f co ding,and an a ly ses an exa mple in detail.A Hash T able is desig ned to optimize the pr og ram,which c an decr ease the se arching dictiona r y time o bser vably.I mag es,radar data,and text f iles a re cho sen to be coded r espectively.T he speeds are com pa red and pr ef era ble r esults ar e obtained.At last,w e cho o se seve ra l classica l re al r adar data to do ex periments by using dif fer ent da t a subsect io n,co mpare the re sults w ith R L E(R un L eng th Enco ding),and o bta in sev er al usef ul conclusio ns.Key words L Z W,H ash T able,o ptimize,R L EClass Nu mber T P301.61 引言如果按照压缩前后信息量划分,数据压缩算法可分为有损压缩和无损压缩,常见的无损压缩算法有游程RLE(Run Leng th Encoding)、霍夫曼、LZW(Lempel Ziv Welch)算法、算术编码等,LZW 算法是一种字典压缩算法,字典是在编解码过程中动态形成的,其突出的优点是通用性强,适合各种不同类型的待压缩信源,该算法被广泛应用于如今的数据压缩领域,如流行的压缩软件WINRAR和GIF图像。
多媒体数据处理中几种无损压缩算法的比较概要

119摘要:为了使大容量的多媒体数据在网络上有效的传输,必须对多媒体数据进行压缩。
对多媒体数据压缩中的几种无损压缩方法进行了比较,并对每种方法用一个例子说明。
关键词:数据压缩;霍夫曼树;LZW;二叉树引言随着网络发展的速度越来越快,视频,音频的广泛应用使得大数据量的传输显得尤为重要,如何更快、更多、更好地传输与存储数据成为数据信息处理的首要问题。
在压缩算法中分为无损压缩和有损压缩。
相对于有损压缩来说,无损压缩的占用空间大,压缩比不高,但是它100%的保存了原始信息,没有任何信号丢失并且音质高,不受信号源的影响,这点是有损压缩不可比拟的。
而且随着时间的推移,限制无损格式的种种因素将逐渐被消除,比如说硬盘容量的急剧增长以及低廉的价格使得无损压缩格式的前景无比光明。
1、无损压缩的原理以及几种常见算法本质上压缩数据是因为数据自身具有冗余性。
数据压缩是利用各种算法将数据冗余压缩到最小,并尽可能地减少失真,从而提高传输效率和节约存储空间。
常见的无损压缩算法有,游长编码;香浓-凡诺算法;霍夫曼算法;LZW算法;下面详细介绍这些算法或编码步骤,并比较其优缺点。
2、游长编码也叫行程编码,它是数据压缩中最简单的一种方法。
它的思想是:将图像一行中颜色值相同的相邻象素用一个计数值和该颜色值来代替。
例如:aabbbccccdddddeeeeee对其进行游长编码可得2a3b4c5d6e,可见其效率很高。
但它有两个致命缺点。
一:如果图象中每两个相邻点的颜色都不同,用这种算法不但不能压缩,反而数据量会增加,例如对abcdeabcde进行编码得1a2b3c4d5e1a2b3c4d5e,可见数据量反而增加了1倍。
二:容错性差。
还是以aabbbccccdddddeeeeee为例,如果在第二位a出错,例如丢失了a,那么编码后结果为1a3b4c5d6e,虽然只有一位发生了错误,但是在恢复数据时,将和原始数据完全不同。
所以说游长编码在要压缩信息源中的符号形成连续出现片段时才有效,并且它不是一种自适应的编码方式。
packbits和lzw压缩方法

packbits和lzw压缩方法PackBits和LZW都是常见的无损数据压缩算法,它们在不同的应用场景中发挥着重要作用。
下面我将从多个角度来介绍这两种压缩方法。
首先,我们来看PackBits压缩方法。
PackBits是一种简单而高效的压缩算法,通常用于图像文件的压缩。
它的原理是将连续重复的数据值用一个计数值和一个单独的数据值来表示,从而实现压缩。
例如,如果有连续重复的数值,PackBits会将这段重复的数值用一个计数值和该数值本身来表示,从而减少数据的存储空间。
这种方法适用于具有大量重复数据的情况,但在一些数据分布不均匀的情况下可能效果不佳。
其次,我们来看LZW压缩方法。
LZW是一种字典压缩算法,通常用于文本文件的压缩,例如GIF图像格式就使用了LZW压缩算法。
它的原理是建立一个字典,将输入的数据与字典中的条目进行匹配,并输出匹配的条目的编码。
当有新的数据输入时,会将其添加到字典中,从而不断扩大字典,提高压缩效率。
LZW压缩算法适用于各种类型的数据,尤其在文本文件中表现优异,但在某些特定情况下可能会受到版权限制。
从实现角度来看,PackBits相对简单,算法复杂度低,易于实现和理解。
而LZW相对复杂一些,需要建立和维护字典,算法复杂度较高,实现起来可能会更加困难。
从压缩效率来看,PackBits适用于具有大量重复数据的情况,能够取得较好的压缩效果。
而LZW适用于各种类型的数据,尤其在文本文件中表现优异,能够取得更好的压缩效果。
总的来说,PackBits和LZW都是常见的无损数据压缩算法,它们在不同的应用场景中都有各自的优势和局限性。
在实际应用中,我们需要根据具体的数据特点和压缩需求来选择合适的压缩方法,以达到最佳的压缩效果。
压缩率高的压缩算法

压缩率高的压缩算法随着信息技术的不断发展,数据的存储和传输需求也越来越大。
为了更高效地利用存储空间和提高网络传输速度,压缩算法应运而生。
压缩算法是通过对数据进行编码和解码,以减少数据的存储空间和传输带宽的占用。
在众多压缩算法中,有一些算法以其高压缩率而著名。
一、LZ77压缩算法LZ77是一种基于字典的压缩算法,它通过利用重复出现的字符串来减少数据的存储空间。
该算法在编码过程中,将字符串分成固定大小的窗口,并在窗口内查找匹配的字符串。
编码时,将匹配的字符串用指针指向之前出现的位置,并记录匹配字符串之后的字符。
解码时,根据指针和记录的字符,可以还原出原始字符串。
LZ77算法在文本和图像等数据中具有较好的压缩效果,能够显著减少存储空间的占用。
二、哈夫曼编码哈夫曼编码是一种变长编码算法,它通过对频率较高的字符使用较短的编码,对频率较低的字符使用较长的编码,从而达到高压缩率的效果。
该算法首先统计字符出现的频率,然后根据频率构建哈夫曼树。
树的叶子节点表示字符,路径上的编码表示字符的编码。
编码时,将字符替换为对应的编码,解码时,根据编码树还原原始字符。
哈夫曼编码在文本和图像等数据中具有较高的压缩率,能够有效减少存储空间的占用。
三、算术编码算术编码是一种连续编码算法,它通过对数据中的每个符号进行编码,从而实现高压缩率的效果。
该算法将数据的范围映射到一个连续的区间,编码时,根据符号在区间中的位置来确定编码。
解码时,根据编码和区间映射关系还原原始数据。
算术编码在文本和图像等数据中具有较高的压缩率,能够极大地减少存储空间的占用。
四、LZW压缩算法LZW是一种基于字典的压缩算法,它通过建立字典来减少数据的存储空间。
该算法在编码过程中,将输入的字符串逐个字符地添加到字典中,并记录对应的编码。
当输入的字符串在字典中已经存在时,将其对应的编码输出,并将其与下一个字符组合成新的字符串添加到字典中。
解码时,根据编码和字典还原原始字符串。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LZW编码算法详解LZW(Lempel-Ziv & Welch)编码又称字串表编码,是Welch将Lemple和Ziv所提出来的无损压缩技术改进后的压缩方法。
GIF图像文件采用的是一种改良的LZW 压缩算法,通常称为GIF-LZW压缩算法。
下面简要介绍GIF-LZW的编码与解码方程解:例现有来源于二色系统的图像数据源(假设数据以字符串表示):aabbbaabb,试对其进行LZW编码及解码。
1)根据图像中使用的颜色数初始化一个字串表(如表1),字串表中的每个颜色对应一个索引。
在初始字串表的LZW_CLEAR和LZW_EOI分别为字串表初始化标志和编码结束标志。
设置字符串变量S1、S2并初始化为空。
2)输出LZW_CLEAR在字串表中的索引3H(见表2第一行)。
3)从图像数据流中第一个字符开始,读取一个字符a,将其赋给字符串变量S2。
判断S1+S2=“a”在字符表中,则S1=S1+S2=“a”(见表2第二行)。
4)读取图像数据流中下一个字符a,将其赋给字符串变量S2。
判断S1+S2=“aa”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字串表末尾为S1+S2="aa"添加索引4H,且S1=S2=“a”(见表2第三行)。
5)读下一个字符b赋给S2。
判断S1+S2=“ab”不在字符串表中,输出S1=“a”在字串表中的索引0H,并在字串表末尾为S1+S2=“ab”添加索引5H,且S1=S2=“b”(见表2第四行)。
6)读下一个字符b赋给S2。
S1+S2=“bb”不在字串表中,输出S1=“b”在字串表中的索引1H,并在字串表末尾为S1+S2=“bb”添加索引6H,且S1=S2=“b”(见表2第五行)。
7)读字符b赋给S2。
S1+S2=“bb”在字串表中,则S1=S1+S2=“bb”(见表2第六行)。
8)读字符a赋给S2。
S1+S2=“bba”不在字串表中,输出S1=“bb”在字串表中的索引6H,并在字串表末尾为S1+S2=“bba”添加索引7H,且S1=S2=“a”(见表2第七行)。
9)读字符a赋给S2。
S1+S2=“aa”在字串表中,则S1=S1+S2=“aa”(见表2第八行)。
10)读字符b赋给S2。
S1+S2=“aab”不在字串表中,输出S1=“aa”在字串表中的索引4H,并在字串表末尾为S1+S2=“aab”添加索引8H,且S1=S2=“b”(见表2第九行)。
11)读字符b赋给S2。
S1+S2=“bb”,在字串表中,则S1=S1+S2=“b”(见表2第十行)。
12)输出S1中的字符串"b"在字串表中的索引1H(见表2第十一行)。
13)输出结束标志LZW_EOI的索引3H,编码完毕。
最后的编码结果为"30016463“。
下面对上述编码结果"30016463"进行解码。
同样先初始化字符串表,结果如表1所示。
1)首先读取第一个编码Code=3H,由于它为LZW_CLEAR,无输出(见表3第一行)。
2)读入下一个编码Code=0H,由于字符串表中存在该索引,因此输出字符串表中0H对应的字符串"a",同时使OldCode=Code=0H(见表3第二行)。
3)读下一个编码Code=0H,字符串表中存在该索引,输出0H所对应的字符串"a",然后将OldCode=0H所对应的字符串"a"加上Code=0H所对应的字符串的第一个字符"a",即"aa"添加到字串表中,其索引为4H,同时使OldCode=Code=0H (见表3第三行)。
4)读下一个编码Code=1H,字串表中存在该索引,输出1H所对应的字符串"b",然后将OldCode=0H所对应的字符串"a"加上Code=1H所对应的字符串的第一个字符"b",即"ab"添加到字串表中,其索引为5H,同时使OldCode=Code=1H (见表3第四行)。
5)读入下一个编码Code=6H,由于字串表中不存在该索引,因此输出OldCode=1H所对应的字符串"b"加上OldCode的第一个字符"b“,即"bb",同时将"bb"添加到字符串表中,其索引为6H,同时使OldCode=Code=6H(见表3第五行)。
6)读下一个编码Code=4H,字串表中存在该索引,输出4H所对应的字符串"aa",然后将OldCode=6H所对应的字符串"bb"加上Code=4H所对应的字符串的第一个字符"a",即"bba"添加到字串表中,其索引为7H,同时使OldCode=Code=4H (见表3第六行)。
7)读下一个编码Code=6H,字串表中存在该索引,输出6H所对应的字符串"bb",然后将OldCode=4H所对应的字符串"aa"加上Code=6H所对应的字符串的第一个字符"b",即"aab"添加到字串表中,其索引为8H,同时使OldCode=Code=6H (见表3第七行)。
8)读下一个编码Code=3H,它等于LZW_EOI,数据解码完毕(见表3第八行)。
最后的解码结果为aabbbaabb。
由此可见,LZW编码算法在编码与解码过程中所建立的字符串表是一样的,都是动态生成的,因此在压缩文件中不必保存字符串表。
1.LZW的全称是什么?Lempel-Ziv-Welch (LZW).2. LZW的简介和压缩原理是什么?LZW压缩算法是一种新颖的压缩方法,由Lemple-Ziv-Welch 三人共同创造,用他们的名字命名。
它采用了一种先进的串表压缩,将每个第一次出现的串放在一个串表中,用一个数字来表示串,压缩文件只存贮数字,则不存贮串,从而使图象文件的压缩效率得到较大的提高。
奇妙的是,不管是在压缩还是在解压缩的过程中都能正确的建立这个串表,压缩或解压缩完成后,这个串表又被丢弃。
LZW算法中,首先建立一个字符串表,把每一个第一次出现的字符串放入串表中,并用一个数字来表示,这个数字与此字符串在串表中的位置有关,并将这个数字存入压缩文件中,如果这个字符串再次出现时,即可用表示它的数字来代替,并将这个数字存入文件中。
压缩完成后将串表丢弃。
如"print" 字符串,如果在压缩时用266表示,只要再次出现,均用266表示,并将"print"字符串存入串表中,在图象解码时遇到数字266,即可从串表中查出266所代表的字符串"print",在解压缩时,串表可以根据压缩数据重新生成。
3.在详细介绍算法之前,先列出一些与该算法相关的概念和词汇1)'Character':字符,一种基础数据元素,在普通文本文件中,它占用1个单独的byte,而在图像中,它却是一种代表给定像素颜色的索引值。
2)'CharStream':数据文件中的字符流。
3)'Prefix':前缀。
如这个单词的含义一样,代表着在一个字符最直接的前一个字符。
一个前缀字符长度可以为0,一个prefix和一个character可以组成一个字符串(string),4)'Suffix':后缀,是一个字符,一个字符串可以由(A,B)来组成,A是前缀,B是后缀,当A 长度为0的时候,代表Root,根5)'Code:码,用于代表一个字符串的位置编码6)'Entry':一个Code和它所代表的字符串(string)4.压缩算法的简单示例,不是完全实现LZW算法,只是从最直观的角度看lzw算法的思想对原始数据ABCCAABCDDAACCDB进行LZW压缩原始数据中,只包括4个字符(Character),A,B,C,D,四个字符可以用一个2bit的数表示,0-A,1-B,2-C,3-D,从最直观的角度看,原始字符串存在重复字符:ABCCAABCDDAACCDB,用4代表AB,5代表CC,上面的字符串可以替代表示为:45A4CDDAA5DB,这样是不是就比原数据短了一些呢!5.LZW算法的适用范围为了区别代表串的值(Code)和原来的单个的数据值(String),需要使它们的数值域不重合,上面用0-3来代表A-D,那么AB就必须用大于3的数值来代替,再举另外一个例子,原来的数值范围可以用8bit来表示,那么就认为原始的数的范围是0~255,压缩程序生成的标号的范围就不能为0~255(如果是0-255,就重复了)。
只能从256开始,但是这样一来就超过了8位的表示范围了,所以必须要扩展数据的位数,至少扩展一位,但是这样不是增加了1个字符占用的空间了么?但是却可以用一个字符代表几个字符,比如原来255是8bit,但是现在用256来表示254,255两个数,还是划得来的。
从这个原理可以看出LZW 算法的适用范围是原始数据串最好是有大量的子串多次重复出现,重复的越多,压缩效果越好。
反之则越差,可能真的不减反增了。
6.LZW算法中特殊标记随着新的串(string)不断被发现,标号也会不断地增长,如果原数据过大,生成的标号集(string table)会越来越大,这时候操作这个集合就会产生效率问题。
如何避免这个问题呢?Gif在采用lzw算法的做法是当标号集足够大的时候,就不能增大了,干脆从头开始再来,在这个位置要插入一个标号,就是清除标志CLEAR,表示从这里我重新开始构造字典,以前的所有标记作废,开始使用新的标记。
这时候又有一个问题出现,足够大是多大?这个标号集的大小为比较合适呢?理论上是标号集大小越大,则压缩比率就越高,但开销也越高。
一般根据处理速度和内存空间连个因素来选定。
GIF规范规定的是12位,超过12位的表达范围就推倒重来,并且GIF为了提高压缩率,采用的是变长的字长。
比如说原始数据是8位,那么一开始,先加上一位再说,开始的字长就成了9位,然后开始加标号,当标号加到512时,也就是超过9为所能表达的最大数据时,也就意味着后面的标号要用10位字长才能表示了,那么从这里开始,后面的字长就是10位了。
依此类推,到了2^12也就是4096时,在这里插一个清除标志,从后面开始,从9位再来。
GIF规定的清除标志CLEAR的数值是原始数据字长表示的最大值加1,如果原始数据字长是8,那么清除标志就是256,如果原始数据字长为4那么就是16。