您将如何实现以下问题的解决方案:
给定一串符号和模式,可随时添加,计算每个模式发生的频率。匹配符号流与动态模式
例:
有传入的符号的连续流假设A B A C dé ... 用户可以在任何时间寄存器例如(B A C)一个新模式。如果模式在第二个时间步之前注册,则模式应计为一次。
在重叠模式仅所述第一图案的情况下,应该算作e.g (B A C)和(A C d)将导致仅(B A C)被计数。
解决办法:
琐碎的解决办法是只保留一个位置每格局,推动它时,模式匹配和重置所有位置一旦一个匹配。这将导致运行时O(n * m) 其中n是流的长度,并且m是最长模式的长度(例如,通过在所有模式中具有相同的长度m-1的前缀)。
另一种方法是构造一个有限自动机,并使用模式可以包含前缀的事实。
但是有几个问题与:
如何构建模式之间的边缘? (例如乙dË从A B)
如何在运行时添加图案。例如。假设流是A B并且此刻仅注册了(A B C)的模式。现在用户注册(B A C)。如果流继续A C D E。由于在注册之前发生第一个符号,因此该模式不应匹配。
该想法可以链接到Aho Corasick algorithm。然而,该算法确实匹配所有出现的模式,而不仅仅是第一个。它不允许在运行时添加模式。