我想要压缩的短字符串列表很长,但我希望能够在不解压缩整个列表的情况下随时解压缩列表中的任意字符串。
我提前知道清单,并且涉及多少预处理并不重要。如果存在一些重要的O(1)内存开销,那也没关系。
我意识到我可以使用一些无损压缩算法独立压缩每个字符串,但这不会很好,因为字符串非常短并且每个字符串都不包含太多冗余。但是,整个列表中存在大量冗余。
答案 0 :(得分:0)
我建议一次压缩大约64K的字符串(大约32个字符串),要求你平均只解压缩16个字符串以获得你想要的字符串。而不是1,000,000。使用deflate(gzip使用的压缩方法)将获得几乎相同的压缩。
另一种方法,也是使用deflate,将构建一个32K“字典”,它由2,000,000个字符串中最常见的子字符串组成。然后可以使用从中绘制匹配的32K单独压缩每个字符串。如果你的字符串具有这种共性,那么你可以接近相同的压缩。 (请参阅zlib's deflateSetDictionary()
和inflateSetDictionary()
函数。)