LZ77算法基础介绍

LZ77压缩算法 LZ77算法是一种无损数据压缩算法,由Abraham Lempel和Jacob Ziv于1977年提出。它是一种字典编码方法,通过查找数据中重复出现的字符串,并用较短的标记来替代这些字符串,从而实现压缩。 阅读详情
我们在第三和第四章中讨论的压缩模型都是基于对信息中单个字符出现频率的统计 
而设计的,直到 70 年代末期,这种思路在数据压缩领域一直占据着统治地位。在 
我们今天看来,这种情形在某种程度上显得有些可笑,但事情就是这样,一旦某项 
技术在某一领域形成了惯例,人们就很难创造出在思路上与其大相径庭的哪怕是更 
简单更实用的技术来。 
 
我们敬佩那两个在数据压缩领域做出了杰出贡献的以色列人,因为正是他们打破了 
 Huffman 编码一统天下的格局,带给了我们既高效又简便的“字典模型”。至今 
,几乎我们日常使用的所有通用压缩工具,象 ARJ,PKZip,WinZip,LHArc,RAR 
,GZip,ACE,ZOO,TurboZip,Compress,JAR……甚至许多硬件如网络设备中内 
置的压缩算法,无一例外,都可以最终归结为这两个以色列人的杰出贡献。 
 
说起来,字典模型的思路相当简单,我们日常生活中就经常在使用这种压缩思想。 
我们常常跟人说“奥运会”、“IBM”、“TCP”之类的词汇,说者和听者都明白它 
们指的是“奥林匹克运动会”、“国际商业机器公司”和“传输控制协议”,这实 
际就是信息的压缩。我们之所以可以顺利使用这种压缩方式而不产生语义上的误解 
,是因为在说者和听者的心中都有一个事先定义好的缩略语字典,我们在对信息进 
行压缩(说)和解压缩(听)的过程中都对字典进行了查询操作。字典压缩模型正 
是基于这一思路设计实现的。 
 
最简单的情况是,我们拥有一本预先定义好的字典。例如,我们要对一篇中文文章 
进行压缩,我们手中已经有一本《现代汉语词典》。那么,我们扫描要压缩的文章 
,并对其中的句子进行分词操作,对每一个独立的词语,我们在《现代汉语词典》 
查找它的出现位置,如果找到,我们就输出页码和该词在该页中的序号,如果没有 
找到,我们就输出一个新词。这就是静态字典模型的基本算法了。 
 
你一定可以发现,静态字典模型并不是好的选择。首先,静态模型的适应性不强, 
我们必须为每类不同的信息建立不同的字典;其次,对静态模型,我们必须维护信 
息量并不算小的字典,这一额外的信息量影响了最终的压缩效果。所以,几乎所有 
通用的字典模型都使用了自适应的方式,也就是说,将已经编码过的信息作为字典 
,如果要编码的字符串曾经出现过,就输出该字符串的出现位置及长度,否则输出 
新的字符串。根据这一思路,你能从下面这幅图中读出其中包含的原始信息吗? 
 
 
 
啊,对了,是“吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮”。现在你该大致明白自 
适应字典模型的梗概了吧。好了,下面就让我们来深入学习字典模型的第一类实现 
——LZ77 算法。 
 
滑动的窗口 
 
LZ77 算法在某种意义上又可以称为“滑动窗口压缩”,这是由于该算法将一个虚 
拟的,可以跟随压缩进程滑动的窗口作为术语字典,要压缩的字符串如果在该窗口 
中出现,则输出其出现位置和长度。使用固定大小窗口进行术语匹配,而不是在所 
有已经编码的信息中匹配,是因为匹配算法的时间消耗往往很多,必须限制字典的 
大小才能保证算法的效率;随着压缩的进程滑动字典窗口,使其中总包含最近编码 
过的信息,是因为对大多数信息而言,要编码的字符串往往在最近的上下文中更容 
易找到匹配串。 
 
