因为无损压缩在某些区域比其他区域效果更好,如果您将压缩数据存储到方便长度 BLOCKSIZE 的块中,即使每个块具有完全相同数量的压缩字节,某些压缩块将扩展为比其他块更长的明文.
您可能会在 2000 年 11 月的计算机杂志
http://doi.ieeecomputersociety.org/10.1109中查看 Nivio Ziviani、Edleno Silva de Moura、Gonzalo Navarro 和 Ricardo Baeza-Yates 的“压缩:下一代文本检索系统的关键”
/2.881693
他们的解压器将 1、2 或 3 个完整字节的压缩数据解压缩(使用词汇表)成一个完整的单词。可以直接在压缩文本中搜索单词或短语,这比搜索未压缩文本还要快。
他们的解压器让你可以用一个普通的(字节)指针指向文本中的任何单词,并从那个点立即开始解压。
您可以给每个单词一个唯一的 2 字节代码,因为您的文本中可能有少于 65,000 个唯一单词。(KJV 圣经中有近 13,000 个独特的单词)。即使有超过 65,000 个单词,将前 256 个两字节代码“单词”分配给所有可能的字节也非常简单,因此您可以拼出不在 65,000 左右“最常见的词库”中的单词单词和短语”。(通过将常用单词和短语打包成两个字节所获得的压缩通常值得偶尔使用每个字母两个字节来拼写单词的“扩展”)。有多种方法可以选择能够提供足够压缩的“常用词和短语”词典。例如,您可以调整 LZW 压缩器以转储“短语” 它不止一次地使用一个词典文件,每个短语一行,并在所有数据上运行它。或者,您可以任意将未压缩的数据拆分为词典文件中的 5 字节短语,每个短语一行。或者您可以将未压缩的数据拆分为实际的英文单词,然后将每个单词(包括单词开头的空格)放入词典文件中。然后使用“sort --unique”来消除该词典文件中的重复单词。(选择完美的“最佳”词典词表是否仍然被认为是 NP 难的?)并将每个单词(包括单词开头的空格)放入词典文件中。然后使用“sort --unique”来消除该词典文件中的重复单词。(选择完美的“最佳”词典词表是否仍然被认为是 NP 难的?)并将每个单词(包括单词开头的空格)放入词典文件中。然后使用“sort --unique”来消除该词典文件中的重复单词。(选择完美的“最佳”词典词表是否仍然被认为是 NP 难的?)
将词典存储在巨大压缩文件的开头,将其填充到某个方便的 BLOCKSIZE,然后存储压缩文本——一系列两字节“单词”——从那里到文件末尾。大概搜索者会读一遍这个词典,并在解压缩过程中将它以某种快速解码的格式保存在 RAM 中,以加快将“两字节代码”解压缩为“可变长度短语”的速度。我的初稿会从每个短语列表一个简单的一行开始,但您稍后可能会切换到使用某种增量编码或 zlib 以更压缩的形式存储词典。
您可以在压缩文本中选择任何随机偶数字节偏移量,然后从那里开始解压缩。我认为不可能制作更细粒度的随机访问压缩文件格式。