【问题标题】:Run length encoding of arbitrary length substrings任意长度子串的运行长度编码
【发布时间】: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 这样的输入可以给我们2abbaabbabba1b2abba2b1a2abba2b1a1b 取决于子字符串的长度。我认为你应该更具体。

标签: python c algorithm encoding


【解决方案1】:

任何可以找到一定长度的重复子串的算法都可以用来实现具有该长度的滑动窗口的 Lempel-Ziv 压缩。

所以我会研究 Lempel-Ziv 编码器并使用它。甚至更好:放弃运行长度编码并实现 Lempel-Ziv - 它只能提供更好的压缩。

【讨论】:

  • 以前从未听说过Lempel–Ziv。我会调查的。谢谢。
  • @Jongware 我的主要答案是您可以查看 Lempel-Ziv 的子序列查找部分来解决他的问题中的问题。完全使用 LZ 的建议只是事后的想法。
  • 对不起 :P 你的意思是wikipedia.org/wiki/LZ77#LZ77?里面有一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多