参照下图,让我们熟悉一下 LZ77 算法的基本流程。 
 
 
 
 
1、从当前压缩位置开始,考察未编码的数据,并试图在滑动窗口中找出最长的匹 
配字符串,如果找到,则进行步骤 2,否则进行步骤 3。 
 
 
2、输出三元符号组 ( off, len, c )。其中 off 为窗口中匹配字符串相对窗口边 
界的偏移,len 为可匹配的长度,c 为下一个字符。然后将窗口向后滑动 len + 1 
 个字符,继续步骤 1。 
 
3、输出三元符号组 ( 0, 0, c )。其中 c 为下一个字符。然后将窗口向后滑动  
len + 1 个字符,继续步骤 1。 
 
我们结合实例来说明。假设窗口的大小为 10 个字符,我们刚编码过的 10 个字符 
是:abcdbbccaa,即将编码的字符为:abaeaaabaee 
 
我们首先发现,可以和要编码字符匹配的最长串为 ab ( off = 0, len = 2 ), ab 
 的下一个字符为 a,我们输出三元组:( 0, 2, a ) 
 
现在窗口向后滑动 3 个字符,窗口中的内容为:dbbccaaaba 
 
下一个字符 e 在窗口中没有匹配,我们输出三元组:( 0, 0, e ) 
 
窗口向后滑动 1 个字符,其中内容变为:bbccaaabae 
 
我们马上发现,要编码的 aaabae 在窗口中存在( off = 4, len = 6 ),其后的字 
符为 e,我们可以输出:( 4, 6, e ) 
 
这样,我们将可以匹配的字符串都变成了指向窗口内的指针,并由此完成了对上述 
数据的压缩。 
 
解压缩的过程十分简单,只要我们向压缩时那样维护好滑动的窗口,随着三元组的 
不断输入,我们在窗口中找到相应的匹配串,缀上后继字符 c 输出(如果 off 和 
 len 都为 0 则只输出后继字符 c )即可还原出原始数据。 
 
当然,真正实现 LZ77 算法时还有许多复杂的问题需要解决,下面我们就来对可能 
碰到的问题逐一加以探讨。 
 
编码方法 
 
我们必须精心设计三元组中每个分量的表示方法,才能达到较好的压缩效果。一般 
来讲,编码的设计要根据待编码的数值的分布情况而定。对于三元组的第一个分量 
——窗口内的偏移,通常的经验是,偏移接近窗口尾部的情况要多于接近窗口头部 
的情况,这是因为字符串在与其接近的位置较容易找到匹配串,但对于普通的窗口 
大小(例如 4096 字节)来说,偏移值基本还是均匀分布的,我们完全可以用固定 
的位数来表示它。 
 
编码 off 需要的位数 bitnum = upper_bound( log2( MAX_WND_SIZE )) 
 
由此,如果窗口大小为 4096,用 12 位就可以对偏移编码。如果窗口大小为  
2048,用 11 位就可以了。复杂一点的程序考虑到在压缩开始时,窗口大小并没有 
达到 MAX_WND_SIZE,而是随着压缩的进行增长,因此可以根据窗口的当前大小动 
态计算所需要的位数,这样可以略微节省一点空间。 
 
 
对于第二个分量——字符串长度,我们必须考虑到,它在大多数时候不会太大,少 
数情况下才会发生大字符串的匹配。显然可以使用一种变长的编码方式来表示该长 
度值。在前面我们已经知道,要输出变长的编码,该编码必须满足前缀编码的条件 
。其实 Huffman 编码也可以在此处使用,但却不是最好的选择。适用于此处的好 
的编码方案很多,我在这里介绍其中两种应用非常广泛的编码。 
 
第一种叫 Golomb 编码。假设对正整数 x 进行 Golomb 编码,选择参数 m,令  
 
b = 2m 
 
q = INT((x - 1)/b) 
 
r = x - qb - 1 
 
则 x 可以被编码为两部分,第一部分是由 q 个 1 加 1 个 0 组成,第二部分为 
 m 位二进制数,其值为 r。我们将 m = 0, 1, 2, 3 时的 Golomb 编码表列出: 
 
 
   值 x        m = 0       m = 1       m = 2       m = 3 
