重新排序数据(字符串集)以优化压缩?


12

是否有用于重新排序数据以优化压缩的算法?我了解这是特定于数据和压缩算法的,但是这个话题有没有用呢?在哪里可以找到这方面的研究?

具体来说,我有一个150万个字符串的json列表,我想对这些字符串重新排序,以便优化gzip(用于HTTP)压缩。对字符串进行排序非常好,但是我真的不知道这是否是最佳选择。


1
最佳地重新排序gzip压缩字符串(带有小滑动窗口的LZ77)听起来像是NP难题。您可能会想出最短的常见超弦乐问题的减少项。
朱尼·瑟伦(JouniSirén)2015年

@JouniSirén我认为最长的公共子字符串是一种更好的方法,因为最短的公共超字符串将我限制在背对背的公共部分,对吗?我不介意NP难,只要它很容易处理(就像花一天时间才能在现代机器上运行)。
Jayen 2015年

Answers:


6

这是对Navin Goyal答案的补充。

由于JSON文件可以视为树数据结构,因此可以对树使用XBW变换,这是对字符串进行Burrows-Wheeler变换的扩展。


1
感谢那。我只有一个JSON列表/数组,没有任何JSON对象,因此我看不到如何将其视为一棵树。我可以将字符串转换为特里,但随后我看不到它与XBW转换之间的关系。
Jayen 2015年


1

为了改善gzip压缩,您希望“相似”字符串在列表中关闭。有很多方法可以定义这种相似性。让我描述一个在实践中行之有效的合理方法。回想一下,gzip的块大小为64K。因此,您的数据将被分成64K字节的块,并且每个块将被独立压缩。为了优化压缩,需要最小化每个块中不同的k-mers(大小为k的子串)的数量。其动机是所有这些子字符串将被一个标识符替换。

尽管上述问题在理论上很难解决(它是超图分区的一种变体),但存在快速实用的算法。我建议使用类似LSH的群集,只需对数据进行一次传递即可实现。请注意,(按字母顺序)排序是将相似字符串“聚类”在一起的另一种方法。但是,专用的聚类算法可以执行得更好。

一种替代方法是使用zstd,它更快(i),(ii)获得更高的压缩率,并且(iii)对块大小没有限制(因此,无论输入顺序如何,都可以很好地压缩字符串)。


0

我前段时间看到了一个可能有用的算法。它使用编辑距离算法来计算每个单词之间的距离。因此,它建立了一个图形,每个边缘权重就是这个距离。最后,它得到一个选择权重总和最低的路径的命令。也许可以改善gzip。


听起来很难讲,但如果有人尝试过,请在结果中发表评论
Jayen

我会尝试测试。我对这个问题很好奇。除此之外,您为什么认为它不好处理?
拉斐尔·里贝罗

据我所知,编辑距离是O(nm),其中n和m是这对字符串中字母的数目,您必须对每对字符串O(s ^ 2)都这样做,所以如果n = m,这是O(s ^ 2 * n ^ 2),对于150万个字符串来说,这听起来对我来说很棘手。
Jayen

哦,我不太担心复杂性,因为我认为您的问题只是减小二进制大小。因此,这种操作会更频繁地发生,对吧?
拉斐尔·里贝罗

我在这里搜索,也许可以使用levenshtein自动机来降低editdistance的成本
Rafael Ribeiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.