也许有什么办法可以将小字符串(86个字符串)压缩成更小的字符串?
@a@1\s\215\c\6\-0.55955,-0.766462,0.315342\s\1\x\-3421.-4006,3519.-4994,3847.1744,sbs
我看到的唯一方法是替换唯一字符上的重复字符。 但我在谷歌找不到相关的东西。 谢谢你的回复。
答案 0 :(得分:2)
http://en.wikipedia.org/wiki/Huffman_coding 霍夫曼编码可能是一个很好的开始。通常,我们的想法是用复制原始字符串或数据集所需的最小位模式替换单个字符。
您需要对各种“小字符串”进行统计分析,以找到最常见的字符,以便使用最小的唯一位模式表示更常见的字符。并且可能构成一个“示例”小字符串,其中包含需要表示的每个字符(如a-z0-9 @ .0 - )
答案 1 :(得分:1)
我接受了85字节的示例字符串(不是83字节,因为它是从帖子中逐字复制的,可能是某些预期的转义未处理)。我使用原始deflate压缩它,即没有zlib或gzip头和预告片,它压缩到69字节。这主要是通过霍夫曼编码完成的,但也有四个三字节后向字符串引用。
压缩此类内容的最佳方法是使用您了解的有关数据的所有内容。似乎有一些结构,其中有数字编码。您可以开发更短的预期数据的表示。您可以将其编码为位流,并且第一位可以指示在您获得的数据不是预期的情况下,后面的内容是直字节。
另一种方法是利用以前的消息。如果此消息是消息流之一,并且它们看起来彼此相似,那么您可以创建先前消息的字典以用作压缩的基础,可以通过之前收到的消息在另一端重建。如果它们的消息真的相似,那么这可以提供显着改进的压缩。
答案 2 :(得分:0)
你应该查找RUN-LENGTH ENCODING.
这是一个演示
rrrrrunnnnnn BECOMES 5r1u6n WHAT? truncate repetitions: for x consecutive r use xr
现在如果某些字符是数字怎么办?然后使用ASCII值为x的字符,而不是使用x。例如,
如果你有43个连续的P,写+P
因为'+'有ASCII代码43.如果连续49个y,写1y
因为'1'有ASCII代码49。
现在,您将找到所有压缩算法的catch,如果您有一个很少或没有重复的字符串。那么在这种情况下,您的代码可能比原始单词更长。但对所有压缩算法都是如此。
注:
我不鼓励使用霍夫曼编码,因为即使你使用Ziv-Lempel实现,要做到正确仍然需要做很多工作。