关于C#:多个串联字符串的同步模式匹配算法

 2021-04-26 

Synchronous pattern matching algorithm for multiple concatenated strings

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

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

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

我尝试使用Rabin Karp之类的著名模式匹配算法,方法是浏览整个列表,并只考虑当前浏览的源,然后对所有源进行此操作,但是性能确实很差,甚至比天真还差(但同步)解决方案。

您是否知道哪种算法在那种情况下可能更有效? (让我使用我正在浏览的每个字符,即使这意味着将该源的实际"搜索状态"存储在某个地方,就像我们为朴素的实现所做的一样)。

P.S:ID是有限的(从1到128),但是字符数最多可以达到10a?·

编辑:以下是一些有望澄清的细节。

我的班级

IntlFinder可以通过方法Add(char* pszData, int nSource)接收字符(或字符数组);因此,每个字符都带有一个源ID。该对(字符,源)存储在StringList ComList中(按其添加的时间顺序)。

要在我的类上使用该模式,必须在THE SAME SOURCE中使用该模式。

示例:

如果我正在寻找图案SAYKOUK

(S,1); (A,1); (Y,1); (K,1); (Z,2); (S,3); (O,1); (U,1); (K,1)
可以!

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

这很麻烦,因为如果我仅考虑一个来源(范围从1到128),并且每次都浏览整个列表,那么我的模式搜索方法的确非常慢。而且,我无法使用这些算法中的任何一种来考虑不同来源的特征,并且无论何时遇到任何一种模式,我都知道!


我最终使用了链接列表,该列表具有经典的" next"和" previous"指针,还有" nextSource"和" previousSource",它们指向同一来源的字符。这样,我便能够使用经典的模式匹配算法。


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