压缩类似但不相同的字符串列表的最佳方法是什么?

时间:2012-03-11 09:25:13

标签: data-structures compression data-compression

说,我有很多字符串非常相似但不完全相同。

它们或多或少会有所不同,但肉眼可以看出相似性。

所有长度相等,每个长度为256个字节。字符串总数小于2 ^ 16。

这种情况的最佳压缩方法是什么?

更新(数据格式):

我无法分享数据,但我可以将其描述为非常接近现实:

想象一下符号(如LOGO语言),它是某些设备在平面上移动和绘图的命令序列。如:

U12 - move up 12 steps
D64 - move down 64 steps
C78 - change drawing color to 78
P1  - pen down (start drawing)

等等。

这种语言的整个词汇量不超过英文字母的大小。

然后该字符串描述了整个图片:“U12C6P1L74D74R74U74P0 ......”。

想象一下,现在有一万名儿童被告知要借助这种语言画出一些非常具体的形象:就像他们国家的旗帜一样。我们将获得10K的字符串,这些字符串都是不同的,同时都是相同的。

我们的任务是尽可能地压缩整串字符串。

我怀疑这是有一种方法来利用这种相似性和字符串的共同长度,而霍夫曼,例如不要明确地使用它。

3 个答案:

答案 0 :(得分:1)

你能告诉我们什么是数据吗?也许像DNA序列?喜欢

  

AGCTGTGCGAGAGAGAGCGGTGGG ......

     

GGCTGTGCGAGCGAGAGCGGTGGG ......

     

CGCTGTGAGAGNGAGAGCGGTGGG ......

     

NGCTGTGCGAGAGAGAGCGGTGGG ......

     

GGCTGTGCGAGTGAGAGCGGTGGG ......

     

......

? 也许或不。无论如何,这里有两种或两种思考方式:

  1. 霍夫曼编码:ref。维基百科自己

  2. Stringology:ref。 http://books.google.com.hk/books/about/Jewels_of_stringology.html?id=9NdohJXtIyYC

  3. 我认为解决问题很容易,但很难选择最好的方法。您可以使用http://en.wikipedia.org/wiki/Data_compression和更多工具设计几种比较方法。

答案 1 :(得分:0)

由于你的固定宽度为256字节且功率为2,我会尝试使用挖掘轮转换或移动到前端算法的大小,或者是该大小的两倍。然后你可以尝试一个霍夫曼代码。也许你可以尝试256字节的希尔伯特曲线,然后是bwt和mft?

答案 2 :(得分:0)

“字符串总数小于2 ^ 16。”这是一个小的,有界的数字,这使你的工作变得非常简单:为什么不保留以前看到的所有字符串的查找表(哈希表)。然后,您可以将每个256字节的行转换为此查找表中的双字节索引。

然后你有一个16位整数序列。这些整数将包含“在笔下降后,下一个命令开始绘制的可能性为90%”之类的模式。如果数据包含这样的模式,PPM是您的选择。 7-zip具有高质量的PPM实现。您可以使用GUI或cmd-line选择它。