多个连接字符串的同步模式匹配算法

Posted

技术标签:

【中文标题】多个连接字符串的同步模式匹配算法【英文标题】:Synchronous pattern matching algorithm for multiple concatenated strings 【发布时间】:2012-10-09 08:06:29 【问题描述】:

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

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

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

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

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

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

编辑:以下是一些希望能澄清事情的细节。

IntlFinder,我的班级,可以通过Add(char* pszData, int nSource)方法接收字符(或字符数组);因此,每个字符都与一个源 ID 相结合。对 (character, source) 存储在 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)并每次浏览整个列表,我的模式搜索方法真的很慢。而且我无法使用这些算法中的任何一个来考虑不同来源的特征并且知道我何时遇到我的模式!

【问题讨论】:

到目前为止,我看不出这与单独匹配每个字符串有何不同。你能详细说明一下吗? 你能举个例子来说明你的意图吗?只是,显然有简短的演示字符串? 您能否通过一些示例或粘贴代码 sn-ps 更详细地说明问题。 【参考方案1】:

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

【讨论】:

问题是我需要知道模式的第一个字符在我的列表中的位置......而且我不想将字符位置存储在索引已经代表位置的列表中. (+我忘了说,但我并不总是从0开始搜索。我可以从另一个索引开始) 今天,您将源索引存储在列表中。相反,您可以存储一个单独的数组来跟踪哪个源索引对应于哪个流索引。如果索引的数据类型相同,则不应使用更​​多内存。 @halflings 听起来您可以使用此解决方案并在适用列表中使用众所周知的模式匹配算法。 问题是我需要跟踪每个字符的接收时间顺序。我最终使用了一个包含另一种类型指针的链表:指向同一源的下一个字符的指针;通过使用它,我能够使用传统的模式匹配算法。我现在会添加这个答案。谢谢!【参考方案2】:

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

【讨论】:

以上是关于多个连接字符串的同步模式匹配算法的主要内容,如果未能解决你的问题,请参考以下文章

字符串匹配算法的使用(未完待整理)

将 INDEX/MATCH 与多个条件和多个匹配项连接起来

算法基础 - 朴素模式匹配算法、KMP模式匹配算法

数据结构—串KMP模式匹配算法

模式匹配的概念

串的定义及朴素的模式匹配算法