【发布时间】:2015-07-28 07:37:50
【问题描述】:
对于任意但有限长度的输入流,什么是有效的(就时间复杂度而言)run length encoding 算法。长度为 1 的子串的算法可以在 C 中实现为:
void encoding(char *bytes)
{
int c = 0;
char *s = bytes, ch;
while(*s) {
c=1;
ch=*s;
while(*s && *s== *(s+1)) {
c++;
s++;
}
printf("%d%c", c, ch);
s++;
}
}
但是,我正在寻找一种更好的算法,可以对任意长度的子字符串进行编码。例如,对于输入 "abbabb",上面的代码将打印:"1a2b1a2b"。但更好的算法可以将其编码为"2abb"。
实现语言(C/Python 是我的选择)不是问题,因为我正在寻找一种算法。
【问题讨论】:
-
在没有限制的情况下,“更好”算法总是会向前看至少正好一半的字符串加一,在最坏的情况下,会向前看整个字符串的长度。 (...此时它可能以 50% 的压缩率结束,这一点也不差。)
-
啊!这表明了一种蛮力“最贪婪”的算法:给定输入长度 n,将 n/2 与后面的内容进行比较,然后比较 n/3 i>,依此类推,直到比较长度达到 1。
-
我不确定这是否那么简单(比较 n/2、n/3 等)。因为子字符串可以在任何地方开始和结束。例如,
abcdabcdaaaa可以编码为2abcd4a,问题是如何在不多次扫描输入的情况下选择abcd作为子字符串。 -
你是对的。 n/2 是精确匹配
abcabc的上限,但 n/3 仅对ababab有效(有用)。所以从 n/2 开始,然后向下移动 1 个元素...这将返回2abcd2aa。嗯。 -
使用这个逻辑,
abbaabbabbaabbaabbabbab这样的输入可以给我们2abbaabbabba1b和2abba2b1a2abba2b1a1b取决于子字符串的长度。我认为你应该更具体。
标签: python c algorithm encoding