Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compression 试图找出一个基本的模式查找算法_Compression_Design Patterns - Fatal编程技术网

Compression 试图找出一个基本的模式查找算法

Compression 试图找出一个基本的模式查找算法,compression,design-patterns,Compression,Design Patterns,长话短说,我有一些数据需要找出其中的模式。数据是这样的(每个字符代表一个不可变的块):dabababadacdadab 我希望能够将这些数据分为以下几类块: d(重复1x) ab(重复3次) a(1x) cda(3倍) b(1x) 我熟悉基本的游程长度编码,但当“thing”的长度可能是可变的(在我的示例中,cda是3个数据块,但d是一个数据块)时,我真的不知道如何做。我说得通吗?非常感谢您的帮助。这里的主要困难是算法的“贪婪性”及其可能产生的歧义。举个例子,告诉程序不要将字符串表示为: dx1

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

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

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


我熟悉基本的游程长度编码,但当“thing”的长度可能是可变的(在我的示例中,cda是3个数据块,但d是一个数据块)时,我真的不知道如何做。我说得通吗?非常感谢您的帮助。

这里的主要困难是算法的“贪婪性”及其可能产生的歧义。举个例子,告诉程序不要将字符串表示为:

dx1
ababab X 1这里的主要困难是算法的“贪婪性”及其可能产生的歧义。举个例子,告诉程序不要将字符串表示为:

dx1 ababab X 1 cda X 1 b X 1

更糟糕的是: dx1 abababcdab X 1

你明白我的意思了。因此,您需要建立一组algo将遵循的规则,然后代码将自行编写。为了深入了解这一点,您可以尝试查看grep.c中的一些正则表达式解析代码,尽管这可能比您需要的更高级

作为一个开始,考虑一个算法:

  • 限制它将扫描的前方距离(即设置最大子字符串长度)
  • 偏好较长的子字符串,以#1为准
  • 例如,以“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 它可以是以下任何一种:

    a X 16

    aa X 8

    aaaa X 4

    AAAAA X 2

    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa X 1

    如果将最大匹配长度设置为4,并选择最长的匹配,则答案是明确的:aaaa X 4。现在您可以编写一个算法了

    顺便说一句,对LZW(Lempel-Ziv-Welch)算法的评论是正确的;这就是algo所做的,尽管它在扫描时会动态地构建一个字典,并尝试用早期的项目来表达后期的项目。例如:

    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

    =bbbbbb(其中b=aa)

    =cccc(其中c=bb)

    =dd(其中d=cc)

    =e(其中e=dd)

    这并不完全是LZW的工作原理,但你明白了