对于一个类主题,我必须实现一个类,该类在该类按时间顺序接收的一组字符中查找模式。该类接收的每个字符都有一个特定的来源(一个行星,由一个 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)并每次浏览整个列表,我的模式搜索方法真的很慢。而且我无法使用这些算法中的任何一个来考虑不同来源的特征,并且知道何时我遇到了我的模式!