长话短说,我有一些数据需要查找模式。数据是这样的(每个字符代表一个不可变的块):dabababacdacdacdab
我希望能够将这些数据分解为以下几种块:
d(重复1次) ab(重复3次) a(1x) cda(3x) b(1x)
我熟悉基本的游程长度编码,但是当“事物”的长度可能变化时,我真的不知道怎么做(在我的例子中,cda是3块数据,但是d是一块)。我有意义吗?感谢您的帮助。
答案 0 :(得分:1)
这里的主要困难是算法的“贪婪”和它可以产生的模糊性。根据您的示例,告诉程序不将字符串表示为:
的规则是什么d X 1 ababab X 1<<<<<< -----这是问题所在 cda X 1 b X 1
或更糟糕的是: d X 1 abababcdab X 1
你明白我的意思。因此,您需要建立算法将遵循的一组规则,然后代码将自己编写。要深入了解这一点,您可以尝试查看grep.c中的一些正则表达式解析代码,尽管这可能比您需要的更高级。
首先,考虑以下算法: 1.限制它将扫描多远(即设置最大子串长度) 2.更喜欢较长的子串,符合#1
例如,取“aaaaaaaaaaaaaaa”(16 a)。它可能是: 一个X 16 aa X 8 aaaa X 4 aaaaaaaa X 2 aaaaaaaaaaaaaaaa X 1
如果您将最大匹配长度设置为4并支持最长匹配,则答案是明确的:aaaa X 4.现在您可以编写算法。
答案 1 :(得分:0)
这里的主要困难是算法的“贪婪”和它可以产生的模糊性。根据您的示例,告诉程序不将字符串表示为:
的规则是什么d X 1 ababab X 1 cda X 1 b X 1
或更糟糕的是: d X 1 abababcdab X 1
你明白我的意思。因此,您需要建立算法将遵循的一组规则,然后代码将自己编写。要深入了解这一点,您可以尝试查看grep.c中的一些正则表达式解析代码,尽管这可能比您需要的更高级。
首先,请考虑以下算法:
例如,取“aaaaaaaaaaaaaaaa”(16 a)。
它可以是以下任何一种:
a X 16
aa X 8
aaaa X 4
aaaaaaaa X 2
aaaaaaaaaaaaaaaa X 1
如果您将最大匹配长度设置为4并支持最长匹配,则答案是明确的:aaaa X 4.现在您可以编写算法。
BTW对LZW(Lempel-Ziv-Welch)的评论是正确的;这就是算法的作用,虽然它在扫描时动态地构建了一个字典,并试图用先前的字母来表达后面的项目。例如:aaaaaaaaaaaaaaaa(其中16个)
= bbbbbbbb(其中b = aa)
= cccc(其中c = bb)
= dd(其中d = cc)
= e(其中e = dd)
这不是LZW的工作原理,但你明白了。