【问题标题】:Compressing string with repeating chars使用重复字符压缩字符串
【发布时间】:2015-02-14 19:46:26
【问题描述】:

我的字符串只包含“U”、“D”、“L”、“R”字符(迷宫中的方向)。

字符串可能如下所示:

  • RRRRDRRDDDRRUUUUDDRRRRUULLU
  • DDLDDLDDLDDLDDLDDLDDLDDLDDLDDL
  • LUUURRRDRRDLUUURRDRRD

我想压缩这个指令序列。

例如。

1。 压缩前:ULULUL 压缩后:3(UL)

2。 压缩前:DDLDDLDDLDDLDDLDDLDDLDDLDDLDDL 压缩后:10(DDL)

3。 压缩前:LLLLDLLLLDLLLLD 压缩后:3(4LD)

有人知道这样的算法吗?

谢谢。

【问题讨论】:

  • 数据压缩是建模(区分可能与不可能)和编码(认为已解决)。编码重复序列与 A. Lempel 和 J. Ziv 的名字有关。尤其是你的#3 让我想起了“压缩指针宏(?方法?)”——依稀记得在 OPM(/L)、EPM 的上下文中阅读过它……在“单词组合算法(Apostolico,A.;Galil)中, Z. (Eds.))" (978-3-642-82456-2) - 已经十年或三年了。

标签: c++ string algorithm compression


【解决方案1】:

不,不要使用游程编码,结果会很糟糕。

改为进行位打包:将四个方向中的每一个编码为 2 位,然后将四个 2 位对打包成一个字节。

所以:U = 00b (0d)、D = 01b (1d)、L = 10b (2d)、R = 11b (3d)。

(注:'b'后缀表示二进制,'d'后缀表示十进制。)

因此,LLLL = 10101010b 只有 1 个字节长。

编辑

从 OP 的评论中可以看出,压缩的结果需要是一个仅由可打印字符组成的字符串。那么,我会说 OP 需要的算法称为Huffman Coding (wikipedia)。我不知道任何产生可打印文本的实现,(因为大多数人会发现这样的事情会完全破坏压缩的目的),但理论上可以以这样的方式实现算法,即输出将是可打印的字符.无论如何,OP正在询问是否有人知道这样的算法,所以,就是这样。

【讨论】:

  • 结果的质量完全取决于输入。 IE。 1000L比1010...10短很多。
  • @Mike Nakis,我需要压缩后的字符串结果,而不是二进制。
  • 好吧,你应该在你的问题中清楚地说明这一点。由于字节序列 is 是一个字符串,因此您应该进一步指定您希望它是一个仅由可打印字符组成的字符串。
  • 而且,我修改了我的答案。
  • 我想这样做是为了锻炼。谢谢你。感谢您的帮助。
【解决方案2】:

我创建并发布了一个解决方案,该解决方案使用 Python 正则表达式引擎提取重复字符块here

它不会在所有情况下给出最短的答案,但很接近。

这个想法是逐步完成与这个正则表达式的非重叠匹配:

(?P<repeat>(?P<chars>.+?)(?:(?P=chars))+)

【讨论】:

  • 不幸的是我不能使用正则表达式,我应该用原生 C++ 代码编写它。
  • @user3216905:C++ 具有正则表达式功能:cplusplus.com/reference/regex?
【解决方案3】:

是的,您正在寻找的是经典的run-length-encoding(比只需要重复单个字符的简单方法更复杂一些)。

【讨论】:

  • 不幸的是,游程编码所描述的简单方法。魔鬼在于寻找/选择重复多次的子串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多