【问题标题】:Compress small string压缩小字符串
【发布时间】:2012-04-08 17:10:48
【问题描述】:

也许有什么方法可以将小字符串(86 个字符)压缩成更小的字符串?

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

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

【问题讨论】:

标签: c# string compression


【解决方案1】:

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

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

【讨论】:

  • 霍夫曼编码是这个家伙想要做的事情的杀手。正如您所提到的,他需要知道该技术有意义的相对概率。
  • 这并不完全正确,考虑到仅使用这些字符串所代表的所需且相对较小的字符集,将 ASCII 压缩到更小的位空间,它仍然可以提供非常好的压缩。除非与数据有很强的统计关系,否则它不会是“最佳的”。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    你应该查一下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 实现,仍然需要大量工作才能使其正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 2011-08-18
      • 2015-12-14
      • 2019-10-04
      相关资源
      最近更新 更多