1

也许有任何方法可以将小字符串(86 个字符)压缩成更小的东西?

@a@1\s\215\c\6\-0.55955,-0.766462,0.315342\s\1\x\-3421.-4006,3519.-4994,3847.1744,sbs

我看到的唯一方法是替换唯一字符上的重复字符。但我在谷歌中找不到关于那个的东西。感谢您的回复。

4

3 回答 3

2

http://en.wikipedia.org/wiki/Huffman_coding 霍夫曼编码可能是一个不错的开始。一般来说,这个想法是用复制原始字符串或数据集所需的最小位模式替换单个字符。

您需要对各种“小字符串”进行统计分析,以找到最常见的字符,以便用最小的唯一位模式表示更常见的字符。并且可能用需要表示的每个字符组成一个“示例”小字符串(如 a-z0-9@.0-)

于 2012-04-08T17:19:50.963 回答
1

我拿了你的 85 个字节的示例字符串(不是 83,因为它是从帖子中逐字复制的,可能没有处理一些预期的转义)。我使用 raw deflate 压缩它,即没有 zlib 或 gzip 头和尾,它被压缩到 69 字节。这主要是通过霍夫曼编码完成的,尽管也有四个三字节的反向字符串引用。

压缩这种东西的最好方法是使用你所知道的关于数据的一切。它似乎有某种结构,并且其中编码了数字。您可以开发更短的预期数据表示。您可以将其编码为比特流,如果您获得的数据不是预期的,则第一位可以指示后面是直接字节。

另一种方法是利用以前的消息。如果此消息是消息流中的一个,并且它们看起来都彼此相似,那么您可以制作一个先前消息的字典作为压缩的基础,可以在另一端通过接收到的先前消息重建. 如果它们的消息确实相似,这可能会显着改善压缩。

于 2012-04-08T22:03:42.770 回答
0

你应该查一下RUN-LENGTH ENCODING.这是一个演示

rrrrrunnnnnn    BECOMES    5r1u6n     WHAT? truncate repetitions: for x consecutive r use xr

现在如果某些字符是数字怎么办?然后不使用 x,而是使用 ASCII 值为 x 的字符。例如,如果你有 43 个连续的 P,那么写+P是因为“+”的 ASCII 码是 43。如果你有 49 个连续的 y,那么写1y是因为“1”的 ASCII 码是 49。

现在,您会在所有压缩算法中发现的问题是,如果您有一个重复很少或没有重复的字符串。那么在这种情况下,您的代码可能比原始单词长。但这适用于所有压缩算法。

笔记:

我不鼓励使用 Huffman 编码,因为即使您使用 Ziv-Lempel 实现,仍然需要大量工作才能使其正确。

于 2012-04-08T17:33:29.937 回答