11个版本
0.2.7 | 2023年2月6日 |
---|---|
0.2.6 | 2023年2月5日 |
0.1.1 | 2023年2月1日 |
#196 in 压缩
2.5MB
796 行
字节大小
一个短字符串压缩/解压缩器,可以存储20,000+个单词,且占用三个字节或更少的空间。
类似于smaz,byte-size能够压缩小字符串,这是其他传统压缩算法难以做到的。
然而,byte-size通常比smaz更好,尤其是在非常常用的单词上(在10,000个最常用单词中,不到1%的单词在smaz中有更好的压缩效果)。byte-size还可以比smaz更高效地表示数字、重复序列和非字母数字字符。它可以编码Unicode字符,但效率不高。如果您的文本包含一些Unicode字符,它仍然可以更好地压缩,但如果您的字符串主要是Unicode字符,则其他方案(如Unishox)更好。
成本
byte-size使用几个包含超过18,000个条目的表。显然,这将产生大量的运行时内存和二进制文件大小成本,但如果您有足够的内存,这值得更有效的压缩。
示例
使用直接从smaz中获取的示例
[插入示例]
我们可以看到,每个示例在byte-size中的压缩效果都比smaz好。
为什么?
基本上就是两个表:一个是关于大约一千个最常用词素(可表示为2个字节)的表,另一个是关于10万个词素(可表示为3个字节)的表。
除此之外,我们还有一些常用的2和3个字节的序列,可以用1个字节表示,可以作为词素的词首/词尾,或者用来构建列表中未包含的单词。
有三个列表
- 单字节奇数(OBW):由可打印的ASCII字符(包括一些控制序列)、常见的词首/词尾和常见的双字组成。
- 双字节常见(TBC):由1793个最常见词素(不包括OBW列表中的词素)组成。
- 三字节不常见(TBU):由16512个最常见词素(不在前两个列表中的词素)组成。
这些列表存储在包的根目录中。这些列表可以修改,并且这些修改将生效。列表表示为文件,其中每行是一个新词素,通过百分比编码进行编码(以允许非打印字符和Unicode序列)。
编码
- 单字节奇数序列来自smaz
- 我们过滤掉了某些表现不佳的序列
- 两个字节的常用词和三个字节的罕见词来自这里
- 只有当它们的表示更为紧凑时,单词才会被选中(例如,单词'the'既不出现在2字节表也不出现在3字节表中,因为它可以用1字节表示)
Snaz编码如下
- 一个字节的序列包括240个。这些一个字节的序列是它们在正常位置上的ascii值,其他常见序列填充空隙
- 这留下了16个多字节码的值。
- 其中之一用于指示将跟随一个Unicode标量值
- 这留下了15*256=3840种两种字节序列的组合,这些组合如下划分
- 3586用于编码2字节常用词,1793带有空格前缀,1793没有
- 32用于编码自定义词
- 32用于编码4到35个重复单元之间的序列重复
- 32用于编码数字。32个值意味着总共5位,其中3位用于字节数,2位用于数字本身
- 29用于编码不可打印的控制字符
- 129用于3字节码。129*256 = 33024种组合
- 所有33024种组合都用于编码3字节罕见词,16512带有空格前缀,16512没有
- 这留下了16个多字节码的值。