用于符号序列的C ++和RLE

时间:2011-10-09 17:07:29

标签: c++ run-length-encoding

我在如何在符号序列上使用RLE时遇到了困难。

例如,我可以对像

这样的字符串进行RLE编码
"ASSSAAAEERRRRRRRR" 

将转换为:

"A1S3A3E2R8".

但是我想对像

这样的字符串执行RLE
"XXXYYYYY(1ADEFC)(EDCADD)(1ADEFC)(1ADEFC)(1ADEFC)"

将转换为:

"X3Y5(1ADEFC)1(EDCADD)1(1ADEFC)3"

有没有办法达到它?这项工作变得有点简单,因为长字符串总是在括号中。可以在C ++中提出建议吗?
如果有更好的方法来存储值而不是使用括号,那么如果你推荐我也会很棒。

2 个答案:

答案 0 :(得分:4)

您应该将此问题分解为更小的部分。首先,您应该有一个标记您的流并返回每个单独部分的函数。对于此示例输入流:

"XXXYYYYY(1ADEFC)(EDCADD)(1ADEFC)(1ADEFC)(1ADEFC)"

此函数将返回以下元素,每次调用一个:

X
X
X
Y
Y
Y
Y
Y
(1ADEFC)
(EDCADD)
(1ADEFC)
(1ADEFC)
(1ADEFC)
<eof>

如果你正确实现了这个功能,那么你已经为单个字符实现的RLE算法应该很容易适应以支持更长的字符串。

答案 1 :(得分:0)

既然你提到你的意图是将RLE编码数据以便以后使用gzip压缩并实现更好的压缩,我的答案就是不要先编码它。 gzip压缩使用DEFLATE,这是一种可以利用字符串运行的游程编码的概括。对于同样的算法应用两次,你将无法获得更好的压缩效果,实际上你甚至可能会稍微松开压缩。

如果您坚持执行自己的RLE,那么最好存储设定的长度而不是使用括号。也就是说,而不是(1ADEFC)3使用61ADEFC3。另请注意,您打算压缩使用全范围字节值的像素。请记住这一点,因为编写为使用字符串的算法不适用于包含嵌入空值和不可打印字符的原始数据。