------------------------------------------------------------- 
    1             0         0 0        0 00        0 000 
    2            10         0 1        0 01        0 001 
    3           110        10 0        0 10        0 010 
    4          1110        10 1        0 11        0 011 
    5         11110       110 0       10 00        0 100 
    6        111110       110 1       10 01        0 101 
    7       1111110      1110 0       10 10        0 110 
    8      11111110      1110 1       10 11        0 111 
    9     111111110     11110 0      110 00       10 000 
从表中我们可以看出,Golomb 编码不但符合前缀编码的规律,而且可以用较少的 
位表示较小的 x 值,而用较长的位表示较大的 x 值。这样,如果 x 的取值倾向 
于比较小的数值时,Golomb 编码就可以有效地节省空间。当然,根据 x 的分布规 
律不同,我们可以选取不同的 m 值以达到最好的压缩效果。 
 
对我们上面讨论的三元组 len 值,我们可以采用 Golomb 方式编码。上面的讨论 
中 len 可能取 0,我们只需用 len + 1 的 Golomb 编码即可。至于参数 m 的选 
择,一般经验是取 3 或 4 即可。 
 
可以考虑的另一种变长前缀编码叫做 γ 编码。它也分作前后两个部分,假设对 x 
 编码,令 q = int( log2x ),则编码的前一部分是 q 个 1 加一个 0,后一部分 
是 q 位长的二进制数,其值等于 x - 2q 。γ编码表如下: 
 
   值 x    γ编码 
--------------------- 
    1       0 
    2      10 0 
    3      10 1 
    4     110 00 
    5     110 01 
 
    6     110 10 
    7     110 11 
    8    1110 000 
    9    1110 001 
其实,如果对 off 值考虑其倾向于窗口后部的规律,我们也可以采用变长的编码 
方法。但这种方式对窗口较小的情况改善并不明显,有时压缩效果还不如固定长编 
码。 
 
对三元组的最后一个分量——字符 c,因为其分布并无规律可循,我们只能老老实 
实地用 8 个二进制位对其编码。 
 
根据上面的叙述,相信你一定也能写出高效的编码和解码程序了。 
 
另一种输出方式 
 
LZ77 的原始算法采用三元组输出每一个匹配串及其后续字符,即使没有匹配,我 
们仍然需要输出一个 len = 0 的三元组来表示单个字符。试验表明,这种方式对 
于某些特殊情况(例如同一字符不断重复的情形)有着较好的适应能力。但对于一 
般数据,我们还可以设计出另外一种更为有效的输出方式:将匹配串和不能匹配的 
单个字符分别编码、分别输出,输出匹配串时不同时输出后续字符。 
 
我们将每一个输出分成匹配串和单个字符两种类型,并首先输出一个二进制位对其 
加以区分。例如,输出 0 表示下面是一个匹配串,输出 1 表示下面是一个单个字 
符。 
 
之后,如果要输出的是单个字符,我们直接输出该字符的字节值,这要用 8 个二 
进制位。也就是说,我们输出一个单个的字符共需要 9 个二进制位。 
 
如果要输出的是匹配串,我们按照前面的方法依次输出 off 和 len。对 off,我 
们可以输出定长编码,也可以输出变长前缀码,对 len 我们输出变长前缀码。有 
时候我们可以对匹配长度加以限制,例如,我们可以限制最少匹配 3 个字符。因 
为,对于 2 个字符的匹配串,我们使用匹配串的方式输出并不一定比我们直接输 
出 2 个单个字符(需要 18 位)节省空间(是否节省取决于我们采用何种编码输 
出 off 和 len)。 
 
这种输出方式的优点是输出单个字符的时候比较节省空间。另外,因为不强求每次 
都外带一个后续字符,可以适应一些较长匹配的情况。 
 
如何查找匹配串 
 
在滑动窗口中查找最长的匹配串,大概是 LZ77 算法中的核心问题。容易知道, 
LZ77 算法中空间和时间的消耗集中于对匹配串的查找算法。每次滑动窗口之后, 
都要进行下一个匹配串的查找,如果查找算法的时间效率在 O(n2) 或者更高,总 
的算法时间效率就将达到 O(n3),这是我们无法容忍的。正常的顺序匹配算法显然 
无法满足我们的要求。事实上,我们有以下几种可选的方案。 
 
