【问题标题】:Python Compression Run Length encodingPython 压缩运行长度编码
【发布时间】:2012-10-10 10:06:16
【问题描述】:

我正在尝试了解运行长度编码,但我在网上发现了这个我做不到的挑战。它要求您编写一个名为 compression(strg) 的压缩函数,它将长度为 64 的二进制字符串 strg 作为输入,并返回另一个二进制字符串作为输出。输出二进制字符串应该是输入字符串的游程编码。

压缩('1010101001010101101010100101010110101010010101011010101001010101')

'1010101001010101*4'

这是我所拥有的,但这找不到模式:

from itertools import *

def compression(strg):
    return [(len(list(group)),name) for name, group in groupby(strg)]

我需要一些帮助来解决这个问题。

【问题讨论】:

  • 游程编码查找固定大小块的重复。我猜你需要在这里检测 16 位块的运行。这应该是问题规范的一部分。

标签: python image compression run-length-encoding


【解决方案1】:

我相信您将 RLE 与 Lempel/Ziv 滑动窗口压缩混为一谈。

RLE 严格处理重复字符:WWWWWWWW => W8

LZ 有一个滑动窗口,可以拾取您描述的模式。

David MacKay 的 site 有 Python 中的示例压缩代码,包括 LZ

【讨论】:

    【解决方案2】:

    这是longest repeated substring problem 的示例。它经典地用suffix tree 数据结构解决。

    对于 字符串,您可以使用正则表达式的形式:

    import re
    
    s1='1010101001010101101010100101010110101010010101011010101001010101'
    
    i=2
    l=s1
    j=len(l)/2
    while i<len(s1):
        m=re.search('^(.{'+str(j)+'})\\1$',l)
        if m:
            l=m.group(1)
            i,j=i+1,len(l)/2
            continue
        else:
            print '{0} * {1} = {2}'.format(l,i,s1)
            break
    

    打印您的输出。请注意,这只适用于从中间完全对称的字符串——这类问题的一小部分。要压缩其他类型的字符串,您需要一个表示语法来说明如何替换被替换的元素。

    【讨论】:

      【解决方案3】:

      这个问题的答案和详细解释在下面的链接中给出:

      Image compression by def compress(S) function using run-length codig

      希望它能帮助您理解字符串的行程编码和二进制压缩。此编码无需导入任何 re 和 itertools 即可完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多