对于类主题,我必须实现一个类,该类在按时间顺序接收的一组字符中查找模式。类接收的每个字符都有一个特定的源(一个由int ID标识的planete)。
我们必须自己实现数据结构,因此我实现了一个字符串列表,我按时间顺序存储所有这些字符。
问题是必须匹配来自同一个planete(source)的字符的模式,因此必须在每个源上进行模式匹配。
我尝试使用着名的模式匹配算法,如Rabin Karp浏览整个列表,只考虑当前浏览的来源,然后对所有来源做这个,但表现真的很蹩脚,甚至比天真更糟糕(但同步)解决方案。
您是否知道在这种情况下哪种算法更有效? (让我使用我浏览的每个角色,即使这意味着在某个地方存储该源的实际"搜索状态,就像我们为天真的实现所做的那样)
P.S:ID是有限的(从1到128)但是字符数可以达到10⁷
编辑:以下是一些有助于澄清事情的细节。
我的类 IntlFinder
可以通过方法Add(char* pszData, int nSource)
接收字符(或字符数组);因此,每个字符都与源ID相关联。对(字符,源)存储在StringList ComList
中(按其添加的时间顺序排列)。
对于我班级中出现的模式,它必须出现在同一个来源中。
示例:
如果我正在寻找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)并且每次浏览整个列表,我的模式搜索方法真的慢。我无法使用这些算法来管理不同来源的角色,并且每当我遇到任何一个模式时都知道!
答案 0 :(得分:0)
解决方案是为每个源存储单独的字符列表,然后分别在这些列表中查找模式。
答案 1 :(得分:0)
我最终使用带有经典“next”和“previous”指针的链表,还指出了指向同一源字符的“nextSource”和“previousSource”。这样,我就可以使用经典的模式匹配算法。