1、限制可匹配字符串的最大长度(例如 20 个字节),将窗口中每一个 20 字节 
长的串抽取出来,按照大小顺序组织成二叉有序树。在这样的二叉有序树中进行字 
符串的查找,其效率是很高的。树中每一个节点大小是 20(key) + 4(off) +  
4(left child) + 4(right child) = 32。树中共有 MAX_WND_SIZE - 19 个节点, 
假如窗口大小为 4096 字节,树的大小大约是 130k 字节。空间消耗也不算多。这 
种方法对匹配串长度的限制虽然影响了压缩程序对一些特殊数据(又很长的匹配串 
)的压缩效果,但就平均性能而言,压缩效果还是不错的。 
 
2、将窗口中每个长度为 3 (视情况也可取 2 或 4)的字符串建立索引,先在此 
索引中匹配,之后对得出的每个可匹配位置进行顺序查找,直到找到最长匹配字符 
串。因为长度为 3 的字符串可以有 2563 种情况,我们不可能用静态数组存储该 
索引结构。使用 Hash 表是一个明智的选择。我们可以仅用 MAX_WND_SIZE - 1 的 
数组存储每个索引点,Hash 函数的参数当然是字符串本身的 3 个字符值了,Hash 
 函数算法及 Hash 之后的散列函数很容易设计。每个索引点之后是该字符串出现 
的所有位置,我们可以使用单链表来存储每一个位置。值得注意的是,对一些特殊 
情况比如 aaaaaa...之类的连续字串,字符串 aaa 有很多连续出现位置,但我们 
无需对其中的每一个位置都进行匹配,只要对最左边和最右边的位置操作就可以了 
。解决的办法是在链表节点中纪录相同字符连续出现的长度,对连续的出现位置不 
再建立新的节点。这种方法可以匹配任意长度的字符串,压缩效果要好一些,但缺 
点是查找耗时多于第一种方法。 
 
3、使用字符树( trie )来对窗口内的字符串建立索引,因为字符的取值范围是  
0 - 255,字符树本身的层次不可能太多,3 - 4 层之下就应该换用其他的数据结 
构例如 Hash 表等。这种方法可以作为第二种方法的改进算法出现,可以提高查找 
速度,但空间的消耗较多。 
 
如果对窗口中的数据进行索引,就必然带来一个索引位置表示的问题,即我们在索 
引结构中该往偏移项中存储什么数据:首先,窗口是不断向后滑动的,我们每次将 
窗口向后滑动一个位置,索引结构就要作相应的更新,我们必须删除那些已经移动 
出窗口的数据,并增加新的索引信息。其次,窗口不断向后滑动的事实使我们无法 
用相对窗口左边界的偏移来表示索引位置,因为随着窗口的滑动,每个被索引的字 
符串相对窗口左边界的位置都在改变,我们无法承担更新所有索引位置的时间消耗 
。 
 
解决这一问题的办法是,使用一种可以环形滚动的偏移系统来建立索引,而输出匹 
配字符串时再将环形偏移还原为相对窗口左边界的真正偏移。让我们用图形来说明 
,窗口刚刚达到最大时,环形偏移和原始偏移系统相同: 
 
偏移:     0 1 2 3 4 ......                                              
 Max 
           
|--------------------------------------------------------------| 
环形偏移: 0 1 2 3 4 ......                                              
 Max 
窗口向后滑动一个字节后,滑出窗口左端的环形偏移 0 被补到了窗口右端: 
 
偏移:     0 1 2 3 4 ......                                              
 Max 
           
|--------------------------------------------------------------| 
环形偏移: 1 2 3 4 5 ......                                            
Max 0 
窗口再滑动 3 个子节后,偏移系统的情况是: 
 
偏移:     0 1 2 3 4 ......                                              
 Max 
           
|--------------------------------------------------------------| 
环形偏移: 4 5 6 7 8......                                      Max 0  
1 2 3 
依此类推。 
 
我们在索引结构中保存环形偏移,但在查找到匹配字符串后,输出的匹配位置 off 
 必须是原始偏移(相对窗口左边),这样才可以保证解码程序的顺利执行。我们 
用下面的代码将环形偏移还原为原始偏移: 
 
