String 关于如何排列字符串列表以提高压缩性能的建议?

String 关于如何排列字符串列表以提高压缩性能的建议?,string,sorting,compression,heuristics,String,Sorting,Compression,Heuristics,假设您有一组庞大的字符串: {'Ape','Bed','Car','Desk','Edge',...} 您必须将集合写入一个文件。但是字符串的显示顺序是任意的(您只需要存储/检索集合) 由于集合可能很大,您需要压缩它,例如使用gzip。我对如何对集合进行排序以优化压缩率感兴趣。按字母顺序排序看起来像是一个有价值的候选项,因为它意味着如果gzip压缩一个“帧”,它将看到许多以相同子字符串开头的字符串:例如,在开始时,它可以将AAA编码得更短,而最后ZZY可能编码得更短 我已经通过排序字符串运行了

假设您有一组庞大的字符串:

{'Ape','Bed','Car','Desk','Edge',...}
您必须将集合写入一个文件。但是字符串的显示顺序是任意的(您只需要存储/检索集合)

由于集合可能很大,您需要压缩它,例如使用
gzip
。我对如何对集合进行排序以优化压缩率感兴趣。按字母顺序排序看起来像是一个有价值的候选项,因为它意味着如果
gzip
压缩一个“帧”,它将看到许多以相同子字符串开头的字符串:例如,在开始时,它可以将
AAA
编码得更短,而最后
ZZY
可能编码得更短

我已经通过排序字符串运行了一些测试。例如,测试集
字符串
(92 274个字符串)生成:

-rw-rw-r-- 1 willem willem 296K Jan 19 18:52 strings_norm.gz
-rw-rw-r-- 1 willem willem 419K Jan 19 18:52 strings_shuf.gz

-rw-rw-r-- 1 willem willem 241K Jan 19 19:00 strings_norm.7z
-rw-rw-r-- 1 willem willem 374K Jan 19 19:01 strings_shuf.7z
其中,
\u norm
是排序列表,
\u shuf
是它的无序对应项。字符串最初仅使用utf-8编码,并在单词之间添加新行。更容易访问的测试集可能是您在大多数Linux发行版上找到的美国词典(可能位于
/usr/share/dict/American english
;99 171个单词):

这些是通过以下方式生成的:

sort /usr/share/dict/american-english | gzip > american_norm.gz
shuf /usr/share/dict/american-english | gzip > american_shuf.gz
sort /usr/share/dict/american-english | 7z a american_norm.7z -si
shuf /usr/share/dict/american-english | 7z a american_shuf.7z -si
如您所见,我们使用
gzip
获得额外的29%-43%,使用
7z
获得额外的35%-40%。第一点是,通过对两种压缩算法进行排序,可以得出这样的假设:虽然压缩率会有所不同,但可以说存在“好”顺序和“坏”顺序:几乎所有压缩算法都比其他顺序获得更好的压缩率。当然,“洗牌”数据集的性能可能会更好,但可能性可能没有那么高。我想知道是否还有更先进的方法。毕竟,通过对字符串进行排序可能会以相同的子字符串开始,但另一种排序方法可能会发现有一个大的公共子字符串的字符串,如
apple
apples
dapple
菠萝
,等等


这个问题可能像最有趣的问题一样是NP难的,但我想知道,如果字符串的顺序无关紧要,我们是否可以使用一些启发式方法来优化字符串压缩。

也许按频率排序la Huffman树可以改进压缩<代码>狗狗狗狗斑点暗淡猫车Zeta Alpha
sort /usr/share/dict/american-english | gzip > american_norm.gz
shuf /usr/share/dict/american-english | gzip > american_shuf.gz
sort /usr/share/dict/american-english | 7z a american_norm.7z -si
shuf /usr/share/dict/american-english | 7z a american_shuf.7z -si