3

对于一个类主题,我必须实现一个类,该类在该类按时间顺序接收的一组字符中查找模式。该类接收的每个字符都有一个特定的来源(一个行星,由一个 int ID 标识)。

我们必须自己实现数据结构,所以我实现了一个字符串列表,在其中按时间顺序存储所有这些字符。

问题是模式必须与来自同一行星(源)的字符匹配,因此必须在每个源上进行模式匹配。

我尝试使用像 Rabin Karp 这样著名的模式匹配算法,通过浏览整个列表并只考虑当前浏览的源,然后对所有源都这样做,但是性能真的很差劲,甚至比天真(但同步) 解决方案。

您对在这种情况下哪种算法更有效有任何想法吗?(让我使用我正在浏览的每个字符,即使这意味着在某处存储该源的实际“搜索状态”,就像我们为天真的实现所做的那样)

PS:ID 是有限的(从 1 到 128),但字符数最多可以达到 10⁷</p>

编辑:这里有一些细节有望澄清事情。

IntlFinder,我的班级,可以通过方法接收字符(或字符数组)Add(char* pszData, int nSource);因此,每个字符都与一个源 ID 相结合。对 (character, source) 存储在 StringListComList中(按添加的时间顺序)。

要使该模式出现在我的课堂上,它必须出现在 THE SAME SOURCE 中。

例子:

如果我正在寻找模式 SAYKOUK

( S , 1); (, 1); ( Y , 1); ( K , 1); (Z, 2); (S, 3); ( O , 1); ( U , 1); ( K , 1) 没问题!

( S , 1); (, 1); ( Y , 1); (K, 2); (O, 3); (U, 1); (K, 4) 不行。

这是有问题的,因为如果我只考虑一个来源(范围从 1 到 128)并每次浏览整个列表,我的模式搜索方法真的很慢。而且我无法使用这些算法中的任何一个来考虑不同来源的特征,并且知道何时我遇到了我的模式!

4

2 回答 2

0

解决方案是为每个源存储一个单独的字符列表,然后分别在这些列表中查找模式。

于 2012-10-09T14:06:56.787 回答
0

我最终使用了带有经典“下一个”和“上一个”指针的链表,以及指向同一源字符的“下一个源”和“上一个源”。这样,我就能够使用经典的模式匹配算法。

于 2013-01-11T07:44:04.317 回答