// 由环形 off 得到真正的off(相对于窗口左边) 
// 其中 nLeftOff 为当前与窗口左边对应的环形偏移值 
int GetRealOff(int off) 
{ 
    if (off >= nLeftOff) 
        return off - nLeftOff; 
    else 
        return (_MAX_WINDOW_SIZE - (nLeftOff - off)); 
} 
这样,解码程序无需考虑环形偏移系统就可以顺利高速解码了。 
无损压缩编码(上):LZ编码——详解LZ77 (LZSS)、LZ78和LZW的编码与译码 LZ77和LZ78由和分别于1977年和1978年发表,LZ即为Lempel和Ziv的首字母拼在一起。1984年在LZ78的基础上进行改进,发表了LZW(即Lempel–Ziv–Welch)编码。三种编码均为无损压缩编码,旨在不产生信息失真的同时降低信息冗余度。三种编码的核心在于,按顺序读取待编码数据流,如果后面的数据流出现了前面出现过的内容,就用某种方式把它记下来,这样就把原本的数据流用某种记号来替代掉,如果记号占用的空间比原数据流更小,就能实现无损压缩。 阅读详情

相关推荐

zlib库介绍四:zlib算法(LZ77、LZ78、霍夫曼编码、滑动窗口、Rabin-Karp算法、哈希链、I/O缓冲区)

1.简介 在2017年,我有机会从事一个旨在提高数据压缩性能的项目。在此过程中,我研究了zlib库及其实现的deflate压缩算法。在这里,我想与那些也希望对zlib有更好理解的人分享我的研究。 1.1 什么是zlib zlib是一个免费的开源软件库,用于无损数据压缩和减压。它是由Jean-loup Gailly(压缩)和Mark Adler(解压缩)用C语言编写的。zlib的第一个版本于1995年5月发布。Jean-loupGailly和Mark Adler也为gzip(GNU zip)。在..

LuckyHanMo的博客 5705

LZ77文件压缩

本文对于LZ77算法进行了细节性的分析和模拟实现。

weixin_45897952的博客 6757

【压缩算法】LZ77算法

一、算法介绍LZ77算法是采用自适应的字典模型,也就i是将已经编码的信息作为字典,如果要编码的字符曾经出现过,就输出该字符串的出现位置以及长度,否则输出新的字符串。二、算法思想它的核心思想是在前面已经出现过的数据中找重复出现的字符,根据局部性原理,入股一个字符串要重复,那么也实在附近重复,远的地方就不要找了,因此设置一个滑动窗口,每次都在这个窗口里面找重复出现的字符。关于这个滑动窗口的大小,理论上是

JavaScripe2013的博客 1万+

[文件压缩]LZ77

LZ77算法原理: LZ77是基于字节的通用压缩算法,它的原理就是将源文件中的重复字节(即在前文中出现的重复字节)使用 (distance,length,nextchar)的三元组进行替换 参数: distance:表示待匹配的当前字符距离匹配字符串首字母的距离 length :表示匹配字符串的长度,即有多少 个字符与前文匹配 nextchar:表示当前匹配串的下一个字符 例如:下面的内容,使用LZ77算法进行压缩的话 mnoabczxyuvwabc123456abczxyde...

这是书生呀 2628

LZ77压缩/解压算法原理

比如所有的数据都会有一定的冗余性,我们可以把冗余的数据采用更少的位对频繁出现的字符进行标记,也可以基于数据的一些特性基于字典编码,代替重复多余的短语。比如字符(A,B,D) ,可以组合的短语为{(A),(A,B),(A,B,D),(B),(B,D),(D)},如果这些字符在滑动窗口里面,就可以记为当前的短语字典,因为滑动窗口不断的向前滑动,所以短语字典也是不断的变化。目前从前向缓冲区中可以和滑动窗口中可以匹配的最长短语就是(A,B),然后向前移动的时候再次遇到(A,B)的时候采用标记符代替。

qq258520089的专栏 2031

压缩算法之字典编码(上)

算法 信息论 字典压缩 LZ77

Mica_Dai的博客 1万+

LZ77压缩算法原理剖析

LZ77压缩算法原理剖析

whl0071的专栏 4298

lz77压缩算法c语言实现

lz77算法的c语言实现。有readme文件,有较为清晰的usage。

