试图找出一种基本的模式发现算法

时间:2011-07-20 20:58:01

标签: compression design-patterns

长话短说,我有一些数据需要查找模式。数据是这样的(每个字符代表一个不可变的块):dabababacdacdacdab

我希望能够将这些数据分解为以下几种块:

d(重复1次) ab(重复3次) a(1x) cda(3x) b(1x)

我熟悉基本的游程长度编码,但是当“事物”的长度可能变化时,我真的不知道怎么做(在我的例子中,cda是3块数据,但是d是一块)。我有意义吗?感谢您的帮助。

2 个答案:

答案 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中的一些正则表达式解析代码,尽管这可能比您需要的更高级。

首先,请考虑以下算法:

  1. 限制扫描前方的距离(即设置最大子字符串长度)
  2. 支持更长的子串,受#1
  3. 的限制

    例如,取“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的工作原理,但你明白了。