Synchronous pattern matching algorithm for multiple concatenated strings
对于一个类主题,我必须实现一个类,以该类按时间顺序接收的一组字符中查找模式。类收到的每个字符都有一个特定的来源(一个行星,由一个int ID标识)。
我们必须自己实现数据结构,因此我实现了一个字符串列表,在其中按时间顺序存储所有这些字符。
问题在于必须对来自相同行星(来源)的字符匹配模式,因此必须在每个来源上进行模式匹配。
我尝试使用Rabin Karp之类的著名模式匹配算法,方法是浏览整个列表,并只考虑当前浏览的源,然后对所有源进行此操作,但是性能确实很差,甚至比天真还差(但同步)解决方案。
您是否知道哪种算法在那种情况下可能更有效? (让我使用我正在浏览的每个字符,即使这意味着将该源的实际"搜索状态"存储在某个地方,就像我们为朴素的实现所做的一样)。
P.S:ID是有限的(从1到128),但是字符数最多可以达到10a?·
编辑:以下是一些有望澄清的细节。
我的班级
要在我的类上使用该模式,必须在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",它们指向同一来源的字符。这样,我便能够使用经典的模式匹配算法。
解决方案是为每个源存储一个单独的字符列表,然后在这些列表中分别找到模式。