详解LZ77字典编码压缩和解压缩流程(典型的压缩算法)

字典编码本质上是将在字典中出现过的字符串使用一个索引值代替,以此来达到压缩目的。基于字典的压缩算法有很多,LZ77和LZ78是最原始的两个算法,后者是前者的变体,原理基本上相似。本文对LZ77字典编码的压缩和解压缩流程进行介绍。...

雷恩Layne 1万+

Win10系统蓝屏错误BAD SYSTEM CONFIG INFO的解决方案

BAD SYSTEM CONFIG INFO错误是Win10系统中较为常见的一种蓝屏错误,通常与系统配置文件损坏或丢失有关。本文介绍了三种有效的解决方法:使用系统修复高级选项修复、通过PE修复文件和重装新系统。用户可以根据实际情况选择合适的方法进行操作。同时,建议用户定期备份系统重要文件和数据,以防止类似问题的发生。在遇到问题时,保持冷静并耐心操作,通常可以顺利解决问题。

mmoo_python的博客 7727

L3 级自动驾驶 2025:法规突破与车企技术路线竞争

2025年L3级自动驾驶迎来规模化商业落地关键期。全球主要经济体在法规、技术、市场三方面取得突破:中国通过《北京市自动驾驶汽车条例》明确责任划分,欧盟设立严格技术认证标准。技术路线呈现"多传感器融合为主流,纯视觉为补充"格局,华为、特斯拉等企业展开硬件军备竞赛与算法架构革新。中国车企在技术验证和规模化应用方面领先,而欧美车企侧重生态整合。尽管面临成本控制、责任认定和用户信任等挑战,随着技术进步和车路协同发展,L3自动驾驶正从高端选配向大众化普及迈进,为L4级奠定基础。

2301_77933942的博客 3098

数据压缩与LZ系列算法及其改进

原文链接:http://blog.inkernel.info/archives/13.html LZ77字典压缩算法简介 字典压缩的原理是构建一个字典,用索引来代替重复出现的字符或字符串。如果字符串相对长,那么对整个字符串构建字典,这个字典将会很大,并且随着字典的增大,匹配速度也会快速下降。原始的LZ77算法是利用了字符串中上下文的相关性特点,通过一个滑动窗口(一个查找缓冲区)来作为字...

weixin_30588907的博客 1733

电动汽车充电设备标准化设计方案:电气原理图

80kW一体式一机一枪充电机电气原理 主电路拓扑见图1,配置1个250A直流充电连接装置,提供4个充电模块安装位置,根据充电功率需求可选配2~4个20kW充电模块。内置直流电能表和计费控制单元,实现计量计费和充电控制功能。 图1 80kW一体式一机一枪充电机主电路拓扑 ...

santirenpc的博客 1万+

C语言实现LZ77压缩算法:高效的数据压缩解决方案

C语言实现LZ77压缩算法:高效的数据压缩解决方案 【下载地址】C语言实现LZ77压缩算法 这是一个使用C语言实现的LZ77压缩算法开源项目,由经典的Lempel-Ziv算法演化而来,专为数据压缩与解压缩设计。项目代码结构清晰,包含压缩、解压缩及核心逻辑实现文件,适合开发者深入学习和实践。通过该项目,您可以掌握LZ77算...

gitblog_06779的博客 723

树莓派34/100 - Pico读取MPU6050加速度和陀螺仪传感器数据

树莓派Pico连接MPU-6050模块(三轴陀螺仪+三轴加速度),读取运动姿态数据。

申龙斌的程序人生 5089

手把手教你用SAM模型实现精准图像分割:从环境配置到实战应用

本文详细介绍了如何使用Meta推出的Segment Anything Model(SAM)实现精准图像分割,从环境配置到实战应用的全流程。特别针对电商场景中的商品分割需求,提供了硬件配置、模型下载、API使用及优化策略等实用指南,帮助开发者快速掌握这一强大的深度学习工具。

pepsi的博客 1065

LZ77算法压缩和解压缩

