是否有用于重新排序数据以优化压缩的算法?我了解这是特定于数据和压缩算法的,但是这个话题有没有用呢?在哪里可以找到这方面的研究?
具体来说,我有一个150万个字符串的json列表,我想对这些字符串重新排序,以便优化gzip(用于HTTP)压缩。对字符串进行排序非常好,但是我真的不知道这是否是最佳选择。
是否有用于重新排序数据以优化压缩的算法?我了解这是特定于数据和压缩算法的,但是这个话题有没有用呢?在哪里可以找到这方面的研究?
具体来说,我有一个150万个字符串的json列表,我想对这些字符串重新排序,以便优化gzip(用于HTTP)压缩。对字符串进行排序非常好,但是我真的不知道这是否是最佳选择。
Answers:
这是对Navin Goyal答案的补充。
由于JSON文件可以视为树数据结构,因此可以对树使用XBW变换,这是对字符串进行Burrows-Wheeler变换的扩展。
Burrows--Wheeler变换是一种众所周知的压缩算法,它通过对要压缩的字符串中的字符重新排序来工作。
为了改善gzip压缩,您希望“相似”字符串在列表中关闭。有很多方法可以定义这种相似性。让我描述一个在实践中行之有效的合理方法。回想一下,gzip的块大小为64K。因此,您的数据将被分成64K字节的块,并且每个块将被独立压缩。为了优化压缩,需要最小化每个块中不同的k-mers(大小为k的子串)的数量。其动机是所有这些子字符串将被一个标识符替换。
尽管上述问题在理论上很难解决(它是超图分区的一种变体),但存在快速实用的算法。我建议使用类似LSH的群集,只需对数据进行一次传递即可实现。请注意,(按字母顺序)排序是将相似字符串“聚类”在一起的另一种方法。但是,专用的聚类算法可以执行得更好。
一种替代方法是使用zstd,它更快(i),(ii)获得更高的压缩率,并且(iii)对块大小没有限制(因此,无论输入顺序如何,都可以很好地压缩字符串)。
我前段时间看到了一个可能有用的算法。它使用编辑距离算法来计算每个单词之间的距离。因此,它建立了一个图形,每个边缘权重就是这个距离。最后,它得到一个选择权重总和最低的路径的命令。也许可以改善gzip。