说,我有很多字符串非常相似但不完全相同。
它们或多或少会有所不同,但肉眼可以看出相似性。
所有长度相等,每个长度为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的字符串,这些字符串都是不同的,同时都是相同的。
我们的任务是尽可能地压缩整串字符串。
我怀疑这是有一种方法来利用这种相似性和字符串的共同长度,而霍夫曼,例如不要明确地使用它。
答案 0 :(得分:1)
你能告诉我们什么是数据吗?也许像DNA序列?喜欢
AGCTGTGCGAGAGAGAGCGGTGGG ......
GGCTGTGCGAGCGAGAGCGGTGGG ......
CGCTGTGAGAGNGAGAGCGGTGGG ......
NGCTGTGCGAGAGAGAGCGGTGGG ......
GGCTGTGCGAGTGAGAGCGGTGGG ......
......
? 也许或不。无论如何,这里有两种或两种思考方式:
霍夫曼编码:ref。维基百科自己
Stringology:ref。 http://books.google.com.hk/books/about/Jewels_of_stringology.html?id=9NdohJXtIyYC
我认为解决问题很容易,但很难选择最好的方法。您可以使用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选择它。