LZ77简介 Ziv和Lempel于1977年发表题为“顺序数据压缩的一个通用算法(A Universal Algorithm for Sequential Data Compression )”的论文,论文中描述的算法被后人称为LZ77算法。值得说的是,LZ77严格意义上来说不是一种算法,而是一种编码理论。同Huffman编码一样,只定义了原理,并没有定义如何实现。基于这种理论来实现的算法才称为LZ77算法,或者人们更愿意称为LZ77变种。实际上这类算法已经有很多了,比如LZSS、LZB、LZH等。至今

大师兄你家猴跑啦的博客 7797

英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战:从安全手册到代码集成的避坑指南

本文深入探讨英飞凌AURIX™ TC3xx系列MCU的ISO 26262安全机制实战应用,重点解析锁步核配置、ECC策略优化及SafeTlib库集成中的关键问题。通过代码示例和配置建议,帮助开发者实现ASIL D级别安全性,规避常见陷阱,提升汽车电子系统的功能安全合规性。

weixin_42558093的博客 405

LZ77压缩

在huffman压缩中,对于字符不再使用定长编码。我们利用字符出现的次数之间的差异,对字符重新进行编码,使得出现次数多的字符编码短,而出现次数少的字符编码长,这样的话整体来说,需要的总的bit位数就会下降,以此来达到压缩的目的。可见,在这种情况下,如果字符出现的次数大致都相等的话,就起不到压缩的效果了,这也就是huffman为什么不能进行二次压缩的原因,因为压缩一次之后,会使得所有字符出现的次数相差

Sunnylunch-blog 5487

基于电能质量治理的场景实例:统一电能质量调节器(UPQC)与并网逆变器集成

本文通过Simulink平台,详细演示了统一电能质量调节器(UPQC)与并网逆变器的集成系统建模与仿真过程。主要内容包括:1)系统架构设计,包含光伏并网系统、非线性负载和电压扰动源;2)UPQC主电路设计,包括串联/并联单元拓扑和控制策略实现;3)与并网逆变器的能量交互与协同控制逻辑;4)典型电能质量问题的仿真测试场景。结果表明,该集成系统能有效治理电压暂降(维持负载电压380V±2%)和电流谐波(电网THD<3%),直流母线电压稳定在800V±5V。该系统为应对复杂电能质量问题提供了"电压

xiaoheshang_123的博客 310

YOLOv11 改进 - 即插即用 | PST金字塔稀疏Transformer:粗粒度到细粒度推理优化特征提取,提升复杂场景适应性

本文介绍了金字塔稀疏 Transformer(PST)与 YOLOv11 的结合。主流基于注意力的特征融合方法计算复杂度高、实现难度大,作者提出 PST 模块,融合粗到细令牌选择与共享注意力参数机制,在保留空间细节的同时降低计算量。该模块通过层级化注意力机制、动态令牌选择与参数共享,实现高效多尺度特征融合

魔改工程师的博客 830

LZ77 压缩器使用指南

LZ77 压缩器使用指南 项目介绍 LZ77-Compressor 是一个基于 LZ77 算法的压缩库,由 GitHub 用户 manassra 开发维护。LZ77 算法是一种无损数据压缩方法,通过查找数据流中的重复字串并用引用的方式替换它们来减少文件大小。本项目提供了实现该算法的源代码,适用于那些需要在应用程序中集成高效压缩功能的开发者。 项目快速启动 要快速开始使用 LZ77-Compres...

gitblog_00432的博客 774

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数据压缩算法—LZ77 vs LZ78

整数压缩编码 ZigZag Huffman编码的建树优化方法:https://www.cnblogs.com/en-heng/p/4980055.html LZ77 vs LZ78   LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文《A Universal Algorithm for Sequential Data ...

qccz123456的博客 4422

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

LZ77 压缩和解压缩

LZ77压缩算法编码原理详解(结合图片和简单代码) 转载自:https://www.cnblogs.com/junyuhuang/p/4138376.html 前言   LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年。LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77。鉴于其在数据压缩领域的地位,本文将结合图片和源码详细介绍其原理。...

u011285208的博客 2236

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

lz77、lz4学习

lz4以及lz77初步学习

Hed243908的博客 960
上一篇: Android Instrumentation
下一篇: Activity栈简析
火VVVVV
博客等级 码龄16年 87粉丝 3原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值